ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMTNiNWJiNC4uNjY5YWEwMiAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTMgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NzAxMDEgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NzAxMTIgb2YgV2luZSwgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKIGRldmVsb3BlcidzIG9ubHkgcmVsZWFzZS4gIFRoZXJlIGFyZSBtYW55IGJ1Z3MgYW5kIG1hbnkgdW5pbXBsZW1lbnRlZCBBUEkKIGZlYXR1cmVzLiAgTW9zdCBhcHBsaWNhdGlvbnMgc3RpbGwgZG8gbm90IHdvcmsgY29ycmVjdGx5LgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gImp1bGxpYXJkQGxyYy5lcGZsLmNoIi4gIFBsZWFzZSBkb24ndAogZm9yZ2V0IHRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuCiAKLVdIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDEwMTogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCi0JLSBXaW4zMiBoYW5kbGUgbWFuYWdlbWVudCBhbmQgcmVsYXRlZCBzdHVmZi4KLQktIFNldmVyYWwgZmlsZXMgbW92ZWQgYXJvdW5kLCBuZXcgZGlyZWN0b3JpZXMgY3JlYXRlZC4KK1dIQVQnUyBORVcgd2l0aCBXaW5lLTk3MDExMjogKHNlZSBDaGFuZ2VMb2cgZm9yIGRldGFpbHMpCisJLSBCZXR0ZXIgc3VwcG9ydCBmb3Igbm9uLVVTIGtleWJvYXJkcy4KKwktIFN1cHBvcnQgZm9yIFZGQVQgZmlsZXN5c3RlbSBzaG9ydCBuYW1lcy4KKwktIE1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSBidWlsdC1pbiBkZWJ1Z2dlci4KKwktIE1vcmUgV2luMzIgc3R1ZmYuCiAJLSBMb3RzIG9mIGJ1ZyBmaXhlcy4KIAogU2VlIHRoZSBSRUFETUUgZmlsZSBpbiB0aGUgZGlzdHJpYnV0aW9uIGZvciBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgpAQCAtMTYsMTAgKzE4LDEwIEBACiB0aGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgYXQgdGhlIGZ0cCBzaXRlcy4gIFRoZSBzb3VyY2VzIHdpbGwgYmUgYXZhaWxhYmxlCiBmcm9tIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgogCi0gIGZ0cDovL3N1bnNpdGUudW5jLmVkdS9wdWIvTGludXgvQUxQSEEvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDEwMS50YXIuZ3oKLSAgZnRwOi8vdHN4LTExLm1pdC5lZHUvcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMDEudGFyLmd6Ci0gIGZ0cDovL2Z0cC5pbmZvbWFnaWMuY29tL3B1Yi9taXJyb3JzL2xpbnV4L3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMDEudGFyLmd6Ci0gIGZ0cDovL2FyaXMuY29tL3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTAxLnRhci5negorICBmdHA6Ly9zdW5zaXRlLnVuYy5lZHUvcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NzAxMTIudGFyLmd6CisgIGZ0cDovL3RzeC0xMS5taXQuZWR1L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTEyLnRhci5negorICBmdHA6Ly9mdHAuaW5mb21hZ2ljLmNvbS9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTcwMTEyLnRhci5negorICBmdHA6Ly9hcmlzLmNvbS9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk3MDExMi50YXIuZ3oKIAogSXQgc2hvdWxkIGFsc28gYmUgYXZhaWxhYmxlIGZyb20gYW55IHNpdGUgdGhhdCBtaXJyb3JzIHRzeC0xMSBvciBzdW5zaXRlLgogCmRpZmYgLS1naXQgYS9DaGFuZ2VMb2cgYi9DaGFuZ2VMb2cKaW5kZXggZjk4ZjAxZC4uYmYwYzU1ZCAxMDA2NDQKLS0tIGEvQ2hhbmdlTG9nCisrKyBiL0NoYW5nZUxvZwpAQCAtMSw0ICsxLDE1NCBAQAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2F0IEphbiAxMSAxODoxNzo1OSAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlVcGRhdGVkIHRvIG5ldyBXaW4zMiB0eXBlcy4KKworCSogW2NvbnRyb2xzL2xpc3Rib3guY10KKwlGaXhlZCBXaW5maWxlIGV4dGVuZGVkIHNlbGVjdGlvbiBidWcuCisKKwkqIFtmaWxlcy9kaXJlY3RvcnkuY10KKwlDaGFuZ2VkIERJUl9TZWFyY2hQYXRoIHRvIHJldHVybiBib3RoIGxvbmcgYW5kIHNob3J0IGZpbGUgbmFtZXMuCisKKwkqIFtmaWxlcy9kb3NfZnMuY10KKwlJbXBsZW1lbnRlZCBWRkFUIGlvY3RsIHRvIHJldHJpZXZlIHRoZSBvcmlnaW5hbCBzaG9ydCBmaWxlbmFtZXMKKwlmcm9tIGEgVkZBVCBmaWxlc3lzdGVtIChMaW51eCBvbmx5IGZvciBub3cpLgorCVJlcGxhY2VkIERPU0ZTX0dldFVuaXhGaWxlTmFtZSgpL0RPU0ZTX0dldERvc1RydWVOYW1lKCkgYnkKKwlET1NfR2V0RnVsbE5hbWUoKS4KKwlQcm9wZXJseSBpbXBsZW1lbnRlZCBHZXRTaG9ydFBhdGhOYW1lKCkgYW5kIEdldEZ1bGxQYXRoTmFtZSgpLgorCU1hZGUgYWxsIGZ1bmN0aW9ucyByZS1lbnRyYW50LgorCisJKiBbZmlsZXMvZmlsZS5jXSBbbWlzYy9tYWluLmNdCisJUmVwbGFjZWQgLWFsbG93cmVhZG9ubHkgb3B0aW9uIGJ5IC1mYWlscmVhZG9ubHkuIFRoZSBkZWZhdWx0IGlzCisJbm93IHRvIHJlcG9ydCBzdWNjZXNzIHdoZW4gb3BlbmluZyBhIHJlYWQtb25seSBmaWxlIGZvciB3cml0aW5nLgorCisJKiBbb2JqZWN0cy9tZXRhZmlsZS5jXQorCUZpeGVkIGJ1ZyBpbiBESUIgYml0bWFwcyBwb2ludGVyIGNhbGN1bGF0aW9uLgorCisJKiBbc2NoZWR1bGVyL3Byb2Nlc3MuY10KKwlJbXBsZW1lbnRlZCBlbnZpcm9ubWVudCBzdHJpbmdzIGFuZCBHZXQvU2V0U3RkSGFuZGxlIHdpdGggcHJvY2VzcworIAllbnZpcm9ubWVudCBibG9jay4KKworCSogW3Rvb2xzL2J1aWxkLmNdCisJUmV3cm90ZSBCdWlsZENvbnRleHQzMigpIHRvIGF2b2lkIGluc3RydWN0aW9ucyB0aGF0IG1heSBub3QgYmUKKwlzdXBwb3J0ZWQgYnkgYWxsIGFzc2VtYmxlcnMuCisJCitGcmkgSmFuIDEwIDE3OjExOjA5IDE5OTcgIERhdmlkIEZhdXJlICA8ZGF2aWQuZmF1cmVAaWZoYW15Lmluc2EtbHlvbi5mcj4KKworCSogW3dpbmRvd3MvZXZlbnQuY10KKwlDcmVhdGVkIHRhYmxlIGtleWMydmtleSwgd2hpY2ggYXNzb2NpYXRlIGEgdmtleSgrZXh0ZW5kZWQgYml0KSB0bworCWFueSBrZXljb2RlLiBDaGFuZ2VkIEVWRU5UX2V2ZW50X3RvX3ZrZXkgdG8gdXNlIHRoaXMgdGFibGUgdG8KKwlyZXR1cm4gdGhlIGNvcnJlY3QgdmtleS4gQ2hhbmdlZCBFVkVOVF9Ub0FzY2lpIHRvIGdldCB0aGUga2V5Y29kZQorCWZyb20gdGhpcyB0YWJsZSB0b28uICBBc3NpZ25lZCBPRU0gc3BlY2lmaWMgdmtleXMgYXJiaXRyYXJpbHkuCisKK0ZyaSBKYW4gMTAgMDk6MjY6MTcgMTk5NyAgSm9obiBIYXJ2ZXkgPGpvaG5AZGl2aXNpb24uY28udWs+CisKKwkqIFttaXNjL3dpbnNvY2suY10gW21pc2Mvd2luc29jX2FzeW5jLmNdCisgICAgICAgIEZpeGVkIHN2cjQgaGVhZGVyIGZpbGVzLgorICAgICAgICBDaGFuZ2VkIGJ6ZXJvKCkgdG8gbWVtc2V0KCkuCisKKwkqIFt0b29scy9mbnQyYmRmLmNdCisgICAgICAgIFJlbW92ZWQgYmNvcHkoKSBhbmQgdXNlZCBtZW1jcHkoKSBpbnN0ZWFkLgorCisJKiBbZGVidWdnZXIvbXNjLmNdCisgICAgICAgIEluY2x1ZGUgc3RyaW5nLmggaW5zdGVhZCBvZiBzdHJpbmdzLmgKKworCSogW2RlYnVnZ2VyL3N0YWJzLmNdCisgICAgICAgIEluY2x1ZGUgc3RyaW5nLmggaW5zdGVhZCBvZiBzdHJpbmdzLmguCisgICAgICAgIERlZmluZSBfX0VMRl9fIGZvciBzdnI0IHN5c3RlbXMuCisKKwkqIFtsb2FkZXIvc2lnbmFsLmNdCisgICAgICAgIFVzZSB3YWl0KCkgaW5zdGVhZCBvZiB3YWl0NCgpIHdoaWNoIGRvZXNudCBleGlzdCBvbiBVbml4d2FyZS4KKworCSogW21lbW9yeS9nbG9iYWwuY10KKyAgICAgICAgVXNlIHN5c2NvbmYoKSBpbnN0ZWFkIG9mIGdldHBhZ2VzaXplKCkgZm9yIHN2cjQgc3lzdGVtcy4KKworVGh1IEphbiAgOSAyMTowNzoyMCAxOTk3ICBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQGNsaWMubmV0PgorCisJKiBbTWFrZS5ydWxlcy5pbl0gW01ha2VmaWxlLmluXSBbbWFrZV9vczIuc2hdIFtyYy9NYWtlZmlsZS5pbl0KKwkgIFt0b29scy9NYWtlZmlsZS5pbl0gW2RvY3VtZW50YXRpb24vd2luZV9vczIudHh0XQorCVBhdGNoZXMgZm9yIE9TLzIgc3VwcG9ydC4gTm90ZSB0aGF0IGl0IGRvZXNuJ3QgY29tcGlsZSB5ZXQuCisKK1R1ZSBKYW4gIDcgMjA6MDM6NTMgMTk5NyAgRXJpYyBZb3VuZ2RhbGUgPGVyaWNAc3ViMjMwNC5qaWMuY29tPgorCisJKiBbZGVidWdnZXIvKl0KKwlNYW55IG1vcmUgZGVidWdnZXIgaW1wcm92ZW1lbnRzIChzZWUgZGVidWdnZXIvUkVBRE1FIGZvciBkZXRhaWxzKS4KKworVHVlIEphbiAgNyAxNToxMjoyMSAxOTk3ICBNYXJjdXMgTWVpc3NuZXIgPG1zbWVpc3NuQGNpcC5pbmZvcm1hdGlrLnVuaS1lcmxhbmdlbi5kZT4KKworCSogW3dpbmRvd3MvZ3JhcGhpY3MuY10gW29iamVjdHMvdGV4dC5jXSBbZ3JhcGhpY3MveDExZHJ2LypdCisJICBbZ3JhcGhpY3MvbWV0YWZpbGVkcnYvKl0KKwlNb3ZlZCBzb21lIGRldmljZSBkZXBlbmRlbnQgY29kZSBpbnRvIHRoZSByZXNwLiBzdWJkaXJzLgorCisJKiBbaW5jbHVkZS9nZGkuaF0gW2luY2x1ZGUvbWV0YWZpbGVkcnYuaF0gW2luY2x1ZGUveDExZHJ2LmhdCisJUHJvdG90eXBlcyBhZGRlZCwKKwlEQ19GVU5DVElPTlM6IEdldFBpeGVsIGFkZGVkLCBzb21lIHVubmVjZXNzYXJ5IGZ1bmN0aW9ucyByZW1vdmVkLgorCisJKiBbb2JqZWN0cy9yZWdpb24uY10KKwlDcmVhdGVQb2x5UG9seWdvblJnbjMyIGFkZGVkLgorCisJKiBbZmlsZXMvZG9zX2ZzLmNdCisJUXVlcnlEb3NEZXZpY2UgYWRkZWQuCisKKwkqIFttaXNjL2xzdHIuY10KKwlGb3JtYXRNZXNzYWdlOiBicm9rZW4gaGVhcCBtYW5hZ2VtZW50IGZpeGVkLgorCisJKiBbc2NoZWR1bGVyL3Byb2Nlc3MuY10gW3NjaGVkdWxlci90aHJlYWQuY10KKwlHZXQvU2V0VGhyZWFkUHJpb3JpdHkvUHJpb3JpdHlDbGFzcyBhZGRlZC4KKworTW9uIEphbiAgNiAyMTo1NTozMCAxOTk3ICBQaGlsaXBwZSBEZSBNdXl0ZXIgIDxwaGRtQGluZm8udWNsLmFjLmJlPgorCisJKiBbbWlzYy9rZXlib2FyZC5jXQorCVRvQXNjaWkgOiBVc2UgRVZFTlRfVG9Bc2NpaSBpbnN0ZWFkLgorCisJKiBbd2luZG93cy9ldmVudC5jXQorCWtleXBhZF9rZXkgOiBEbyBub3QgY29udmVydCBYS19Nb2RlX3N3aXRjaCB0byBWS19NRU5VOyByZWNvZ25pemUKKwlrZXlwYWQgY3Vyc29yIGtleXMuCisJRVZFTlRfZXZlbnRfdG9fdmtleSA6IE5ldyBmdW5jdGlvbiwgdG8gdHJhbnNmb3JtIGEgWCBrZXljb2RlCisJaW50byBhIE1Td2luIHZrZXkgKyBleHRlbmRlZCBiaXQuCisJRVZFTlRfVG9Bc2NpaSA6IE5ldyBmdW5jdGlvbiwgdG8gdHJhbnNmb3JtIGEgdmtleSArIGV4dGVuZGVkIGJpdAorCSgrIGtleSBzdGF0ZSB0YWJsZSkgaW50byBhc2NpaSBjaGFyKHMpLCB1c2luZyBYTG9va3VwU3RyaW5nLCBhbmQKKwlyZWNvZ25pemluZyBkZWFkIGNoYXJzLgorCUVWRU5UX2tleSA6IFRyYW5zZm9ybSBBbHRHciBpbnRvIEN0cmwrQWx0IHNlcXVlbmNlOyBjYWxsCisJRVZFTlRfZXZlbnRfdG9fdmtleSBmb3Iga2V5Y29kZSB0byB2a2V5IGNvbnZlcnNpb247IGZpeGVkCisJcHJldmlvdXMsIGNvbnRleHQgYW5kIGV4dGVuZGVkIGJpdHMuCisKKwkqIFt3aW5kb3dzL2tleWJvYXJkLmNdCisJSW5jbHVkZSBzdGRkZWJ1Zy5oLCB0byBnZXQgLWRlYnVnbXNnIG1lc3NhZ2VzLgorCUdldEtleVN0YXRlIDogSGFuZGxlIFZLX01CVVRUT04gY2FzZS4KKwlHZXRLZXlib2FyZFN0YXRlLCBTZXRLZXlib2FyZFN0YXRlIDogRGVidWdnaW5nIG1lc3NhZ2VzIGFkZGVkLgorCisJKiBbd2luZG93cy9tZXNzYWdlLmNdCisJVHJhbnNsYXRlTWVzc2FnZSA6IEhhbmRsZSBkZWFkIGNoYXJzLgorCitNb24gSmFuICA2IDIwOjEwOjExIDE5OTcgIERvbWluaWsgU3RyYXNzZXIgIDxibTQyNDk1M0BtdWVuY2hlbi5vcmc+CisKKwkqIFtpZjE2MzIvY3J0ZGxsLnNwZWNdIFttaXNjL2NydGRsbC5jXQorCUMrKyBmdW5jdGlvbnMgbmV3L2RlbGV0ZS9zZXRfbmV3X2hhbmRsZXIgaW1wbGVtZW50ZWQuCisKK01vbiBKYW4gIDYgMTU6NDg6MTUgMTk5NyBGcmFucyB2YW4gRG9yc3NlbGFlciA8ZG9yc3NlbEBydWxobXBjNDkuTGVpZGVuVW5pdi5ubD4KKworCSogW2NvbnRyb2xzL2VkaXQuY10gW2luY2x1ZGUvd2luZG93cy5oXQorCU1vdmVkIHRoZSBlZGl0IGNvbnRyb2wgdG8gMzIgYml0cy4KKwlJbmNsdWRlZCBuZXcgKHdpbjk1KSBtZXNzYWdlIGRlZmluaXRpb25zIGluIHdpbmRvd3MuaAorCUltcGxlbWVudGVkIEVNX1NDUk9MTENBUkVULCBFTV9TRVRNQVJHSU5TLCBFTV9HRVRNQVJHSU5TLAorCUVNX0dFVExJTUlUVEVYVCwgRU1fUE9TRlJPTUNIQVIsIEVNX0NIQVJGUk9NUE9TLgorCUJyb2tlIEVNX1NFVFdPUkRCUkVBS1BST0MgKGludGVybmFsIHdvcmR3cmFwIHN0aWxsIHdvcmtzKS4KKwlGaXhlZCBzb21lIGJ1Z3MsIGludHJvZHVjZWQgYSBjb3VwbGUgb2Ygb3RoZXJzLgorCVRleHQgYnVmZmVyIGlzIG5vdyBpbml0aWFsbHkgaW4gMzItYml0IGhlYXAuCisKKwkqIFtjb250cm9scy9FRElULlRPRE9dIFtjb250cm9scy9jb21iby5jXSBbY29udHJvbHMvd2lkZ2V0cy5jXQorCSAgW2lmMTYzMi93cHJvY3Muc3BlY10gW2xpYnJhcnkvbWlzY3N0dWJzLmNdIFt3aW5kb3dzL2RlZmRsZy5jXQorCSAgW21pc2MvY29tbWRsZy5jXQorCVVwZGF0ZWQgdG8gd29yayB3aXRoIDMyLWJpdCBlZGl0IGNvbnRyb2wuCisKK1NhdCBKYW4gIDQgMjI6MDc6MjcgMTk5NyAgTy5GbGViYmUgIDxPLkZsZWJiZUBzY2llbmNlLWNvbXB1dGluZy51bmktdHVlYmluZ2VuLmRlPgorCisJKiBbbG9hZGVyL3BlX2ltYWdlLmNdCisJVXNlIG1tYXAgcmF0aGVyIHRoZW4gbWFsbG9jLiBCZXR0ZXIgd29ya2Fyb3VuZCBmb3IgY2xlYW4KKwlzZWdtZW50cy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogV2VkIEphbiAgMSAxNTozNjoxNyAxOTk3ICBBbGV4YW5kcmUgSnVsbGlhcmQgIDxqdWxsaWFyZEBscmMuZXBmbC5jaD4KIAogCSogW2NvbnRyb2xzL2xpc3Rib3guY10KZGlmZiAtLWdpdCBhL01ha2UucnVsZXMuaW4gYi9NYWtlLnJ1bGVzLmluCmluZGV4IDg4YjVmNzkuLmRjOTVjODUgMTAwNjQ0Ci0tLSBhL01ha2UucnVsZXMuaW4KKysrIGIvTWFrZS5ydWxlcy5pbgpAQCAtMzEsOSArMzEsOSBAQAogQUxMQ0ZMQUdTID0gJChDRkxBR1MpICQoREVGUykgJChPUFRJT05TKSAkKERJVklOQ0wpICQoWF9DRkxBR1MpCiBMRENPTUJJTkUgPSBsZCAtcgogUk0gICAgICAgID0gcm0gLWYKLUJVSUxEICAgICA9ICQoVE9QT0JKRElSKS90b29scy9idWlsZAotTUFLRURFUCAgID0gJChUT1BPQkpESVIpL3Rvb2xzL21ha2VkZXAKLVdJTkVSQyAgICA9ICQoVE9QT0JKRElSKS9yYy93aW5lcmMKK0JVSUxEICAgICA9ICQoVE9QT0JKRElSKS90b29scy9idWlsZEBQUk9HRVhUQAorTUFLRURFUCAgID0gJChUT1BPQkpESVIpL3Rvb2xzL21ha2VkZXBAUFJPR0VYVEAKK1dJTkVSQyAgICA9ICQoVE9QT0JKRElSKS9yYy93aW5lcmNAUFJPR0VYVEAKIFdJTkVTVFVCICA9ICQoVE9QT0JKRElSKS9saWJyYXJ5L3dpbmVzdHViLm8KIFNVQk1BS0UgICA9ICQoTUFLRSkgJ0NDPSQoQ0MpJyAnQ0ZMQUdTPSQoQ0ZMQUdTKScgJ09QVElPTlM9JChPUFRJT05TKScKIEBTRVRfTUFLRUAKQEAgLTcyLDEyICs3MiwxNyBAQAogIyBSdWxlIHRvIHJlYnVpbGQgcmVzb3VyY2UgY29tcGlsZXIKIAogJChXSU5FUkMpIGNoZWNrX3dpbmVyYzoKLQljZCAkKFRPUE9CSkRJUikvcmM7ICQoU1VCTUFLRSkgd2luZXJjCisJY2QgJChUT1BPQkpESVIpL3JjOyAkKFNVQk1BS0UpIHdpbmVyY0BQUk9HRVhUQAogCi0jIFJ1bGUgdG8gcmVidWlsZCB0aGUgbWFrZWRlcCBwcm9ncmFtCisjIFJ1bGUgdG8gcmVidWlsZCB0aGUgJ21ha2VkZXAnIHByb2dyYW0KIAogJChNQUtFREVQKSBjaGVja19tYWtlZGVwOgotCWNkICQoVE9QT0JKRElSKS90b29sczsgJChTVUJNQUtFKSBtYWtlZGVwCisJY2QgJChUT1BPQkpESVIpL3Rvb2xzOyAkKFNVQk1BS0UpIG1ha2VkZXBAUFJPR0VYVEAKKworIyBSdWxlIHRvIHJlYnVpbGQgdGhlICdidWlsZCcgcHJvZ3JhbQorCiskKEJVSUxEKSBjaGVja2J1aWxkOgorCWNkICQoVE9QT0JKRElSKS90b29sczsgJChTVUJNQUtFKSBidWlsZEBQUk9HRVhUQAogCiAjIFJ1bGUgZm9yIG1haW4gbW9kdWxlCiAKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZSBiL2NvbmZpZ3VyZQppbmRleCA4MTg5YjcwLi4xMzc0MGI1IDEwMDc1NQotLS0gYS9jb25maWd1cmUKKysrIGIvY29uZmlndXJlCkBAIC01NTAsNiArNTUwLDcgQEAKIAogIyBXZSB3YW50IHRoZXNlIGJlZm9yZSB0aGUgY2hlY2tzLCBzbyB0aGUgY2hlY2tzIGNhbiBtb2RpZnkgdGhlaXIgdmFsdWVzLgogdGVzdCAteiAiJExETElCUyIgJiYgTERMSUJTPS1sbSAKK3Rlc3QgLXogIiRQUk9HRVhUIiAmJiBQUk9HRVhUPSIiIAogCiAKICMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGlicmFyeSBvciAtLXdpdGhvdXQtbGlicmFyeSB3YXMgZ2l2ZW4uCkBAIC01ODAsNyArNTgxLDcgQEAKIAogCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyICR7TUFLRS1tYWtlfSBzZXRzIFwke01BS0V9IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo1ODQ6IGNoZWNraW5nIHdoZXRoZXIgJHtNQUtFLW1ha2V9IHNldHMgXCR7TUFLRX0iID4mNQorZWNobyAiY29uZmlndXJlOjU4NTogY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIgPiY1CiBzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPWBlY2hvICIkMiIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTYwOSw3ICs2MTAsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJnY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGdjYzsgYWNfd29yZD0kMgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yICRhY193b3JkIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo2MTM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6NjE0OiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfQ0MnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQpAQCAtNjM4LDcgKzYzOSw3IEBACiAgICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAiY2MiLCBzbyBpdCBjYW4gYmUgYSBwcm9ncmFtIG5hbWUgd2l0aCBhcmdzLgogc2V0IGR1bW15IGNjOyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjY0MjogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo2NDM6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19DQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC02ODYsNyArNjg3LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgdGhlIEMgY29tcGlsZXIgKCRDQyAkQ0ZMQUdTICRMREZMQUdTKSB3b3JrcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6NjkwOiBjaGVja2luZyB3aGV0aGVyIHRoZSBDIGNvbXBpbGVyICgkQ0MgJENGTEFHUyAkTERGTEFHUykgd29ya3MiID4mNQorZWNobyAiY29uZmlndXJlOjY5MTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIHdvcmtzIiA+JjUKIAogYWNfZXh0PWMKICMgQ0ZMQUdTIGlzIG5vdCBpbiBhY19jcHAgYmVjYXVzZSAtZywgLU8sIGV0Yy4gYXJlIG5vdCB2YWxpZCBjcHAgb3B0aW9ucy4KQEAgLTY5NiwxMSArNjk3LDExIEBACiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNzAwICJjb25maWd1cmUiCisjbGluZSA3MDEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogbWFpbigpe3JldHVybigwKTt9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA0OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzA1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgYWNfY3ZfcHJvZ19jY193b3Jrcz15ZXMKICAgIyBJZiB3ZSBjYW4ndCBydW4gYSB0cml2aWFsIHByb2dyYW0sIHdlIGFyZSBwcm9iYWJseSB1c2luZyBhIGNyb3NzIGNvbXBpbGVyLgogICBpZiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGw7IHRoZW4KQEAgLTcyMCwxMiArNzIxLDEyIEBACiAgIHsgZWNobyAiY29uZmlndXJlOiBlcnJvcjogaW5zdGFsbGF0aW9uIG9yIGNvbmZpZ3VyYXRpb24gcHJvYmxlbTogQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzLiIgMT4mMjsgZXhpdCAxOyB9CiBmaQogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyNDogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQorZWNobyAiY29uZmlndXJlOjcyNTogY2hlY2tpbmcgd2hldGhlciB0aGUgQyBjb21waWxlciAoJENDICRDRkxBR1MgJExERkxBR1MpIGlzIGEgY3Jvc3MtY29tcGlsZXIiID4mNQogZWNobyAiJGFjX3QiIiRhY19jdl9wcm9nX2NjX2Nyb3NzIiAxPiY2CiBjcm9zc19jb21waWxpbmc9JGFjX2N2X3Byb2dfY2NfY3Jvc3MKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjcyOTogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQorZWNobyAiY29uZmlndXJlOjczMDogY2hlY2tpbmcgd2hldGhlciB3ZSBhcmUgdXNpbmcgR05VIEMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfZ2NjJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTczNCw3ICs3MzUsNyBAQAogICB5ZXM7CiAjZW5kaWYKIEVPRgotaWYgeyBhY190cnk9JyR7Q0MtY2N9IC1FIGNvbmZ0ZXN0LmMnOyB7IChldmFsIGVjaG8gY29uZmlndXJlOjczODogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH07IH0gfCBlZ3JlcCB5ZXMgPi9kZXYvbnVsbCAyPiYxOyB0aGVuCitpZiB7IGFjX3RyeT0nJHtDQy1jY30gLUUgY29uZnRlc3QuYyc7IHsgKGV2YWwgZWNobyBjb25maWd1cmU6NzM5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfTsgfSB8IGVncmVwIHllcyA+L2Rldi9udWxsIDI+JjE7IHRoZW4KICAgYWNfY3ZfcHJvZ19nY2M9eWVzCiBlbHNlCiAgIGFjX2N2X3Byb2dfZ2NjPW5vCkBAIC03NDksNyArNzUwLDcgQEAKICAgYWNfc2F2ZV9DRkxBR1M9IiRDRkxBR1MiCiAgIENGTEFHUz0KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke0NDLWNjfSBhY2NlcHRzIC1nIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3NTM6IGNoZWNraW5nIHdoZXRoZXIgJHtDQy1jY30gYWNjZXB0cyAtZyIgPiY1CitlY2hvICJjb25maWd1cmU6NzU0OiBjaGVja2luZyB3aGV0aGVyICR7Q0MtY2N9IGFjY2VwdHMgLWciID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfY2NfZycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC03NzcsNyArNzc4LDcgQEAKIGZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZTo3ODE6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKK2VjaG8gImNvbmZpZ3VyZTo3ODI6IGNoZWNraW5nIGhvdyB0byBydW4gdGhlIEMgcHJlcHJvY2Vzc29yIiA+JjUKICMgT24gU3Vucywgc29tZXRpbWVzICRDUFAgbmFtZXMgYSBkaXJlY3RvcnkuCiBpZiB0ZXN0IC1uICIkQ1BQIiAmJiB0ZXN0IC1kICIkQ1BQIjsgdGhlbgogICBDUFA9CkBAIC03OTIsMTMgKzc5MywxMyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA3OTYgImNvbmZpZ3VyZSIKKyNsaW5lIDc5NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODAyOiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MDM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTgwOSwxMyArODEwLDEzIEBACiAgIHJtIC1yZiBjb25mdGVzdCoKICAgQ1BQPSIke0NDLWNjfSAtRSAtdHJhZGl0aW9uYWwtY3BwIgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA4MTMgImNvbmZpZ3VyZSIKKyNsaW5lIDgxNCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKIEVPRgogYWNfdHJ5PSIkYWNfY3BwIGNvbmZ0ZXN0LiRhY19leHQgPi9kZXYvbnVsbCAyPmNvbmZ0ZXN0Lm91dCIKLXsgKGV2YWwgZWNobyBjb25maWd1cmU6ODE5OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo4MjA6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9CiBhY19lcnI9YGdyZXAgLXYgJ14gKisnIGNvbmZ0ZXN0Lm91dGAKIGlmIHRlc3QgLXogIiRhY19lcnIiOyB0aGVuCiAgIDoKQEAgLTg0Miw3ICs4NDMsNyBAQAogIyBVc2VzIGFjXyB2YXJzIGFzIHRlbXBzIHRvIGFsbG93IGNvbW1hbmQgbGluZSB0byBvdmVycmlkZSBjYWNoZSBhbmQgY2hlY2tzLgogIyAtLXdpdGhvdXQteCBvdmVycmlkZXMgZXZlcnl0aGluZyBlbHNlLCBidXQgZG9lcyBub3QgdG91Y2ggdGhlIGNhY2hlLgogZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIFgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjg0NjogY2hlY2tpbmcgZm9yIFgiID4mNQorZWNobyAiY29uZmlndXJlOjg0NzogY2hlY2tpbmcgZm9yIFgiID4mNQogCiAjIENoZWNrIHdoZXRoZXIgLS13aXRoLXggb3IgLS13aXRob3V0LXggd2FzIGdpdmVuLgogaWYgdGVzdCAiJHt3aXRoX3grc2V0fSIgPSBzZXQ7IHRoZW4KQEAgLTkwNCwxMiArOTA1LDEyIEBACiAKICAgIyBGaXJzdCwgdHJ5IHVzaW5nIHRoYXQgZmlsZSB3aXRoIG5vIHNwZWNpYWwgZGlyZWN0b3J5IHNwZWNpZmllZC4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDkwOCAiY29uZmlndXJlIgorI2xpbmUgOTA5ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkeF9kaXJlY3RfdGVzdF9pbmNsdWRlPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZTo5MTM6IFwiJGFjX3RyeVwiKSAxPiY1OyAoZXZhbCAkYWNfdHJ5KSAyPiY1OyB9Cit7IChldmFsIGVjaG8gY29uZmlndXJlOjkxNDogXCIkYWNfdHJ5XCIpIDE+JjU7IChldmFsICRhY190cnkpIDI+JjU7IH0KIGFjX2Vycj1gZ3JlcCAtdiAnXiAqKycgY29uZnRlc3Qub3V0YAogaWYgdGVzdCAteiAiJGFjX2VyciI7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgpAQCAtOTc4LDE0ICs5NzksMTQgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKICAgTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTgyICJjb25maWd1cmUiCisjbGluZSA5ODMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKICR7eF9kaXJlY3RfdGVzdF9mdW5jdGlvbn0oKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk4OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjk5MDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgTElCUz0iJGFjX3NhdmVfTElCUyIKICMgV2UgY2FuIGxpbmsgWCBwcm9ncmFtcyB3aXRoIG5vIHNwZWNpYWwgbGlicmFyeSBwYXRoLgpAQCAtMTA5MSwxNyArMTA5MiwxNyBAQAogICAgIGNhc2UgImAodW5hbWUgLXNyKSAyPi9kZXYvbnVsbGAiIGluCiAgICAgIlN1bk9TIDUiKikKICAgICAgIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgLVIgbXVzdCBiZSBmb2xsb3dlZCBieSBhIHNwYWNlIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMDk1OiBjaGVja2luZyB3aGV0aGVyIC1SIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBzcGFjZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTA5NjogY2hlY2tpbmcgd2hldGhlciAtUiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgc3BhY2UiID4mNQogICAgICAgYWNfeHNhdmVfTElCUz0iJExJQlMiOyBMSUJTPSIkTElCUyAtUiR4X2xpYnJhcmllcyIKICAgICAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwOTggImNvbmZpZ3VyZSIKKyNsaW5lIDEwOTkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMDU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTA2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX25vc3BhY2U9eWVzCiBlbHNlCkBAIC0xMTE3LDE0ICsxMTE4LDE0IEBACiAgICAgICBlbHNlCiAJTElCUz0iJGFjX3hzYXZlX0xJQlMgLVIgJHhfbGlicmFyaWVzIgogCWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExMjEgImNvbmZpZ3VyZSIKKyNsaW5lIDExMjIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExMjg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTI5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBhY19SX3NwYWNlPXllcwogZWxzZQpAQCAtMTE1Niw3ICsxMTU3LDcgQEAKICAgICAjIGxpYnJhcmllcyB3ZXJlIGJ1aWx0IHdpdGggREVDbmV0IHN1cHBvcnQuICBBbmQga2FybEBjcy51bWIuZWR1IHNheXMKICAgICAjIHRoZSBBbHBoYSBuZWVkcyBkbmV0X3N0dWIgKGRuZXQgZG9lcyBub3QgZXhpc3QpLgogICAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBkbmV0X250b2EgaW4gLWxkbmV0IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMTYwOiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldCIgPiY1CitlY2hvICJjb25maWd1cmU6MTE2MTogY2hlY2tpbmcgZm9yIGRuZXRfbnRvYSBpbiAtbGRuZXQiID4mNQogYWNfbGliX3Zhcj1gZWNobyBkbmV0J18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMTY0LDcgKzExNjUsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDExNjggImNvbmZpZ3VyZSIKKyNsaW5lIDExNjkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTExNzUsNyArMTE3Niw3IEBACiBkbmV0X250b2EoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjExNzk6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMTgwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTE5Nyw3ICsxMTk4LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2xpYl9kbmV0X2RuZXRfbnRvYSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxMjAxOiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxMjAyOiBjaGVja2luZyBmb3IgZG5ldF9udG9hIGluIC1sZG5ldF9zdHViIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gZG5ldF9zdHViJ18nZG5ldF9udG9hIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xMjA1LDcgKzEyMDYsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxkbmV0X3N0dWIgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTIwOSAiY29uZmlndXJlIgorI2xpbmUgMTIxMCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTIxNiw3ICsxMjE3LDcgQEAKIGRuZXRfbnRvYSgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTIyMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyMjE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xMjQ1LDEyICsxMjQ2LDEyIEBACiAgICAgIyBUaGUgbnNsIGxpYnJhcnkgcHJldmVudHMgcHJvZ3JhbXMgZnJvbSBvcGVuaW5nIHRoZSBYIGRpc3BsYXkKICAgICAjIG9uIElyaXggNS4yLCBhY2NvcmRpbmcgdG8gZGlja2V5QGNsYXJrLm5ldC4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI0OTogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUiID4mNQorZWNobyAiY29uZmlndXJlOjEyNTA6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2dldGhvc3RieW5hbWUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMjU0ICJjb25maWd1cmUiCisjbGluZSAxMjU1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGdldGhvc3RieW5hbWUoKTsgYmVsb3cuICAqLwpAQCAtMTI3Myw3ICsxMjc0LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEyNzc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMjc4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2dldGhvc3RieW5hbWU9eWVzIgogZWxzZQpAQCAtMTI5NCw3ICsxMjk1LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfZ2V0aG9zdGJ5bmFtZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgZ2V0aG9zdGJ5bmFtZSBpbiAtbG5zbCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTI5ODogY2hlY2tpbmcgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxuc2wiID4mNQorZWNobyAiY29uZmlndXJlOjEyOTk6IGNoZWNraW5nIGZvciBnZXRob3N0YnluYW1lIGluIC1sbnNsIiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gbnNsJ18nZ2V0aG9zdGJ5bmFtZSB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTMwMiw3ICsxMzAzLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sbnNsICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEzMDYgImNvbmZpZ3VyZSIKKyNsaW5lIDEzMDcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTEzMTMsNyArMTMxNCw3IEBACiBnZXRob3N0YnluYW1lKCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzE3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTMxODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTEzNDMsMTIgKzEzNDQsMTIgQEAKICAgICAjIC1sc29ja2V0IG11c3QgYmUgZ2l2ZW4gYmVmb3JlIC1sbnNsIGlmIGJvdGggYXJlIG5lZWRlZC4KICAgICAjIFdlIGFzc3VtZSB0aGF0IGlmIGNvbm5lY3QgbmVlZHMgLWxuc2wsIHNvIGRvZXMgZ2V0aG9zdGJ5bmFtZS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM0NzogY2hlY2tpbmcgZm9yIGNvbm5lY3QiID4mNQorZWNobyAiY29uZmlndXJlOjEzNDg6IGNoZWNraW5nIGZvciBjb25uZWN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX2Nvbm5lY3QnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzUyICJjb25maWd1cmUiCisjbGluZSAxMzUzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIGNvbm5lY3QoKTsgYmVsb3cuICAqLwpAQCAtMTM3MSw3ICsxMzcyLDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjEzNzU6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxMzc2OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9mdW5jX2Nvbm5lY3Q9eWVzIgogZWxzZQpAQCAtMTM5Miw3ICsxMzkzLDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfY29ubmVjdCA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgY29ubmVjdCBpbiAtbHNvY2tldCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTM5NjogY2hlY2tpbmcgZm9yIGNvbm5lY3QgaW4gLWxzb2NrZXQiID4mNQorZWNobyAiY29uZmlndXJlOjEzOTc6IGNoZWNraW5nIGZvciBjb25uZWN0IGluIC1sc29ja2V0IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gc29ja2V0J18nY29ubmVjdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTQwMCw3ICsxNDAxLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1sc29ja2V0ICRYX0VYVFJBX0xJQlMgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDA0ICJjb25maWd1cmUiCisjbGluZSAxNDA1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNDExLDcgKzE0MTIsNyBAQAogY29ubmVjdCgpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQxNTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0MTY6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNDM1LDEyICsxNDM2LDEyIEBACiAKICAgICAjIGdvbWV6QG1pLnVuaS1lcmxhbmdlbi5kZSBzYXlzIC1scG9zaXggaXMgbmVjZXNzYXJ5IG9uIEEvVVguCiAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHJlbW92ZSIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTQzOTogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CitlY2hvICJjb25maWd1cmU6MTQ0MDogY2hlY2tpbmcgZm9yIHJlbW92ZSIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfZnVuY19yZW1vdmUnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDQ0ICJjb25maWd1cmUiCisjbGluZSAxNDQ1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyIHJlbW92ZSgpOyBiZWxvdy4gICovCkBAIC0xNDYzLDcgKzE0NjQsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTQ2NzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE0Njg6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfcmVtb3ZlPXllcyIKIGVsc2UKQEAgLTE0ODQsNyArMTQ4NSw3IEBACiAKICAgICBpZiB0ZXN0ICRhY19jdl9mdW5jX3JlbW92ZSA9IG5vOyB0aGVuCiAgICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3IgcmVtb3ZlIGluIC1scG9zaXgiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE0ODg6IGNoZWNraW5nIGZvciByZW1vdmUgaW4gLWxwb3NpeCIgPiY1CitlY2hvICJjb25maWd1cmU6MTQ4OTogY2hlY2tpbmcgZm9yIHJlbW92ZSBpbiAtbHBvc2l4IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gcG9zaXgnXydyZW1vdmUgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE0OTIsNyArMTQ5Myw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbHBvc2l4ICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE0OTYgImNvbmZpZ3VyZSIKKyNsaW5lIDE0OTcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE1MDMsNyArMTUwNCw3IEBACiByZW1vdmUoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1MDc6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTA4OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTUyNywxMiArMTUyOCwxMiBAQAogCiAgICAgIyBCU0RJIEJTRC9PUyAyLjEgbmVlZHMgLWxpcGMgZm9yIFhPcGVuRGlzcGxheS4KICAgICBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2htYXQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE1MzE6IGNoZWNraW5nIGZvciBzaG1hdCIgPiY1CitlY2hvICJjb25maWd1cmU6MTUzMjogY2hlY2tpbmcgZm9yIHNobWF0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9mdW5jX3NobWF0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTUzNiAiY29uZmlndXJlIgorI2xpbmUgMTUzNyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBTeXN0ZW0gaGVhZGVyIHRvIGRlZmluZSBfX3N0dWIgbWFjcm9zIGFuZCBob3BlZnVsbHkgZmV3IHByb3RvdHlwZXMsCiAgICAgd2hpY2ggY2FuIGNvbmZsaWN0IHdpdGggY2hhciBzaG1hdCgpOyBiZWxvdy4gICovCkBAIC0xNTU1LDcgKzE1NTYsNyBAQAogCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTU1OTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE1NjA6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2Z1bmNfc2htYXQ9eWVzIgogZWxzZQpAQCAtMTU3Niw3ICsxNTc3LDcgQEAKIAogICAgIGlmIHRlc3QgJGFjX2N2X2Z1bmNfc2htYXQgPSBubzsgdGhlbgogICAgICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIHNobWF0IGluIC1saXBjIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNTgwOiBjaGVja2luZyBmb3Igc2htYXQgaW4gLWxpcGMiID4mNQorZWNobyAiY29uZmlndXJlOjE1ODE6IGNoZWNraW5nIGZvciBzaG1hdCBpbiAtbGlwYyIgPiY1CiBhY19saWJfdmFyPWBlY2hvIGlwYydfJ3NobWF0IHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNTg0LDcgKzE1ODUsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWxpcGMgICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTU4OCAiY29uZmlndXJlIgorI2xpbmUgMTU4OSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAvKiBPdmVycmlkZSBhbnkgZ2NjMiBpbnRlcm5hbCBwcm90b3R5cGUgdG8gYXZvaWQgYW4gZXJyb3IuICAqLwogLyogV2UgdXNlIGNoYXIgYmVjYXVzZSBpbnQgbWlnaHQgbWF0Y2ggdGhlIHJldHVybiB0eXBlIG9mIGEgZ2NjMgpAQCAtMTU5NSw3ICsxNTk2LDcgQEAKIHNobWF0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNTk5OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTYwMDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE2MjgsNyArMTYyOSw3IEBACiAgICMgbGlicmFyaWVzIHdlIGNoZWNrIGZvciBiZWxvdywgc28gdXNlIGEgZGlmZmVyZW50IHZhcmlhYmxlLgogICAjICAtLWludGVycmFuQHVsdXJ1LlN0YW5mb3JkLkVEVSwga2JAY3MudW1iLmVkdS4KICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIEljZUNvbm5lY3Rpb25OdW1iZXIgaW4gLWxJQ0UiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE2MzI6IGNoZWNraW5nIGZvciBJY2VDb25uZWN0aW9uTnVtYmVyIGluIC1sSUNFIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjMzOiBjaGVja2luZyBmb3IgSWNlQ29ubmVjdGlvbk51bWJlciBpbiAtbElDRSIgPiY1CiBhY19saWJfdmFyPWBlY2hvIElDRSdfJ0ljZUNvbm5lY3Rpb25OdW1iZXIgfCBzZWQgJ3klLi8rLSVfX3BfJSdgCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliXyRhY19saWJfdmFyJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE2MzYsNyArMTYzNyw3IEBACiAgIGFjX3NhdmVfTElCUz0iJExJQlMiCiBMSUJTPSItbElDRSAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNjQwICJjb25maWd1cmUiCisjbGluZSAxNjQxICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xNjQ3LDcgKzE2NDgsNyBAQAogSWNlQ29ubmVjdGlvbk51bWJlcigpCiA7IHJldHVybiAwOyB9CiBFT0YKLWlmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTY1MTogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE2NTI6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGV2YWwgImFjX2N2X2xpYl8kYWNfbGliX3Zhcj15ZXMiCiBlbHNlCkBAIC0xNjc2LDcgKzE2NzcsNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICIkYWNfcHJvZyIsIHNvIGl0IGNhbiBiZSBhIHByb2dyYW0gbmFtZSB3aXRoIGFyZ3MuCiBzZXQgZHVtbXkgJGFjX3Byb2c7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTY4MDogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNjgxOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfWUFDQycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzA4LDcgKzE3MDksNyBAQAogIyBFeHRyYWN0IHRoZSBmaXJzdCB3b3JkIG9mICJmbGV4Iiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSBmbGV4OyBhY193b3JkPSQyCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX3dvcmQiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE3MTI6IGNoZWNraW5nIGZvciAkYWNfd29yZCIgPiY1CitlY2hvICJjb25maWd1cmU6MTcxMzogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9wcm9nX0xFWCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCkBAIC0xNzQxLDcgKzE3NDIsNyBAQAogICAqKSBhY19saWI9bCA7OwogICBlc2FjCiAgIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB5eXdyYXAgaW4gLWwkYWNfbGliIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToxNzQ1OiBjaGVja2luZyBmb3IgeXl3cmFwIGluIC1sJGFjX2xpYiIgPiY1CitlY2hvICJjb25maWd1cmU6MTc0NjogY2hlY2tpbmcgZm9yIHl5d3JhcCBpbiAtbCRhY19saWIiID4mNQogYWNfbGliX3Zhcj1gZWNobyAkYWNfbGliJ18neXl3cmFwIHwgc2VkICd5JS4vKy0lX19wXyUnYAogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl8kYWNfbGliX3Zhcicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CkBAIC0xNzQ5LDcgKzE3NTAsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWwkYWNfbGliICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE3NTMgImNvbmZpZ3VyZSIKKyNsaW5lIDE3NTQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogT3ZlcnJpZGUgYW55IGdjYzIgaW50ZXJuYWwgcHJvdG90eXBlIHRvIGF2b2lkIGFuIGVycm9yLiAgKi8KIC8qIFdlIHVzZSBjaGFyIGJlY2F1c2UgaW50IG1pZ2h0IG1hdGNoIHRoZSByZXR1cm4gdHlwZSBvZiBhIGdjYzIKQEAgLTE3NjAsNyArMTc2MSw3IEBACiB5eXdyYXAoKQogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE3NjQ6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdDsgdGhlbgoraWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxNzY1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KICAgcm0gLXJmIGNvbmZ0ZXN0KgogICBldmFsICJhY19jdl9saWJfJGFjX2xpYl92YXI9eWVzIgogZWxzZQpAQCAtMTc4NSw3ICsxNzg2LDcgQEAKICMgRXh0cmFjdCB0aGUgZmlyc3Qgd29yZCBvZiAicmFubGliIiwgc28gaXQgY2FuIGJlIGEgcHJvZ3JhbSBuYW1lIHdpdGggYXJncy4KIHNldCBkdW1teSByYW5saWI7IGFjX3dvcmQ9JDIKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfd29yZCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTc4OTogY2hlY2tpbmcgZm9yICRhY193b3JkIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxNzkwOiBjaGVja2luZyBmb3IgJGFjX3dvcmQiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X3Byb2dfUkFOTElCJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE4MjIsNyArMTgyMyw3IEBACiAjIFNWUjQgL3Vzci91Y2IvaW5zdGFsbCwgd2hpY2ggdHJpZXMgdG8gdXNlIHRoZSBub25leGlzdGVudCBncm91cCAic3RhZmYiCiAjIC4vaW5zdGFsbCwgd2hpY2ggY2FuIGJlIGVycm9uZW91c2x5IGNyZWF0ZWQgYnkgbWFrZSBmcm9tIC4vaW5zdGFsbC5zaC4KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE4MjY6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQorZWNobyAiY29uZmlndXJlOjE4Mjc6IGNoZWNraW5nIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwiID4mNQogaWYgdGVzdCAteiAiJElOU1RBTEwiOyB0aGVuCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcGF0aF9pbnN0YWxsJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKQEAgLTE4NzIsNyArMTg3Myw3IEBACiB0ZXN0IC16ICIkSU5TVEFMTF9EQVRBIiAmJiBJTlNUQUxMX0RBVEE9JyR7SU5TVEFMTH0gLW0gNjQ0JwogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgaTM4Nl9zZXRfbGR0IGluIC1saTM4NiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTg3NjogY2hlY2tpbmcgZm9yIGkzODZfc2V0X2xkdCBpbiAtbGkzODYiID4mNQorZWNobyAiY29uZmlndXJlOjE4Nzc6IGNoZWNraW5nIGZvciBpMzg2X3NldF9sZHQgaW4gLWxpMzg2IiA+JjUKIGFjX2xpYl92YXI9YGVjaG8gaTM4NidfJ2kzODZfc2V0X2xkdCB8IHNlZCAneSUuLystJV9fcF8lJ2AKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9saWJfJGFjX2xpYl92YXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgpAQCAtMTg4MCw3ICsxODgxLDcgQEAKICAgYWNfc2F2ZV9MSUJTPSIkTElCUyIKIExJQlM9Ii1saTM4NiAgJExJQlMiCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxODg0ICJjb25maWd1cmUiCisjbGluZSAxODg1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIE92ZXJyaWRlIGFueSBnY2MyIGludGVybmFsIHByb3RvdHlwZSB0byBhdm9pZCBhbiBlcnJvci4gICovCiAvKiBXZSB1c2UgY2hhciBiZWNhdXNlIGludCBtaWdodCBtYXRjaCB0aGUgcmV0dXJuIHR5cGUgb2YgYSBnY2MyCkBAIC0xODkxLDcgKzE4OTIsNyBAQAogaTM4Nl9zZXRfbGR0KCkKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxODk1OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTg5NjogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfbGliXyRhY19saWJfdmFyPXllcyIKIGVsc2UKQEAgLTE5MTcsNyArMTkxOCw3IEBACiB0aGVuCiAgIENGTEFHUz0iJENGTEFHUyAtV2FsbCIKICAgZWNobyAkYWNfbiAiY2hlY2tpbmcgImZvciBnY2Mgc3RyZW5ndGgtcmVkdWNlIGJ1ZyIiIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjE5MjE6IGNoZWNraW5nICJmb3IgZ2NjIHN0cmVuZ3RoLXJlZHVjZSBidWciIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToxOTIyOiBjaGVja2luZyAiZm9yIGdjYyBzdHJlbmd0aC1yZWR1Y2UgYnVnIiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5MjUsNyArMTkyNiw3IEBACiAgIGFjX2N2X2NfZ2NjX3N0cmVuZ3RoX2J1Zz0ieWVzIgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxOTI5ICJjb25maWd1cmUiCisjbGluZSAxOTMwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4odm9pZCkgewpAQCAtMTkzNiw3ICsxOTM3LDcgQEAKICAgZXhpdCggQXJyYXlbMV0gIT0gLTIgKTsKIH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTQwOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3QgJiYgKC4vY29uZnRlc3Q7IGV4aXQpIDI+L2Rldi9udWxsCitpZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjE5NDE6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKIHRoZW4KICAgYWNfY3ZfY19nY2Nfc3RyZW5ndGhfYnVnPSJubyIKIGVsc2UKQEAgLTE5NTksNyArMTk2MCw3IEBACiAKIAogZWNobyAkYWNfbiAiY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MTk2MzogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CitlY2hvICJjb25maWd1cmU6MTk2NDogY2hlY2tpbmcgIndoZXRoZXIgZXh0ZXJuYWwgc3ltYm9scyBuZWVkIGFuIHVuZGVyc2NvcmUgcHJlZml4IiIgPiY1CiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfY19leHRlcm5fcHJlZml4JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKQEAgLTE5NzEsMTQgKzE5NzIsMTQgQEAKIAkubG9uZyAwCiBFT0YKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDE5NzUgImNvbmZpZ3VyZSIKKyNsaW5lIDE5NzYgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogZXh0ZXJuIGludCBhY190ZXN0OwogaW50IG1haW4oKSB7CiBpZiAoYWNfdGVzdCkgcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToxOTgyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MTk4MzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19leHRlcm5fcHJlZml4PSJ5ZXMiCiBlbHNlCkBAIC0yMDA0LDIxICsyMDA1LDIxIEBACiBpZiB0ZXN0ICIkTUFJTl9UQVJHRVQiID0gImxpYndpbmUuc28uMS4wIgogdGhlbgogICBlY2hvICRhY19uICJjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMDA4OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDA5OiBjaGVja2luZyAid2hldGhlciB3ZSBjYW4gYnVpbGQgYSBkbGwiIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2RsbCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIHNhdmVkX2NmbGFncz0kQ0ZMQUdTCiAgIENGTEFHUz0iJENGTEFHUyAtZlBJQyAtc2hhcmVkIC1XbCwtc29uYW1lLGNvbmZ0ZXN0LnNvLjEuMCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjAxNSAiY29uZmlndXJlIgorI2xpbmUgMjAxNiAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewogcmV0dXJuIDEKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDIyOiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjAyMzogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgYWNfY3ZfY19kbGw9InllcyIKIGVsc2UKQEAgLTIwNDUsMTIgKzIwNDYsMTIgQEAKIGZvciBhY19mdW5jIGluIG1lbW1vdmUgdGNnZXRhdHRyIHVzbGVlcAogZG8KIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciAkYWNfZnVuYyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjA0OTogY2hlY2tpbmcgZm9yICRhY19mdW5jIiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMDUwOiBjaGVja2luZyBmb3IgJGFjX2Z1bmMiID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2Z1bmNfJGFjX2Z1bmMnK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMDU0ICJjb25maWd1cmUiCisjbGluZSAyMDU1ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIC8qIFN5c3RlbSBoZWFkZXIgdG8gZGVmaW5lIF9fc3R1YiBtYWNyb3MgYW5kIGhvcGVmdWxseSBmZXcgcHJvdG90eXBlcywKICAgICB3aGljaCBjYW4gY29uZmxpY3Qgd2l0aCBjaGFyICRhY19mdW5jKCk7IGJlbG93LiAgKi8KQEAgLTIwNzMsNyArMjA3NCw3IEBACiAKIDsgcmV0dXJuIDA7IH0KIEVPRgotaWYgeyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMDc3OiBcIiRhY19saW5rXCIpIDE+JjU7IChldmFsICRhY19saW5rKSAyPiY1OyB9ICYmIHRlc3QgLXMgY29uZnRlc3Q7IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjA3ODogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0OyB0aGVuCiAgIHJtIC1yZiBjb25mdGVzdCoKICAgZXZhbCAiYWNfY3ZfZnVuY18kYWNfZnVuYz15ZXMiCiBlbHNlCkBAIC0yMDk4LDEyICsyMDk5LDEyIEBACiBkb25lCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iIi4uLiAkYWNfYyIgMT4mNgotZWNobyAiY29uZmlndXJlOjIxMDI6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQorZWNobyAiY29uZmlndXJlOjIxMDM6IGNoZWNraW5nIHdoZXRoZXIgc3RhdCBmaWxlLW1vZGUgbWFjcm9zIGFyZSBicm9rZW4iID4mNQogaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2hlYWRlcl9zdGF0X2Jyb2tlbicrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIxMDcgImNvbmZpZ3VyZSIKKyNsaW5lIDIxMDggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0yMTU0LDEyICsyMTU1LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igd29ya2luZyBjb25zdCIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjE1ODogY2hlY2tpbmcgZm9yIHdvcmtpbmcgY29uc3QiID4mNQorZWNobyAiY29uZmlndXJlOjIxNTk6IGNoZWNraW5nIGZvciB3b3JraW5nIGNvbnN0IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9jX2NvbnN0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjE2MyAiY29uZmlndXJlIgorI2xpbmUgMjE2NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgewpAQCAtMjIwOCw3ICsyMjA5LDcgQEAKIAogOyByZXR1cm4gMDsgfQogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIyMTI6IFwiJGFjX2NvbXBpbGVcIikgMT4mNTsgKGV2YWwgJGFjX2NvbXBpbGUpIDI+JjU7IH07IHRoZW4KK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjIxMzogXCIkYWNfY29tcGlsZVwiKSAxPiY1OyAoZXZhbCAkYWNfY29tcGlsZSkgMj4mNTsgfTsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCiAgIGFjX2N2X2NfY29uc3Q9eWVzCiBlbHNlCkBAIC0yMjI5LDEyICsyMjMwLDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3IgQU5TSSBDIGhlYWRlciBmaWxlcyIiLi4uICRhY19jIiAxPiY2Ci1lY2hvICJjb25maWd1cmU6MjIzMzogY2hlY2tpbmcgZm9yIEFOU0kgQyBoZWFkZXIgZmlsZXMiID4mNQorZWNobyAiY29uZmlndXJlOjIyMzQ6IGNoZWNraW5nIGZvciBBTlNJIEMgaGVhZGVyIGZpbGVzIiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RkYycrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIyMzggImNvbmZpZ3VyZSIKKyNsaW5lIDIyMzkgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtMjI0Miw3ICsyMjQzLDcgQEAKICNpbmNsdWRlIDxmbG9hdC5oPgogRU9GCiBhY190cnk9IiRhY19jcHAgY29uZnRlc3QuJGFjX2V4dCA+L2Rldi9udWxsIDI+Y29uZnRlc3Qub3V0IgoteyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ2OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQoreyAoZXZhbCBlY2hvIGNvbmZpZ3VyZToyMjQ3OiBcIiRhY190cnlcIikgMT4mNTsgKGV2YWwgJGFjX3RyeSkgMj4mNTsgfQogYWNfZXJyPWBncmVwIC12ICdeICorJyBjb25mdGVzdC5vdXRgCiBpZiB0ZXN0IC16ICIkYWNfZXJyIjsgdGhlbgogICBybSAtcmYgY29uZnRlc3QqCkBAIC0yMjU5LDcgKzIyNjAsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBTdW5PUyA0Lnggc3RyaW5nLmggZG9lcyBub3QgZGVjbGFyZSBtZW0qLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMjI2MyAiY29uZmlndXJlIgorI2xpbmUgMjI2NCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiBFT0YKQEAgLTIyNzcsNyArMjI3OCw3IEBACiBpZiB0ZXN0ICRhY19jdl9oZWFkZXJfc3RkYyA9IHllczsgdGhlbgogICAjIElTQyAyLjAuMiBzdGRsaWIuaCBkb2VzIG5vdCBkZWNsYXJlIGZyZWUsIGNvbnRyYXJ5IHRvIEFOU0kuCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMjgxICJjb25maWd1cmUiCisjbGluZSAyMjgyICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzdGRsaWIuaD4KIEVPRgpAQCAtMjI5OCw3ICsyMjk5LDcgQEAKICAgOgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAyMzAyICJjb25maWd1cmUiCisjbGluZSAyMzAzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0yMzA5LDcgKzIzMTAsNyBAQAogZXhpdCAoMCk7IH0KIAogRU9GCi1pZiB7IChldmFsIGVjaG8gY29uZmlndXJlOjIzMTM6IFwiJGFjX2xpbmtcIikgMT4mNTsgKGV2YWwgJGFjX2xpbmspIDI+JjU7IH0gJiYgdGVzdCAtcyBjb25mdGVzdCAmJiAoLi9jb25mdGVzdDsgZXhpdCkgMj4vZGV2L251bGwKK2lmIHsgKGV2YWwgZWNobyBjb25maWd1cmU6MjMxNDogXCIkYWNfbGlua1wiKSAxPiY1OyAoZXZhbCAkYWNfbGluaykgMj4mNTsgfSAmJiB0ZXN0IC1zIGNvbmZ0ZXN0ICYmICguL2NvbmZ0ZXN0OyBleGl0KSAyPi9kZXYvbnVsbAogdGhlbgogICA6CiBlbHNlCkBAIC0yMzMzLDEyICsyMzM0LDEyIEBACiBmaQogCiBlY2hvICRhY19uICJjaGVja2luZyBmb3Igc2l6ZV90IiIuLi4gJGFjX2MiIDE+JjYKLWVjaG8gImNvbmZpZ3VyZToyMzM3OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKK2VjaG8gImNvbmZpZ3VyZToyMzM4OiBjaGVja2luZyBmb3Igc2l6ZV90IiA+JjUKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl90eXBlX3NpemVfdCcrc2V0fSdgXCIgPSBzZXQiOyB0aGVuCiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDIzNDIgImNvbmZpZ3VyZSIKKyNsaW5lIDIzNDMgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2lmIFNURENfSEVBREVSUwpAQCAtMjUzMSw2ICsyNTMyLDcgQEAKIHMlQGluZm9kaXJAJSRpbmZvZGlyJWcKIHMlQG1hbmRpckAlJG1hbmRpciVnCiBzJUBMRExJQlNAJSRMRExJQlMlZworcyVAUFJPR0VYVEAlJFBST0dFWFQlZwogcyVATUFJTl9UQVJHRVRAJSRNQUlOX1RBUkdFVCVnCiBzJUBPUFRJT05TQCUkT1BUSU9OUyVnCiBzJUBTRVRfTUFLRUAlJFNFVF9NQUtFJWcKZGlmZiAtLWdpdCBhL2NvbmZpZ3VyZS5pbiBiL2NvbmZpZ3VyZS5pbgppbmRleCBlZGU1ZTBjLi4xOGY4MDNjIDEwMDY0NAotLS0gYS9jb25maWd1cmUuaW4KKysrIGIvY29uZmlndXJlLmluCkBAIC04LDYgKzgsNyBAQAogCiAjIFdlIHdhbnQgdGhlc2UgYmVmb3JlIHRoZSBjaGVja3MsIHNvIHRoZSBjaGVja3MgY2FuIG1vZGlmeSB0aGVpciB2YWx1ZXMuCiB0ZXN0IC16ICIkTERMSUJTIiAmJiBMRExJQlM9LWxtIEFDX1NVQlNUKExETElCUykKK3Rlc3QgLXogIiRQUk9HRVhUIiAmJiBQUk9HRVhUPSIiIEFDX1NVQlNUKFBST0dFWFQpCiAKIGRubCAqKioqIENvbW1hbmQtbGluZSBhcmd1bWVudHMgKioqKgogCmRpZmYgLS1naXQgYS9jb250cm9scy9FRElULlRPRE8gYi9jb250cm9scy9FRElULlRPRE8KaW5kZXggN2JhY2FkZi4uNGZmMzVlNyAxMDA2NDQKLS0tIGEvY29udHJvbHMvRURJVC5UT0RPCisrKyBiL2NvbnRyb2xzL0VESVQuVE9ETwpAQCAtNCwyNSArNCw0OCBAQAogCiBBKSBiYXNpYyBwb2xpY3kKIEIpIHNwZWNpYWwgZnVuY3Rpb25zCi1DKSBub3QgaW1wbGVtZW50ZWQKLUQpIGtub3duIGJ1Z3MKK0MpIG5vdCBpbXBsZW1lbnRlZCAvIGltcGxlbWVudGF0aW9uIGlkZWFzIC8gaW1wbGVtZW50YXRpb24gcHJvYmxlbXMKK0QpIGtub3duIGJ1Z3MgLyBmZWF0dXJlcwogCiBBKSBCYXNpYyBQb2xpY3kKIAorQWxsIG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGJ5IEVkaXRXbmRQcm9jKCksIHdoaWNoIGlzIHRoZSBvbmx5IGV4dGVybmFsCitmdW5jdGlvbiBjYWxsLiAgQWxsIG90aGVyIGZ1bmN0aW9ucyBhcmUgc3RhdGljIChsb2NhbCB0byBlZGl0LmMpLgorCitBbGwgV2luZG93cyBNZXNzYWdlcyAoV01fWFhYKSBhcmUgMzItYml0LCBzaW5jZSB0aGUgZWRpdCBjb250cm9sIGlzIG5vdyBhCiszMi1iaXQgcmVnaXN0ZXJlZCBjbGFzcy4gIFRoZSBtZXNzYWdlIGFyZSBkZWFsdCB3aXRoIHRocm91Z2ggdGhlIGhlbHBlcgorZnVuY3Rpb25zIEVESVRfV01fWFhYKCkuCisKK1RoZSBlZGl0IGNvbnRyb2wgbWVzc2FnZXMgY2FuIGJlIGVpdGhlciAxNiBvciAzMiBiaXQsIGRlcGVuZGluZyBvbiB0aGUgdHlwZQorb2YgYXBwbGljYXRpb24gdGhhdCBzZW5kcyB0aGUgbWVzc2FnZS4gIFdoZXJldmVyIHBvc3NpYmxlIEVkaXRXbmRQcm9jKCkKK2NvbnZlcnRzIHRoZSAxNi1iaXQgbWVzc2FnZSBwYXJhbWV0ZXJzIHRvIHBhcmFtZXRlcnMgY29ycmVzcG9uZGluZyB0byB0aGVpcgorMzItYml0IGNvdW50ZXJwYXJ0cy4gIFRoZSBtZXNzYWdlIGlzIHRoZW4gaGFuZGxlZCBieSB0aGUgYXBwcm9wcmlhdGUKK0VESVRfRU1fWFhYKCkgaGVscGVyIGZ1bmN0aW9uLiBTb21ldGltZXMgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGhhbmRsZSB0aGUKKzE2LWJpdCBhbmQgMzItYml0IHZlcnNpb25zIGluIHRoZSBzYW1lIHdheSwgaW4gd2hpY2ggY2FzZSBib3RoIGhlbHBlcgorZnVuY3Rpb25zIEVESVRfRU1fWFhYMTYoKSBhbmQgRURJVF9FTV9YWFgoKSBhcmUgZGVmaW5lZC4KKworQWxsIG90aGVyIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIEVESVRfWFhYKCkuCisKK05vdGU6IFNvbWV0aW1lcyBhIGZ1bmN0aW9uIGlzIGludGVybmFsbHkgdXNlZCBhIGJpdCBkaWZmZXJlbnQgdGhhbiB0aGUgc3BlY3MKK29mIGEgc2ltaWxhciBmdW5jdGlvbi4gIEZvciBpbnN0YW5jZSBFRElUX1NldFNlbCgpIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQKK3Nob3VsZCBub3QgYmUgbWl4ZWQgdXAgd2l0aCBFRElUX0VNX1NldFNlbCgpLCBhIG1lc3NhZ2UgaGFuZGxlciB0aGF0IF9kb2VzXworY29uZm9ybSB0byB0aGUgc3BlY3Mgb2YgRU1fU0VUU0VMLgorCiBUaGUgY29kZSBoYXMgYmVlbiBtYWRlIGluIHN1Y2ggYSB3YXksIHRoYXQgZnVuY3Rpb25zIHRyeSB0byBjYWxsIG90aGVyCiAoZG9jdW1lbnRlZCkgZnVuY3Rpb25zIGlmIHRoYXQgaXMgc3VmZmljaWVudC4gIFRoaXMgbWlnaHQgc29tZXRpbWVzIG5vdCBiZQotdGhlIG1vc3QgZWZmaWNpZW50IHdheSwgYnV0IGl0IGtlZXBzIHRoZSBjb2RlIGNsZWFyLiAgVGhpcyB3YXkgSSB0cmllZCB0byBrZWVwCi10aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IHJlbHkgb24gdGhlIGludGVybmFsIEVESVRTVEFURSBzdHJ1Y3R1cmUgYXMKLWxvdyBhcyBwb3NzaWJsZS4gIEZvciBpbnN0YW5jZSBFRElUX1dNX0N1dCgpIHNpbXBseSBjYWxscyBFRElUX1dNX0NvcHkoKSBhbmQKLUVESVRfV01fQ2xlYXIoKS4gIFRoZSBsYXR0ZXIgdHdvIGFyZSB3ZWxsIGRvY3VtZW50ZWQgbWVzc2FnZSBoYW5kbGVycywgc28KLWFzIGxvbmcgYXMgdGhleSBhcmUgcmlnaHQgRURJVF9XTV9DdXQoKSB3aWxsIG5ldmVyIGhhdmUgdG8gY2hhbmdlIGFnYWluLgordGhlIG1vc3QgZWZmaWNpZW50IHdheSwgYnV0IGl0IGtlZXBzIHRoZSBjb2RlIGNsZWFyLiAgVGhpcyB3YXkgSSB0cmllZCB0bwora2VlcCB0aGUgbnVtYmVyIG9mIGZ1bmN0aW9ucyB0aGF0IHJlbHkgb24gdGhlIGludGVybmFsIEVESVRTVEFURSBzdHJ1Y3R1cmUKK2FzIGxvdyBhcyBwb3NzaWJsZS4gIEZvciBpbnN0YW5jZSBFRElUX1dNX0N1dCgpIHNpbXBseSBjYWxscyBFRElUX1dNX0NvcHkoKQorYW5kIEVESVRfV01fQ2xlYXIoKS4gIFRoZSBsYXR0ZXIgdHdvIGFyZSB3ZWxsIGRvY3VtZW50ZWQgbWVzc2FnZSBoYW5kbGVycywKK3NvIGFzIGxvbmcgYXMgdGhleSBhcmUgcmlnaHQgRURJVF9XTV9DdXQoKSB3aWxsIG5ldmVyIGhhdmUgdG8gY2hhbmdlIGFnYWluLgogCiBFeGFtcGxlOgogVGhlIGJlc3QgdGhpbmcgdG8gZG8sIHdoZW4geW91IHdhbnQgdG8ga25vdyB0aGUgb2Zmc2V0IG9mIGxpbmUgMywgaXMgY2FsbGluZwotRURJVF9FTV9MaW5lSW5kZXgoKS4gIEFnYWluIHRoaXMgaXMgYSB3ZWxsIGRvY3VtZW50ZWQgbWVzc2FnZSBoYW5kbGVyLiAgRG9uJ3QKLWxvb2sgYXQgZXMtPkxpbmVEZWZzWzJdLm9mZnNldC4gIEl0IHdvdWxkIGp1c3QgYmUgYW5vdGhlciByZWZlcmVuY2UgdG8gdGhlCi1pbnRlcm5hbCBzdHJ1Y3R1cmUsIGFuZCB0aGF0IHdvdWxkIG1ha2UgaXQgbW9yZSBkaWZmaWN1bHQgdG8gY2hhbmdlIHRoaW5ncy4KLVJlZmVyIHRvIEVESVRfV01fPz8/PyBhbmQgRURJVF9FTV8/Pz8/PyBmdW5jdGlvbnMgYXMgbXVjaCBhcyBwb3NzaWJsZS4KK0VESVRfRU1fTGluZUluZGV4KCkuICBBZ2FpbiB0aGlzIGlzIGEgd2VsbCBkb2N1bWVudGVkIG1lc3NhZ2UgaGFuZGxlci4gCitEb24ndCBsb29rIGF0IGVzLT5MaW5lRGVmc1syXS5vZmZzZXQuICBJdCB3b3VsZCBqdXN0IGJlIGFub3RoZXIgcmVmZXJlbmNlIHRvCit0aGUgaW50ZXJuYWwgc3RydWN0dXJlLCBhbmQgdGhhdCB3b3VsZCBtYWtlIGl0IG1vcmUgZGlmZmljdWx0IHRvIGNoYW5nZQordGhpbmdzLiBSZWZlciB0byBFRElUX1dNXz8/Pz8gYW5kIEVESVRfRU1fPz8/Pz8gZnVuY3Rpb25zIGFzIG11Y2ggYXMKK3Bvc3NpYmxlLgogCiBUaGUgV05EICogcG9pbnRlciBpcyB1c2VkIGludGVybmFsbHkgd2hlbmV2ZXIgcG9zc2libGUuICBBbHRob3VnaCBpdCBpcyBub3QKIHRoZSByZWFsIEhXTkQsIGl0IGltcHJvdmVzIHBlcmZvcm1hbmNlIGVub3VnaCB0byB1c2UgaXQuCkBAIC0zMywyMCArNTYsMzUgQEAKIHdvdWxkIGJlIG11Y2ggc2xvd2VyIGV2ZW4sIHdoZW4gZXZlcnl0aGluZyB3b3VsZCBiZSBwYWludGVkIGluc3RhbnRseS4gIFRoaXMKIGlzIGVzcGVjaWFsbHkgdHJ1ZSBmb3Igc2Nyb2xsYmFyIHRyYWNraW5nIGFuZCBzZWxlY3Rpb24gY2hhbmdlcy4uCiAKK1RoZSB0ZXh0IGJ1ZmZlciBpcyBhIGtpbmQgb2YgdHJpY2t5LiAgSW5pdGlhbGx5IHRoZSBlZGl0IGNvbnRyb2wgYWxsb2NhdGVzIGEKK0hMT0NBTDMyIGJ1ZmZlciAoMzIgYml0IGxpbmVhciBtZW1vcnkgaGFuZGxlcikuICBIb3dldmVyLCAxNiBiaXQgYXBwbGljYXRpb24KK21pZ2h0IHNlbmQgYSBFTV9HRVRIQU5ETEUgbWVzc2FnZSBhbmQgZXhwZWN0IGEgSExPQ0FMMTYgKDE2IGJpdCBTRUc6T0ZGCitoYW5kbGVyKS4gIEZyb20gdGhhdCBtb21lbnQgb24gd2UgaGF2ZSB0byBrZWVwIHVzaW5nIHRoaXMgMTYgYml0IG1lbW9yeQoraGFuZGxlciwgYmVjYXVzZSBpdCBpcyBzdXBwb3NlZCB0byBiZSB2YWxpZCBhdCBhbGwgdGltZXMgYWZ0ZXIgRU1fR0VUSEFORExFLiAKK1doYXQgd2UgZG8gaXMgY3JlYXRlIGEgSExPQ0FMMTYgYnVmZmVyLCBjb3B5IHRoZSB0ZXh0LCBhbmQgZG8gcG9pbnRlcgorY29udmVyc2lvbi4KKwogCiAKIEIpIFNwZWNpYWwgZnVuY3Rpb25zCiAKLVRoZSBlZGl0IGNvbnRyb2wgbmVlZHMgdG8gdXNlIGxvY2FsIGhlYXAgbWVtb3J5IGJlY2F1c2UgYXBwbGljYXRpb25zIG1heQotcmVseSBvbiBFTV9HRVRIQU5ETEUuICBUaGlzIGlzIGJhZCwgYnV0IGl0IGNhbid0IGJlIGhlbHBlZCwgd2UgaGF2ZSB0byBsaXZlCi13aXRoIHRoYXQuICBGb3IgdGhpcyByZWFzb24gdGhlcmUgaXMgYSBuaWNlIEVESVRfR2V0UG9pbnRlcigpIGZ1bmN0aW9uLAotd2hpY2ggbG9ja3MgdGhlIGhlYXAgYnVmZmVyICpvbmx5IG9uY2UqLCBubyBtYXR0ZXIgaG93IG9mdGVuIGl0IGlzIGNhbGxlZC4KLU9ubHkgYXQgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZSBoYW5kbGVyIEVESVRfUmVsZWFzZVBvaW50ZXIoKSBpcyBjYWxsZWQuICBZb3UKLWRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdW5sb2NraW5nIHRoZSBoZWFwLiAgQ2FsbGluZyBFRElUX0dldFBvaW50ZXIoKSBpcwotdmVyeSBmYXN0IGlmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBsb2NrZWQuCi1UaGlzIHdheSwgdGhlIGJ1ZmZlciBnZXRzIGxvY2tlZCAvIHVubG9jayBvbmx5IG9uY2UgZXZlcnkgbWVzc2FnZSwgYWx0aG91Z2gKLUVESVRfR2V0UG9pbnRlcigpIG1heSBhY3R1YWxseSBoYXZlIGJlZW4gY2FsbGVkIGEgaHVuZHJlZCB0aW1lcy4KLU9ubHkgd2hlbiB0aGUgYWN0dWFsIEhMT0NBTCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIHRvIFJlQWxsb2MpLCBhIGNhbGwgdG8KK1NldmVyYWwgaGVscGVyIGZ1bmN0aW9ucyB0cnkgdG8gbWFrZSB5b3VyIGxpZmUgZWFzaWVyIHdoZW4gZGVhbGluZyB3aXRoIHRoZQorYWxsb2NhdGVkIGJ1ZmZlci4gIEluIHByaW5jaXBsZSBXaW5kb3dzIGNhbiBtb3ZlIG1lbW9yeSBibG9ja3MgYXJvdW5kIHVubGVzcwordGhleSBhcmUgbG9ja2VkLiAgQ3VycmVudGx5LCBXSU5FIGRvZXNuJ3QgZG8gdGhpcywgYnV0IGl0IG1pZ2h0IGluIHRoZQorZnV0dXJlLgorCitGb3IgdGhpcyByZWFzb24gdGhlcmUgaXMgYSBuaWNlIEVESVRfR2V0UG9pbnRlcigpIGZ1bmN0aW9uLCB3aGljaCBsb2NrcyB0aGUKK2hlYXAgYnVmZmVyICpvbmx5IG9uY2UqLCBubyBtYXR0ZXIgaG93IG9mdGVuIGl0IGlzIGNhbGxlZC4gSXQgdGhlbiByZXR1cm5zIGEKK25pY2UgMzItYml0IHBvaW50ZXIgdG8gbGluZWFyIG1lbW9yeS4gQ2FsbGluZyBFRElUX0dldFBvaW50ZXIoKSBpcyB2ZXJ5IGZhc3QKK2lmIHRoZSBidWZmZXIgaXMgYWxyZWFkeSBsb2NrZWQsIHNvIHlvdSBjYW4gY2FsbCBpdCB3aGVuZXZlciB5b3UgZmVlbCBpdAorKm1pZ2h0KiBiZSB1c2VmdWwuCisKK0F0IHRoZSBlbmQgb2YgRWRpdFduZFByb2MoKSwgRURJVF9SZWxlYXNlUG9pbnRlcigpIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkCit3aGljaCBjbGVhbnMgdXAgdGhlIGluaXRpYWxpemVkIHBvaW50ZXIuICBTbyB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dAordW5sb2NraW5nIHRoZSBtZW1vcnkgYmxvY2suIFRoaXMgd2F5LCB0aGUgYnVmZmVyIGdldHMgbG9ja2VkIC8gdW5sb2NrIG9ubHkKK29uY2UgZXZlcnkgbWVzc2FnZSwgYWx0aG91Z2ggRURJVF9HZXRQb2ludGVyKCkgbWF5IGFjdHVhbGx5IGhhdmUgYmVlbiBjYWxsZWQKK2EgaHVuZHJlZCB0aW1lcy4gIE9ubHkgd2hlbiB0aGUgYWN0dWFsIEhMT0NBTCBpcyBuZWVkZWQgKGZvciBleGFtcGxlIHRvCitSZUFsbG9jKSwgYW4gZXh0cmEgY2FsbCAoYmVzaWRlcyB0aGUgY2xlYW51cCBhdCB0aGUgZW5kIG9mIEVkaXRXbmRQcm9jKCkpIHRvCiBFRElUX1JlbGVhc2VQb2ludGVyKCkgaXMgbmVlZGVkLiAgTG9vayBmb3IgaW5zdGFuY2UgaW4gRURJVF9NYWtlRml0KCkuCiAKIFRoaXMgYnJpbmdzIHVzIHRvIEVESVRfTWFrZUZpdCgpLiAgSXQgYXV0b21hdGljYWxseSByZS1hbGxvY2F0ZXMgdGhlIGJ1ZmZlcgpAQCAtNTUsNiArOTMsOSBAQAogdG8gY2FsbCBFRElUX01ha2VGaXQoKS4gIEN1cnJlbnRseSB0aGlzIGlzIG9ubHkgaW4gRURJVF9SZXBsYWNlU2VsKCkgYW5kCiBFRElUX1dNX1NldFRleHQoKS4KIAorRURJVF9HZXRQb2ludGVyKCksIEVESVRfUmVsZWFzZVBvaW50ZXIgYW5kIEVESVRfTWFrZUZpdCgpIGFyZSBhd2FyZSBvZiB0aGUKK0hMT0NBTDMyIC8gSExPQ0FMMTYgYnVzaW5lc3MuCisKIEVESVRfQnVpbGRMaW5lRGVmcygpIGlzIHRoZSBtb3N0IGltcG9ydGFudCBmdW5jdGlvbiBpbiBlZGl0LmMuICBJdCBidWlsZHMKIHRoZSBpbnRlcm5hbCBFRElUU1RBVEUgc3RydWN0dXJlLiAgQXMgc29vbiBhcyB0ZXh0ICptaWdodCogaGF2ZSBjaGFuZ2VkLCBvcgogd2hlbiB0aGUgYXBwZWFyYW5jZSBvZiB0aGUgdGV4dCBvbiB0aGUgc2NyZWVuICptaWdodCogaGF2ZSBjaGFuZ2VkLCBjYWxsCkBAIC02NCw0NyArMTA1LDkzIEBACiAKIAogCi1DKSBOb3QgSW1wbGVtZW50ZWQKK0MpIE5vdCBJbXBsZW1lbnRlZCAvIEltcGxlbWVudGF0aW9uIElkZWFzIC8gSW1wbGVtZW50YXRpb24gUHJvYmxlbXMKIAotLSBFU19QQVNTV09SRAorU3R5bGVzOgorCiAtIEVTX0NFTlRFUgogLSBFU19SSUdIVAotLSBFTV9TRVRSRUNUCi0tIEVNX1NFVFJFQ1ROUAotLSBFTV9GTVRMSU5FUwotLSBFU19BVVRPVlNDUk9MTCAoZXZlcnkgbXVsdGkgbGluZSAqaXMqIGF1dG8gdnNjcm9sbCkKLS0gRVNfQVVUT0hTQ1JPTEwgKG11bHRpIGxpbmUgY2FuIGJlIHllcyBvciBubywgYnV0IHNpbmdsZSBsaW5lIG9ubHkgeWVzKQotLSBXTV9VTkRPICg9RU1fVU5ETykKLS0gRU1fQ0FOVU5ETwotLSBFTV9TQ1JPTEwgKHNjcm9sbGluZyB3b3JrcywgYnV0IHRoaXMgYXBwZWFycyB0byBiZSBhbiB1bmRvY3VtZW50ZWQgbWVzc2FnZSkKLS0gRVNfTE9XRVJDQVNFCi0tIEVTX1VQUEVSQ0FTRQorLSBFU19OVU1CRVIgKG5ldyBzaW5jZSB3aW45NSkKIC0gRVNfT0VNQ09OVkVSVAogLSBFU19XQU5UUkVUVVJOCi0tIHByb2JhYmx5IG11Y2gsIE1VQ0ggbW9yZQogCi1JIGVuY291bnRlcmVkIHNldmVyYWwgdW5kb2N1bWVudGVkIG1lc3NhZ2VzLCBvciBtZXNzYWdlIHBhcmFtZXRlcnMuCi1FZGl0V25kUHJvYygpIHJlcG9ydHMgYW55IHVua25vd24gbWVzc2FnZSB3aXRoIGFuIGlkID4gV01fVVNFUi4KK05vbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIGRpZmZpY3VsdCB0byBpbmNsdWRlLiAgSSBqdXN0IGRpZG4ndCBoYXZlIHRoZSB0aW1lCit5ZXQuICBGZWVsIGZyZWUgLi4uCisKKy0gRVNfQVVUT1ZTQ1JPTEwgKGV2ZXJ5IG11bHRpIGxpbmUgY29udHJvbCAqaXMqIGF1dG8gdnNjcm9sbCkKKy0gRVNfQVVUT0hTQ1JPTEwgKGV2ZXJ5IHNpbmdsZSBsaW5lIGNvbnRyb2wgKmlzKiBhdXRvIGhzY3JvbGwpCisJCSAoZm9yIG11bHRpIGxpbmUgY29udHJvbHMgaXQgd29ya3MgOiB3b3Jkd3JhcCkKKworTXVjaCwgbXVjaCBtb3JlIGRpZmZpY3VsdC4gIEl0IGNvbWVzIGRvd24gdG8gdGhpczogV2hlbiB0aGVyZSBpcyBubworYXV0b3Njcm9sbGluZywgdGhlIGVkaXQgY29udHJvbCBzaG91bGQgZmlyc3QgY2hlY2sgd2hldGhlciB0aGUgbmV3IHRleHQKKyhhZnRlciBhIHR5cGVkIGtleSBmb3IgaW5zdGFuY2UpIHdvdWxkIGZpdC4gIElmIG5vdCwgYW4gRU5fTUFYVEVYVCBzaG91bGQgYmUKK3NlbnQuICBIb3dldmVyLCBjdXJyZW50bHkgdGhpcyB3b3VsZCByZXF1aXJlIHRoZSBhY3R1YWwgY2hhbmdlIHRvIGJlIG1hZGUsCit0aGVuIGNhbGwgRURJVF9CdWlsZExpbmVEZWZzKCkgYW5kIHRoZW4gZmluZCBvdXQgdGhhdCB0aGUgbmV3IHRleHQgZG9lc24ndAorZml0LiAgQWZ0ZXIgYWxsIHRoaXMsIHRoaW5ncyBzaG91bGQgYmUgcHV0IGJhY2sgaW4gdGhlIHN0YXRlIGJlZm9yZSB0aGUKK2NoYW5nZXMuICBHaXZlbiB0aGUgZmFjdCB0aGF0IGV2ZW4gbm9ybWFsIFVORE8gZG9lc24ndCB3b3JrIC4uLgorCitNZXNzYWdlczoKKworLSBFTV9TRVRSRUNUCistIEVNX1NFVFJFQ1ROUAorLSBFTV9TRVRNQVJHSU5TIChuZXcgc2luY2Ugd2luOTUpCistIEVNX0ZNVExJTkVTCisKK1RoZXNlIHNob3VsZG4ndCBiZSByZWFsbHkgZGlmZmljdWx0IGVpdGhlci4gIFRoZXkganVzdCBjb25maW5lIHRoZSB2aXN1YWwKK291dHB1dCB0byBzb21ldGhpbmcgZGlmZmVyZW50IHRoYW4gdGhlIGNsaWVudCByZWN0YW5nbGUuICBDdXJyZW50bHkgdGhlCitjbGllbnQgYXJlYSBpcyB1c2VkIGV2ZXJ5d2hlcmUgaW4gdGhlIGNvZGUuICBBdCBzb21lIHBvaW50cyB0aGlzIHNob3VsZAorcmVhbGx5IGJlIHNvIChHZXRDbGllbnRSZWN0MzIoKSksIHdoZXJlYXMgYXQgb3RoZXIgcG9pbnRzIGl0IHNob3VsZCBiZSB0aGUKK2Zvcm1hdCByZWN0YW5nbGUgKEVESVRfRU1fR2V0UmVjdCgpKS4gQm90aCBmdW5jdGlvbnMgYXJlIG5vdyB1c2VkLCBidXQKK2luY29uc2lzdGVudGx5IGFuZCBtaXhlZCB1cCAhIElmIHlvdSBpbXBsZW1lbnQgdGhlIGZvcm1hdHRpbmcgcmVjdGFuZ2xlIC8KK21hcmdpbnMsIGJlIHN1cmUgdG8gY2hlY2sgYWxsIHJlZmVyZW5jZXMgdG8gUkVDVCdzLCBhbmQgaG93IHRoZXkgYXJlIC8KK3Nob3VsZCBiZSBvYnRhaW5lZC4KKworLSBFTV9GTVRMSU5FUworCitUaGlzIG1lYW5zOiBpbnNlcnQgb3IgcmVtb3ZlIHRoZSBzb2Z0IGxpbmVicmVhayBjaGFyYWN0ZXIgKFxyXHJcbikuIFByb2JhYmx5CitpbnZlbnRlZCBieSBNUyB0byBzdWl0IHRoZWlyIGltcGxlbWVudGF0aW9uIG9mIHRoZSBlZGl0IGNvbnRyb2wuICBIb3dldmVyLAord2l0aCBXSU5FJ3MgaW1wbGVtZW50YXRpb24gSSd2ZSBuZXZlciBjb21lIHVwIHdpdGggb2NjYXNpb25zIHdoZXJlIGl0IGlzCithY3R1YWxseSB1c2VmdWwgKHdlIG5ldmVyIGluc2VydCBcclxyXG4sIGFuZCBhcHBsaWNhdGlvbnMgYWx3YXlzIHJlcXVlc3QKK3JlbW92YWwpLiAgSWYgeW91IGFyZSBhIHB1cmlzdCAuLi4gaW1wbGVtZW50YXRpb24gc2hvdWxkbid0IGJlIGRpZmZpY3VsdC4gCitUYWtlIGNhcmUgdG8gY2hlY2sgaWYgdGhlIHRleHQgc3RpbGwgZml0cyB0aGUgYnVmZmVyIGFmdGVyIGluc2VydGlvbi4gSWYKK25vdCwgbm90aWZ5IHdpdGggRU5fRVJSU1BBQ0UuCisKKy0gV01fVU5ETyAoPUVNX1VORE8pCisKK0knbSB3b3JraW5nIG9uIGl0LiAgSXQgaXMsIGhvd2V2ZXIsIG5vdCB0cml2aWFsLiAgTHVja2lseSB0aGUgb25seSBmdW5jdGlvbgord2hlcmUgYWN0dWFsIHRleHQgY2hhbmdlcyBpcyBFTV9SRVBMQUNFU0VMLCBzbyB0aGlzIGlzIHRoZSBvbmx5IHNwb3Qgd2hlcmUKK3dlIGhhdmUgdG8gd29ycnkgYWJvdXQgVU5ETyBjYXBhYmlsaXRpZXMuIEJlZm9yZSB5b3UgdHJ5OiBjb250YWN0IG1lLiAgSQorYWxyZWFkeSBoYXZlIGlkZWFzIGFuZCBtaWdodCBzdGFydCBpbXBsZW1lbnRpbmcgaXQgbXlzZWxmIHJlYWxseSBzb29uLgorCistIEVNX1NFVFdPUkRCUkVBS1BST0MKKworTm90IHJlYWxseSBkaWZmaWN1bHQuICBJdCB1c2VkIHRvIHdvcmssIGJ1dCBzaW5jZSB3ZSBtb3ZlZCB0byAzMiBiaXRzIHRoZXJlCithcmUgbm93IHR3byBraW5kcyBvZiBjYWxsYmFjayBmdW5jdGlvbnMuICBBbmQgSSBkb24ndCBrbm93IHRoZSAzMi1iaXQgc3BlY3MKK2ZvciB0aGUgV29yZEJyZWFrUHJvYygpIC4uLiAgTG9vayBpdCB1cCBhbmQgdW5jb21tZW50IHRoZSBjb2RlIHRoYXQgaXMgc3RpbGwKK3RoZXJlIGZvciAxNiBiaXQgY2FsbGJhY2suCisKKy0gRU1fU0NST0xMCisKK1N1cHBvc2VkIHRvIGJlIHRoZSBzYW1lIGFzIFdNX1ZTQ1JPTEwsIGJ1dCBub3QgcXVpdGUuICBJbiBvdGhlciB3b3JkczoKK3Bvb3JseSBkb2N1bWVudGVkLiAgU29tZWJvZHkgdGhhdCBrbm93cyA/CiAKIAogCi1EKSBLbm93biBidWdzLgorRCkgS25vd24gYnVncyAvIEZlYXR1cmVzCiAKLS0JU2Nyb2xsaW5nIGlzIHdlaXJkLCBzb21ldGltZXMuICBUaGUgY3VycmVudCBjb2RlIG1ha2VzIHRoZSBzY3JvbGxiYXIKLQlvZiBOb3RlcGFkIHdvcmssIGJ1dCB0aGUgc2Nyb2xsYmFyIGNvZGUgaXRzZWxmIGlzIGJyb2tlbi4gIEN1cnJlbnRseQotCXRoZSBzY3JvbGwgY29kZSBvZiBlZGl0LmMgaXMgKm5vdCogYWNjb3JkaW5nIHRvIHNwZWNzLiAgSW5zdGVhZCwgaXQKLQlpcyBhY2NvcmRpbmcgdG8gdGhlIGJyb2tlbiBzY3JvbGxiYXIgY29kZS4gIElmIHRoYXQgZ2V0cyBmaXhlZCwgdGhpcwotCXNob3VsZCBiZSBmaXhlZCwgdG9vLgotLQlUaGUgY2xpcGJvYXJkIGlzIGJyb2tlbi4gIFdoZW5ldmVyIHRoaW5ncyBnbyB3cm9uZyB3aXRoCi0JY3V0L2NvcHkvcGFzdGUsIGl0IGlzIHByb2JhYmx5IHRoZSBjbGlwYm9hcmQgdGhhdCBtZXNzZXMgdXAgdGhpbmdzLAotCW5vdCBlZGl0LmMuCi0tCVR1cm5pbmcgb24gV29yZFdyYXAgd2l0aCBOb3RlcGFkIGxlYXZlcyBwYXJ0IG9mIHRoZSBob3Jpem9udGFsCistCVRoZSBjb250cm9sIHN0aWxsIGNhbGxzIEdldFRhYmJlZFRleHRFeHRlbnQoKSBhbmQgVGFiYmVkVGV4dE91dCgpIGluCisJdGhlaXIgMTYgYml0IHZlcnNpb24gKHNpbmNlIHRoZSAzMiBiaXQgdmVyc2lvbnMgZG9uJ3QgeWV0IGV4aXN0KS4KKwlUaGVyZWZvcmUgdGhlIHRhYiBsaXN0IGlzIDE2IGJpdHMgKHNob3VsZCBiZSAzMikuCistCVNjcm9sbGJhciB0cmFja2luZyBpcyBicm9rZW4uCistCUxvdHMgb2YgQVBJIGNhbGxzIGFyZSB0byAxNiBiaXQgZnVuY3Rpb25zLCBiZWNhdXNlIHRoZWlyIDMyIGJpdAorCXZlcnNpb25zIGhhdmVuJ3QgYmVlbiBpbXBsZW1lbnRlZCB5ZXQgKGUuZy4gY2xpcGJvYXJkKS4KKy0JVHVybmluZyBvbiBXb3JkV3JhcCB3aXRoIDE2LWJpdCBOb3RlcGFkIGxlYXZlcyBwYXJ0IG9mIHRoZSBob3Jpem9udGFsCiAJc2Nyb2xsYmFyIHZpc2libGUgKHByb2JsZW0gd2l0aCBXTV9FUkFTRUJLR05EID8/PykuCistCUZJWE1FJ3MgKGdyZXAgZm9yIHRoZW0pLgogCiAKLUkgYW0gc3RpbGwgdmVyeSBhY3RpdmVseSBjaGFuZ2luZyB0aGluZ3MuICBFc3BlY2lhbGx5IEkgYW0gd29ya2luZwotb24gVW5kbyBjYXBhYmlsaXRpZXMuICBJZiB5b3Ugd2FudCB0byBkbyB0aGluZ3MsIG90aGVyIHRoYW4gYnVnIGZpeGVzLAotcGxlYXNlIG1haWwgbWUgc28gd2UgY2FuIHN5bmNocm9uaXplLgorSSBhbSB3b3JraW5nIG9uIFVuZG8gY2FwYWJpbGl0aWVzLiAgSWYgeW91IHdhbnQgdG8gZG8gdGhpbmdzLCBvdGhlciB0aGFuIGJ1ZworZml4ZXMsIHBsZWFzZSBtYWlsIG1lIHNvIHdlIGNhbiBzeW5jaHJvbml6ZS4KIAogRnJhbnMgdmFuIERvcnNzZWxhZXIKIGRvcnNzZWxAcnVsaG0xLkxlaWRlblVuaXYubmwKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2NvbWJvLmMgYi9jb250cm9scy9jb21iby5jCmluZGV4IDRjMjMxZjQuLmRhY2M3NjAgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2NvbWJvLmMKKysrIGIvY29udHJvbHMvY29tYm8uYwpAQCAtNzU2LDcgKzc1Niw3IEBACiAKICAgICBpZiAoKGxwaGMtPmR3U3R5bGUgJiAzKSA9PSBDQlNfRFJPUERPV05MSVNUKQogICAgICAgcmV0dXJuIENCX0VSUjsJLyogZXJyLCBkb2N1bWVudGVkIGZvciBDQlNldEVkaXRTZWwgKi8KLSAgICByZXR1cm4gU2VuZE1lc3NhZ2UxNihscGhjLT5oV25kRWRpdCwgRU1fR0VUU0VMLCAwLCAwKTsKKyAgICByZXR1cm4gU2VuZE1lc3NhZ2UxNihscGhjLT5oV25kRWRpdCwgRU1fR0VUU0VMMTYsIDAsIDApOwogfQogCiAKQEAgLTc3MCw3ICs3NzAsNyBAQAogCiAgICAgaWYgKChscGhjLT5kd1N0eWxlICYgMykgPT0gQ0JTX0RST1BET1dOTElTVCkKICAgICAgIHJldHVybiBDQl9FUlI7Ci0gICAgcmV0dXJuIFNlbmRNZXNzYWdlMTYobHBoYy0+aFduZEVkaXQsIEVNX1NFVFNFTCwgMCwgbFBhcmFtKTsKKyAgICByZXR1cm4gU2VuZE1lc3NhZ2UxNihscGhjLT5oV25kRWRpdCwgRU1fU0VUU0VMMTYsIDAsIGxQYXJhbSk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvZWRpdC5jIGIvY29udHJvbHMvZWRpdC5jCmluZGV4IDNjYjEzNzIuLmU1MzEwM2UgMTAwNjQ0Ci0tLSBhL2NvbnRyb2xzL2VkaXQuYworKysgYi9jb250cm9scy9lZGl0LmMKQEAgLTMsMTQgKzMsMTggQEAKICAqCiAgKglDb3B5cmlnaHQgIERhdmlkIFcuIE1ldGNhbGZlLCAxOTk0CiAgKglDb3B5cmlnaHQgIFdpbGxpYW0gTWFncm8sIDE5OTUsIDE5OTYKLSAqCUNvcHlyaWdodCAgRnJhbnMgdmFuIERvcnNzZWxhZXIsIDE5OTYKKyAqCUNvcHlyaWdodCAgRnJhbnMgdmFuIERvcnNzZWxhZXIsIDE5OTYsIDE5OTcKICAqCiAgKi8KIAogLyoKLSAqCVVOREVSIENPTlNUUlVDVElPTiwgcGxlYXNlIHJlYWQgRURJVC5UT0RPCisgKglwbGVhc2UgcmVhZCBFRElULlRPRE8gKGFuZCB1cGRhdGUgaXQgd2hlbiB5b3UgY2hhbmdlIHRoaW5ncykKKyAqCUl0IGFsc28gY29udGFpbnMgYSBkaXNjdXNzaW9uIGFib3V0IHRoZSAxNiB0byAzMiBiaXQgdHJhbnNpdGlvbi4KKyAqCiAgKi8KIAorCisjZGVmaW5lIE5PX1RSQU5TSVRJT05fVFlQRVMJLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTIwLDkgKzI0LDEyIEBACiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKKy8qCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyovCiAKICNkZWZpbmUgQlVGTElNSVRfTVVMVEkJCTY1NTM0CS8qIG1heGltdW0gdGV4dCBidWZmZXIgbGVuZ3RoIChub3QgaW5jbHVkaW5nICdcMCcpICovCisJCQkJCS8qIEZJWE1FOiBCVFcsIG5ldyBzcGVjcyBzYXkgNjU1MzUgKGRvIHlvdSBkYXJlID8/PykgKi8KICNkZWZpbmUgQlVGTElNSVRfU0lOR0xFCQkzMjc2NgogI2RlZmluZSBCVUZTVEFSVF9NVUxUSQkJMTAyNAkvKiBzdGFydGluZyBsZW5ndGggZm9yIG11bHRpLWxpbmUgY29udHJvbCAqLwogI2RlZmluZSBCVUZTVEFSVF9TSU5HTEUJCTI1NgkvKiBzdGFydGluZyBsZW5ndGggZm9yIHNpbmdsZSBsaW5lIGNvbnRyb2wgKi8KQEAgLTM5LDM4ICs0Niw3MyBAQAogfSBMSU5FX0VORDsKIAogdHlwZWRlZiBzdHJ1Y3QgewotCVVJTlQgb2Zmc2V0OwotCVVJTlQgbGVuZ3RoOworCUlOVDMyIG9mZnNldDsKKwlJTlQzMiBsZW5ndGg7CiAJTElORV9FTkQgZW5kaW5nOwogfSBMSU5FREVGOwogCiB0eXBlZGVmIHN0cnVjdAogewotCVVJTlQgVGV4dFdpZHRoOwkJLyogd2lkdGggb2YgdGhlIHdpZGVzdCBsaW5lIGluIHBpeGVscyAqLwotCUhMT0NBTDE2IGhCdWY7Ci0JY2hhciAqdGV4dDsKLQlIRk9OVDE2IGhGb250OwotCUxJTkVERUYgKkxpbmVEZWZzOwotCVVJTlQgWE9mZnNldDsJCS8qIG9mZnNldCBvZiB0aGUgdmlld3BvcnQgaW4gcGl4ZWxzICovCi0JVUlOVCBGaXJzdFZpc2libGVMaW5lOwotCVVJTlQgTGluZUNvdW50OwotCVVJTlQgTGluZUhlaWdodDsJLyogaGVpZ2h0IG9mIGEgc2NyZWVuIGxpbmUgaW4gcGl4ZWxzICovCi0JVUlOVCBBdmVDaGFyV2lkdGg7CS8qIGF2ZXJhZ2UgY2hhcmFjdGVyIHdpZHRoIGluIHBpeGVscyAqLwotCVVJTlQgQnVmTGltaXQ7Ci0JVUlOVCBCdWZTaXplOwotCUJPT0wgVGV4dENoYW5nZWQ7Ci0JQk9PTCBSZWRyYXc7Ci0JVUlOVCBTZWxTdGFydDsJCS8qIG9mZnNldCBvZiBzZWxlY3Rpb24gc3RhcnQsID09IFNlbEVuZCBpZiBubyBzZWxlY3Rpb24gKi8KLQlVSU5UIFNlbEVuZDsJCS8qIG9mZnNldCBvZiBzZWxlY3Rpb24gZW5kID09IGN1cnJlbnQgY2FyZXQgcG9zaXRpb24gKi8KLQlVSU5UIE51bVRhYlN0b3BzOworCUhMT0NBTDE2IGhCdWYxNjsJLyogRm9yIHdoZW4gYSAxNi1iaXQgbXVsdGlsaW5lIGVkaXQKKwkJCQkgKiBjb250cm9sIGdldHMgYSBFTV9HRVRIQU5ETEUgKHdoaWNoCisJCQkJICogc2hvdWxkIHJldHVybiAxNi1iaXQgbG9jYWwgaGVhcCkuCisJCQkJICogRnJvbSB0aGF0IHBvaW50IG9uIHdlIF9oYXZlXyB0byBrZWVwCisJCQkJICogdXNpbmcgMTYtYml0IGxvY2FsIGhlYXAgKGFwcHMgcmVseQorCQkJCSAqIG9uIHRoYXQgLi4uIGJ1bW1lcikuCisJCQkJICovCisJSExPQ0FMMzIgaEJ1ZjMyOwkvKiBEb24ndCB3b3JyeSBhYm91dCAnTE9DQUwnLiAgTE9DQUwzMiBpcworCQkJCSAqIGlkZW50aWNhbCB0byBHTE9CQUwzMiwgd2hpY2ggaXMKKwkJCQkgKiBlc3NlbnRpYWxseSBhIEhBTkRMRTMyIGNyZWF0ZWQgd2l0aAorCQkJCSAqIEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAuLi4pIHBsdXMKKwkJCQkgKiBhIGdsb2JhbDMyIChhbmQgdGh1cyBsb2NhbDMyKQorCQkJCSAqIGRlc2NyaXB0b3IsIHdoaWNoIHdlIGNhbiByZXR1cm4gdXBvbgorCQkJCSAqIEVNX0dFVEhBTkRMRTMyLgorCQkJCSAqIEl0IGlzIDMyLWJpdCBsaW5lYXIgYWRkcmVzc2luZywgc28KKwkJCQkgKiBldmVyeXRoaW5nIGlzIGZpbmUuCisJCQkJICovCisJTFBTVFIgdGV4dDsJCS8qIERlcGVuZGluZyBvbiB0aGUgZmFjdCB0aGF0IHdlIGFyZSBhCisJCQkJICogMTYgb3IgMzIgYml0IGNvbnRyb2wsIHRoaXMgaXMgdGhlCisJCQkJICogcG9pbnRlciB0aGF0IHdlIGdldCBhZnRlcgorCQkJCSAqIExvY2FsTG9jazMyKGhCdWYyMykgKHdoaWNoIGlzIGEgdHlwZWNhc3QgOi0pCisJCQkJICogb3IgTE9DQUxfTG9jayhoQnVmMTYpLgorCQkJCSAqIFRoaXMgaXMgYWx3YXlzIGEgMzItYml0IGxpbmVhciBwb2ludGVyLgorCQkJCSAqLworCUhGT05UMzIgaEZvbnQ7CisJTElORURFRiAqTGluZURlZnM7CS8qIEludGVybmFsIHRhYmxlIGZvciAoc29mdCkgbGluZWJyZWFrcyAqLworCUlOVDMyIFRleHRXaWR0aDsJLyogd2lkdGggb2YgdGhlIHdpZGVzdCBsaW5lIGluIHBpeGVscyAqLworCUlOVDMyIFhPZmZzZXQ7CQkvKiBvZmZzZXQgb2YgdGhlIHZpZXdwb3J0IGluIHBpeGVscyAqLworCUlOVDMyIEZpcnN0VmlzaWJsZUxpbmU7CisJSU5UMzIgTGluZUNvdW50OworCUlOVDMyIExpbmVIZWlnaHQ7CS8qIGhlaWdodCBvZiBhIHNjcmVlbiBsaW5lIGluIHBpeGVscyAqLworCUlOVDMyIEF2ZUNoYXJXaWR0aDsJLyogYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGggaW4gcGl4ZWxzICovCisJSU5UMzIgQnVmTGltaXQ7CisJSU5UMzIgQnVmU2l6ZTsKKwlCT09MMzIgVGV4dENoYW5nZWQ7CisJQk9PTDMyIENhblVuZG87CisJQk9PTDMyIFJlZHJhdzsKKwlJTlQzMiBTZWxTdGFydDsJCS8qIG9mZnNldCBvZiBzZWxlY3Rpb24gc3RhcnQsID09IFNlbEVuZCBpZiBubyBzZWxlY3Rpb24gKi8KKwlJTlQzMiBTZWxFbmQ7CQkvKiBvZmZzZXQgb2Ygc2VsZWN0aW9uIGVuZCA9PSBjdXJyZW50IGNhcmV0IHBvc2l0aW9uICovCisJSU5UMzIgTnVtVGFiU3RvcHM7CiAJTFBJTlQxNiBUYWJTdG9wczsKLQlFRElUV09SREJSRUFLUFJPQyBXb3JkQnJlYWtQcm9jOwotCWNoYXIgUGFzc3dvcmRDaGFyOworCS8qCisJICoJRklYTUU6IFRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2JhYmx5IGJlIGEgKFZPSUQgKikgdGhhdCBpcworCSAqCXR5cGVjYXN0IHRvIGVpdGhlciAxNi0gb3IgMzItYml0IGNhbGxiYWNrIHdoZW4gdXNlZCwKKwkgKglkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgZWRpdCBjb250cm9sICgxNiBvciAzMiBiaXQpLgorCSAqCisJICoJRURJVFdPUkRCUkVBS1BST0MgV29yZEJyZWFrUHJvYzsKKwkgKgorCSAqCUZvciBub3c6IG5vIG1vcmUgYXBwbGljYXRpb24gc3BlY2lmaWMgd29yZGJyZWFraW5nLgorCSAqCShJbnRlcm5hbCB3b3JkYnJlYWsgZnVuY3Rpb24gc3RpbGwgd29ya3MpCisJICovCisJQ0hBUiBQYXNzd29yZENoYXI7CisJSU5UMzIgTGVmdE1hcmdpbjsKKwlJTlQzMiBSaWdodE1hcmdpbjsKKwlSRUNUMzIgRm9ybWF0UmVjdDsKIH0gRURJVFNUQVRFOwogCiAKLSNkZWZpbmUgU1dBUF9VSU5UKHgseSkgZG8geyBVSU5UIHRlbXAgPSAoVUlOVCkoeCk7ICh4KSA9IChVSU5UKSh5KTsgKHkpID0gdGVtcDsgfSB3aGlsZSgwKQotI2RlZmluZSBPUkRFUl9VSU5UKHgseSkgZG8geyBpZiAoKFVJTlQpKHkpIDwgKFVJTlQpKHgpKSBTV0FQX1VJTlQoKHgpLCh5KSk7IH0gd2hpbGUoMCkKKyNkZWZpbmUgU1dBUF9JTlQzMih4LHkpIGRvIHsgSU5UMzIgdGVtcCA9IChJTlQzMikoeCk7ICh4KSA9IChJTlQzMikoeSk7ICh5KSA9IHRlbXA7IH0gd2hpbGUoMCkKKyNkZWZpbmUgT1JERVJfSU5UMzIoeCx5KSBkbyB7IGlmICgoSU5UMzIpKHkpIDwgKElOVDMyKSh4KSkgU1dBUF9JTlQzMigoeCksKHkpKTsgfSB3aGlsZSgwKQogCiAvKiBtYWNyb3MgdG8gYWNjZXNzIHdpbmRvdyBzdHlsZXMgKi8KICNkZWZpbmUgSXNNdWx0aUxpbmUod25kUHRyKSAoKHduZFB0ciktPmR3U3R5bGUgJiBFU19NVUxUSUxJTkUpCkBAIC04NiwxNSArMTI4LDE5IEBACiAKICNkZWZpbmUgRURJVF9TRU5EX0NUTENPTE9SKHduZFB0cixoZGMpIFwKICAgICAoU2VuZE1lc3NhZ2UzMkEoKHduZFB0ciktPnBhcmVudC0+aHduZFNlbGYsIFdNX0NUTENPTE9SRURJVCwgXAotICAgICAgICAgICAgICAgICAgICAoV1BBUkFNMzIpKGhkYyksIChMUEFSQU0pKHduZFB0ciktPmh3bmRTZWxmICkpCisJCSAgICAoV1BBUkFNMzIpKGhkYyksIChMUEFSQU0pKHduZFB0ciktPmh3bmRTZWxmICkpCiAjZGVmaW5lIEVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIHdOb3RpZnlDb2RlKSBcCiAgICAgKFNlbmRNZXNzYWdlMzJBKCh3bmRQdHIpLT5wYXJlbnQtPmh3bmRTZWxmLCBXTV9DT01NQU5ELCBcCi0gICAgICAgICAgICAgICAgICAgIE1BS0VXUEFSQU0oKHduZFB0ciktPndJRG1lbnUsIHdOb3RpZnlDb2RlKSwgXAotICAgICAgICAgICAgICAgICAgICAoTFBBUkFNKSh3bmRQdHIpLT5od25kU2VsZiApKQotI2RlZmluZSBEUFJJTlRGX0VESVRfTVNHKHN0cikgXAorCQkgICAgTUFLRVdQQVJBTSgod25kUHRyKS0+d0lEbWVudSwgd05vdGlmeUNvZGUpLCBcCisJCSAgICAoTFBBUkFNKSh3bmRQdHIpLT5od25kU2VsZiApKQorI2RlZmluZSBEUFJJTlRGX0VESVRfTVNHMTYoc3RyKSBcCiAgICAgZHByaW50Zl9lZGl0KHN0ZGRlYiwgXAotICAgICAgICAgICAgICAgICAiZWRpdDogIiBzdHIgIjogaHduZD0lMDR4LCB3UGFyYW09JTA0eCwgbFBhcmFtPSUwOHhcbiIsIFwKLSAgICAgICAgICAgICAgICAgKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCisJCSAiZWRpdDogMTYgYml0IDogIiBzdHIgIjogaHduZD0lMDh4LCB3UGFyYW09JTA4eCwgbFBhcmFtPSUwOHhcbiAgIiwgXAorCQkgKFVJTlQzMilod25kLCAoVUlOVDMyKXdQYXJhbSwgKFVJTlQzMilsUGFyYW0pCisjZGVmaW5lIERQUklOVEZfRURJVF9NU0czMihzdHIpIFwKKyAgICBkcHJpbnRmX2VkaXQoc3RkZGViLCBcCisJCSAiZWRpdDogMzIgYml0IDogIiBzdHIgIjogaHduZD0lMDh4LCB3UGFyYW09JTA4eCwgbFBhcmFtPSUwOHhcbiIsIFwKKwkJIChVSU5UMzIpaHduZCwgKFVJTlQzMil3UGFyYW0sIChVSU5UMzIpbFBhcmFtKQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNCw3NiArMTUwLDg0IEBACiAgKglGaWxlcyBsaWtlIHRoZXNlIHNob3VsZCByZWFsbHkgYmUga2VwdCBpbiBhbHBoYWJldGljYWwgb3JkZXIuCiAgKgogICovCi1MUkVTVUxUIEVkaXRXbmRQcm9jKEhXTkQgaHduZCwgVUlOVCBtc2csIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitMUkVTVUxUIEVkaXRXbmRQcm9jKEhXTkQzMiBod25kLCBVSU5UMzIgbXNnLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogCiBzdGF0aWMgdm9pZCAgICBFRElUX0J1aWxkTGluZURlZnMoV05EICp3bmRQdHIpOwotc3RhdGljIElOVCAgICAgRURJVF9DYWxsV29yZEJyZWFrUHJvYyhXTkQgKnduZFB0ciwgY2hhciAqcywgSU5UIGluZGV4LCBJTlQgY291bnQsIElOVCBhY3Rpb24pOwotc3RhdGljIFVJTlQgICAgRURJVF9Db2xGcm9tV25kWChXTkQgKnduZFB0ciwgVUlOVCBsaW5lLCBJTlQgeCk7CitzdGF0aWMgSU5UMzIgICBFRElUX0NhbGxXb3JkQnJlYWtQcm9jKFdORCAqd25kUHRyLCBMUFNUUiBzLCBJTlQzMiBpbmRleCwgSU5UMzIgY291bnQsIElOVDMyIGFjdGlvbik7CitzdGF0aWMgSU5UMzIgICBFRElUX0NvbEZyb21XbmRYKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lLCBJTlQzMiB4KTsKIHN0YXRpYyB2b2lkICAgIEVESVRfRGVsRW5kKFdORCAqd25kUHRyKTsKIHN0YXRpYyB2b2lkICAgIEVESVRfRGVsTGVmdChXTkQgKnduZFB0cik7CiBzdGF0aWMgdm9pZCAgICBFRElUX0RlbFJpZ2h0KFdORCAqd25kUHRyKTsKLXN0YXRpYyBVSU5UICAgIEVESVRfR2V0QXZlQ2hhcldpZHRoKFdORCAqd25kUHRyKTsKLXN0YXRpYyBVSU5UICAgIEVESVRfR2V0TGluZUhlaWdodChXTkQgKnduZFB0cik7Ci1zdGF0aWMgdm9pZCAgICBFRElUX0dldExpbmVSZWN0KFdORCAqd25kUHRyLCBVSU5UIGxpbmUsIFVJTlQgc2NvbCwgVUlOVCBlY29sLCBMUFJFQ1QxNiByYyk7Ci1zdGF0aWMgY2hhciAqICBFRElUX0dldFBvaW50ZXIoV05EICp3bmRQdHIpOwotc3RhdGljIGNoYXIgKiAgRURJVF9HZXRQYXNzd29yZFBvaW50ZXIoV05EICp3bmRQdHIpOwotc3RhdGljIExSRVNVTFQgRURJVF9HZXRSZWN0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIEJPT0wgICAgRURJVF9HZXRSZWRyYXcoV05EICp3bmRQdHIpOwotc3RhdGljIExSRVNVTFQgRURJVF9HZXRTZWwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgVUlOVCAgICBFRElUX0dldFRleHRXaWR0aChXTkQgKnduZFB0cik7Ci1zdGF0aWMgVUlOVCAgICBFRElUX0dldFZpc2libGVMaW5lQ291bnQoV05EICp3bmRQdHIpOwotc3RhdGljIFVJTlQgICAgRURJVF9HZXRXbmRXaWR0aChXTkQgKnduZFB0cik7Ci1zdGF0aWMgVUlOVCAgICBFRElUX0dldFhPZmZzZXQoV05EICp3bmRQdHIpOwotc3RhdGljIHZvaWQgICAgRURJVF9JbnZhbGlkYXRlVGV4dChXTkQgKnduZFB0ciwgVUlOVCBzdGFydCwgVUlOVCBlbmQpOwotc3RhdGljIFVJTlQgICAgRURJVF9MaW5lRnJvbVduZFkoV05EICp3bmRQdHIsIElOVCB5KTsKLXN0YXRpYyBCT09MICAgIEVESVRfTWFrZUZpdChXTkQgKnduZFB0ciwgVUlOVCBzaXplKTsKLXN0YXRpYyB2b2lkICAgIEVESVRfTW92ZUJhY2t3YXJkKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX01vdmVEb3dud2FyZChXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpOwotc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlRW5kKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX01vdmVGb3J3YXJkKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX01vdmVIb21lKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX01vdmVQYWdlRG93bihXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpOwotc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlUGFnZVVwKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX01vdmVVcHdhcmQoV05EICp3bmRQdHIsIEJPT0wgZXh0ZW5kKTsKLXN0YXRpYyB2b2lkICAgIEVESVRfTW92ZVdvcmRCYWNrd2FyZChXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpOwotc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlV29yZEZvcndhcmQoV05EICp3bmRQdHIsIEJPT0wgZXh0ZW5kKTsKLXN0YXRpYyB2b2lkICAgIEVESVRfUGFpbnRMaW5lKFdORCAqd25kUHRyLCBIREMzMiBoZGMsIFVJTlQgbGluZSwgQk9PTCByZXYpOwotc3RhdGljIFVJTlQgICAgRURJVF9QYWludFRleHQoV05EICp3bmRQdHIsIEhEQzMyIGhkYywgSU5UIHgsIElOVCB5LCBVSU5UIGxpbmUsIFVJTlQgY29sLCBVSU5UIGNvdW50LCBCT09MIHJldik7CitzdGF0aWMgSU5UMzIgICBFRElUX0dldEF2ZUNoYXJXaWR0aChXTkQgKnduZFB0cik7CitzdGF0aWMgSU5UMzIgICBFRElUX0dldExpbmVIZWlnaHQoV05EICp3bmRQdHIpOworc3RhdGljIHZvaWQgICAgRURJVF9HZXRMaW5lUmVjdChXTkQgKnduZFB0ciwgSU5UMzIgbGluZSwgSU5UMzIgc2NvbCwgSU5UMzIgZWNvbCwgTFBSRUNUMzIgcmMpOworc3RhdGljIExQU1RSICAgRURJVF9HZXRQb2ludGVyKFdORCAqd25kUHRyKTsKK3N0YXRpYyBMUFNUUiAgIEVESVRfR2V0UGFzc3dvcmRQb2ludGVyKFdORCAqd25kUHRyKTsKK3N0YXRpYyBCT09MMzIgIEVESVRfR2V0UmVkcmF3KFdORCAqd25kUHRyKTsKK3N0YXRpYyB2b2lkICAgIEVESVRfR2V0U2VsKFdORCAqd25kUHRyLCBMUElOVDMyIHMsIExQSU5UMzIgZSk7CitzdGF0aWMgSU5UMzIgICBFRElUX0dldFRleHRXaWR0aChXTkQgKnduZFB0cik7CitzdGF0aWMgSU5UMzIgICBFRElUX0dldFZpc2libGVMaW5lQ291bnQoV05EICp3bmRQdHIpOworc3RhdGljIElOVDMyICAgRURJVF9HZXRXbmRXaWR0aChXTkQgKnduZFB0cik7CitzdGF0aWMgSU5UMzIgICBFRElUX0dldFhPZmZzZXQoV05EICp3bmRQdHIpOworc3RhdGljIHZvaWQgICAgRURJVF9JbnZhbGlkYXRlVGV4dChXTkQgKnduZFB0ciwgSU5UMzIgc3RhcnQsIElOVDMyIGVuZCk7CitzdGF0aWMgSU5UMzIgICBFRElUX0xpbmVGcm9tV25kWShXTkQgKnduZFB0ciwgSU5UMzIgeSk7CitzdGF0aWMgQk9PTDMyICBFRElUX01ha2VGaXQoV05EICp3bmRQdHIsIElOVDMyIHNpemUpOworc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlQmFja3dhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOworc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlRG93bndhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOworc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlRW5kKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKTsKK3N0YXRpYyB2b2lkICAgIEVESVRfTW92ZUZvcndhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOworc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlSG9tZShXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCk7CitzdGF0aWMgdm9pZCAgICBFRElUX01vdmVQYWdlRG93bihXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCk7CitzdGF0aWMgdm9pZCAgICBFRElUX01vdmVQYWdlVXAoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpOworc3RhdGljIHZvaWQgICAgRURJVF9Nb3ZlVXB3YXJkKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKTsKK3N0YXRpYyB2b2lkICAgIEVESVRfTW92ZVdvcmRCYWNrd2FyZChXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCk7CitzdGF0aWMgdm9pZCAgICBFRElUX01vdmVXb3JkRm9yd2FyZChXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCk7CitzdGF0aWMgdm9pZCAgICBFRElUX1BhaW50TGluZShXTkQgKnduZFB0ciwgSERDMzIgaGRjLCBJTlQzMiBsaW5lLCBCT09MMzIgcmV2KTsKK3N0YXRpYyBJTlQzMiAgIEVESVRfUGFpbnRUZXh0KFdORCAqd25kUHRyLCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIElOVDMyIGxpbmUsIElOVDMyIGNvbCwgSU5UMzIgY291bnQsIEJPT0wzMiByZXYpOwogc3RhdGljIHZvaWQgICAgRURJVF9SZWxlYXNlUG9pbnRlcihXTkQgKnduZFB0cik7Ci1zdGF0aWMgTFJFU1VMVCBFRElUX1JlcGxhY2VTZWwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7Ci1zdGF0aWMgdm9pZCAgICBFRElUX1Njcm9sbEludG9WaWV3KFdORCAqd25kUHRyKTsKLXN0YXRpYyBJTlQgICAgIEVESVRfV25kWEZyb21Db2woV05EICp3bmRQdHIsIFVJTlQgbGluZSwgVUlOVCBjb2wpOwotc3RhdGljIElOVCAgICAgRURJVF9XbmRZRnJvbUxpbmUoV05EICp3bmRQdHIsIFVJTlQgbGluZSk7Ci1zdGF0aWMgSU5UICAgICBFRElUX1dvcmRCcmVha1Byb2MoY2hhciAqcywgSU5UIGluZGV4LCBJTlQgY291bnQsIElOVCBhY3Rpb24pOworc3RhdGljIElOVDMyICAgRURJVF9XbmRYRnJvbUNvbChXTkQgKnduZFB0ciwgSU5UMzIgbGluZSwgSU5UMzIgY29sKTsKK3N0YXRpYyBJTlQzMiAgIEVESVRfV25kWUZyb21MaW5lKFdORCAqd25kUHRyLCBJTlQzMiBsaW5lKTsKK3N0YXRpYyBJTlQzMiAgIEVESVRfV29yZEJyZWFrUHJvYyhMUFNUUiBzLCBJTlQzMiBpbmRleCwgSU5UMzIgY291bnQsIElOVDMyIGFjdGlvbik7CiAKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2FuVW5kbyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2hhckZyb21Qb3MoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fRm10TGluZXMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEhhbmRsZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldExpbWl0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0TGluZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0TGluZUNvdW50KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRNYXJnaW5zKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRNb2RpZnkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFBhc3N3b3JkQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0UmVjdChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0UmVjdDE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRTZWwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFRodW1iKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRXb3JkQnJlYWtQcm9jKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwotc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW1pdFRleHQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUluZGV4KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lTGVuZ3RoKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9Qb3NGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fUmVwbGFjZVNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TY3JvbGxDYXJldChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0SGFuZGxlKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRIYW5kbGUxNihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0TGltaXRUZXh0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRNYXJnaW5zKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRNb2RpZnkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFBhc3N3b3JkQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UmVhZE9ubHkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFJlY3QoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFJlY3ROUChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0U2VsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pOworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRTZWwxNihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKTsKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0VGFiU3RvcHMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFRhYlN0b3BzMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFdvcmRCcmVha1Byb2MoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1VuZG8oV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiAKQEAgLTIxMSwyMiArMjY1LDIyIEBACiAgKgogICoJR2VuZXJhbCBzaG9ydGN1dHMgZm9yIHZhcmlhYmxlIG5hbWVzOgogICoKLSAqCVVJTlQgbDsJCWxpbmUKLSAqCVVJTlQgYzsJCWNvbHVtbgotICoJVUlOVCBzOwkJb2Zmc2V0IG9mIHNlbGVjdGlvbiBzdGFydAotICoJVUlOVCBlOwkJb2Zmc2V0IG9mIHNlbGVjdGlvbiBlbmQKLSAqCVVJTlQgc2w7CWxpbmUgb24gd2hpY2ggdGhlIHNlbGVjdGlvbiBzdGFydHMKLSAqCVVJTlQgZWw7CWxpbmUgb24gd2hpY2ggdGhlIHNlbGVjdGlvbiBlbmRzCi0gKglVSU5UIHNjOwljb2x1bW4gb24gd2hpY2ggdGhlIHNlbGVjdGlvbiBzdGFydHMKLSAqCVVJTlQgZWM7CWNvbHVtbiBvbiB3aGljaCB0aGUgc2VsZWN0aW9uIGVuZHMKLSAqCVVJTlQgbGk7CWxpbmUgaW5kZXggKG9mZnNldCkKLSAqCVVJTlQgZnY7CWZpcnN0IHZpc2libGUgbGluZQotICoJVUlOVCB2bGM7CXZpc3NpYmxlIGxpbmUgY291bnQKLSAqCVVJTlQgbGM7CWxpbmUgY291bnQKLSAqCVVJTlQgbGg7CWxpbmUgaGVpZ2h0IChpbiBwaXhlbHMpCi0gKglVSU5UIHR3Owl0ZXh0IHdpZHRoIChpbiBwaXhlbHMpCi0gKglVSU5UIHd3Owl3aW5kb3cgd2lkdGggKGluIHBpeGVscykKLSAqCVVJTlQgY3c7CWNoYXJhY3RlciB3aWR0aCAoYXZlcmFnZSwgaW4gcGl4ZWxzKQorICoJSU5UMzIgbDsJbGluZQorICoJSU5UMzIgYzsJY29sdW1uCisgKglJTlQzMiBzOwlvZmZzZXQgb2Ygc2VsZWN0aW9uIHN0YXJ0CisgKglJTlQzMiBlOwlvZmZzZXQgb2Ygc2VsZWN0aW9uIGVuZAorICoJSU5UMzIgc2w7CWxpbmUgb24gd2hpY2ggdGhlIHNlbGVjdGlvbiBzdGFydHMKKyAqCUlOVDMyIGVsOwlsaW5lIG9uIHdoaWNoIHRoZSBzZWxlY3Rpb24gZW5kcworICoJSU5UMzIgc2M7CWNvbHVtbiBvbiB3aGljaCB0aGUgc2VsZWN0aW9uIHN0YXJ0cworICoJSU5UMzIgZWM7CWNvbHVtbiBvbiB3aGljaCB0aGUgc2VsZWN0aW9uIGVuZHMKKyAqCUlOVDMyIGxpOwlsaW5lIGluZGV4IChvZmZzZXQpCisgKglJTlQzMiBmdjsJZmlyc3QgdmlzaWJsZSBsaW5lCisgKglJTlQzMiB2bGM7CXZpc3NpYmxlIGxpbmUgY291bnQKKyAqCUlOVDMyIGxjOwlsaW5lIGNvdW50CisgKglJTlQzMiBsaDsJbGluZSBoZWlnaHQgKGluIHBpeGVscykKKyAqCUlOVDMyIHR3Owl0ZXh0IHdpZHRoIChpbiBwaXhlbHMpCisgKglJTlQzMiB3dzsJd2luZG93IHdpZHRoIChpbiBwaXhlbHMpCisgKglJTlQzMiBjdzsJY2hhcmFjdGVyIHdpZHRoIChhdmVyYWdlLCBpbiBwaXhlbHMpCiAgKgogICovCiAKQEAgLTIzNSwyNTUgKzI4OSw0OTYgQEAKICAqCiAgKglFZGl0V25kUHJvYygpCiAgKgorICoJVGhlIG1lc3NhZ2VzIGFyZSBpbiB0aGUgb3JkZXIgb2YgdGhlIGFjdHVhbCBpbnRlZ2VyIHZhbHVlcworICoJKHdoaWNoIGNhbiBiZSBmb3VuZCBpbiBpbmNsdWRlL3dpbmRvd3MuaCkKKyAqCVdoZXJlZXZlciBwb3NzaWJsZSB0aGUgMTYgYml0IHZlcnNpb25zIGFyZSBjb252ZXJ0ZWQgdG8KKyAqCXRoZSAzMiBiaXQgb25lcywgc28gdGhhdCB3ZSBjYW4gJ2ZhbGwgdGhyb3VnaCcgdG8gdGhlCisgKgloZWxwZXIgZnVuY3Rpb25zLiAgVGhlc2UgYXJlIG1vc3RseSAzMiBiaXQgKHdpdGggYSBmZXcKKyAqCWV4Y2VwdGlvbnMsIGNsZWFybHkgaW5kaWNhdGVkIGJ5IGEgJzE2JyBleHRlbnNpb24gdG8gdGhlaXIKKyAqCW5hbWVzKS4KKyAqCiAgKi8KLUxSRVNVTFQgRWRpdFduZFByb2MoSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNMTYgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBFZGl0V25kUHJvYyhIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUxSRVNVTFQgbFJlc3VsdCA9IDBMOworCUxSRVNVTFQgbFJlc3VsdCA9IDA7CiAJV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKTsKIAogCWlmICgoIUVESVRTVEFURVBUUih3bmRQdHIpKSAmJiAobXNnICE9IFdNX0NSRUFURSkpCi0JCXJldHVybiBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJCXJldHVybiBEZWZXaW5kb3dQcm9jMzJBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCiAJc3dpdGNoIChtc2cpIHsKLQljYXNlIEVNX0NBTlVORE86Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0NBTlVORE8iKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fQ2FuVW5kbyh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9FTVBUWVVORE9CVUZGRVI6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0VNUFRZVU5ET0JVRkZFUiIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fRk1UTElORVM6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0ZNVExJTkVTIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0ZtdExpbmVzKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX0dFVEZJUlNUVklTSUJMRUxJTkU6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0dFVEZJUlNUVklTSUJMRUxJTkUiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9HRVRIQU5ETEU6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0dFVEhBTkRMRSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRIYW5kbGUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fR0VUTElORToKLQkJRFBSSU5URl9FRElUX01TRygiRU1fR0VUTElORSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRMaW5lKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX0dFVExJTkVDT1VOVDoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fR0VUTElORUNPVU5UIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9HRVRNT0RJRlk6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0dFVE1PRElGWSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRNb2RpZnkod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fR0VUUEFTU1dPUkRDSEFSOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9HRVRQQVNTV09SRENIQVIiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0UGFzc3dvcmRDaGFyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX0dFVFJFQ1Q6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0dFVFJFQ1QiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0UmVjdCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9HRVRTRUw6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0dFVFNFTCIpOworCWNhc2UgRU1fR0VUU0VMMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUU0VMIik7CisJCXdQYXJhbSA9IDA7CisJCWxQYXJhbSA9IDA7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fR0VUU0VMMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUU0VMIik7CiAJCWxSZXN1bHQgPSBFRElUX0VNX0dldFNlbCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7Ci0JY2FzZSBFTV9HRVRUSFVNQjoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fR0VUVEhVTUIiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fR2V0VGh1bWIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisKKwljYXNlIEVNX1NFVFNFTDE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NFVFNFTCIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRTZWwxNih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7Ci0JY2FzZSBFTV9HRVRXT1JEQlJFQUtQUk9DOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9HRVRXT1JEQlJFQUtQUk9DIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0dldFdvcmRCcmVha1Byb2Mod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fTElNSVRURVhUOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9MSU1JVFRFWFQiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fTGltaXRUZXh0KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX0xJTkVGUk9NQ0hBUjoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fTElORUZST01DSEFSIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9MSU5FSU5ERVg6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0xJTkVJTkRFWCIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fTElORUxFTkdUSDoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fTElORUxFTkdUSCIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX0xJTkVTQ1JPTEw6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX0xJTkVTQ1JPTEwiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fTGluZVNjcm9sbCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9SRVBMQUNFU0VMOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9SRVBMQUNFU0VMIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fU0NST0xMOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9TQ1JPTEwiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fU2Nyb2xsKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotIAkJYnJlYWs7Ci0JY2FzZSBFTV9TRVRIQU5ETEU6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX1NFVEhBTkRMRSIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRIYW5kbGUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fU0VUTU9ESUZZOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9TRVRNT0RJRlkiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwotCQlicmVhazsKLQljYXNlIEVNX1NFVFBBU1NXT1JEQ0hBUjoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fU0VUUEFTU1dPUkRDSEFSIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1NldFBhc3N3b3JkQ2hhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9TRVRSRUFET05MWToKLQkJRFBSSU5URl9FRElUX01TRygiRU1fU0VUUkVBRE9OTFkiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UmVhZE9ubHkod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0gCQlicmVhazsKLQljYXNlIEVNX1NFVFJFQ1Q6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX1NFVFJFQ1QiKTsKLQkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UmVjdCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKLQkJYnJlYWs7Ci0JY2FzZSBFTV9TRVRSRUNUTlA6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX1NFVFJFQ1ROUCIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRSZWN0TlAod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7Ci0JCWJyZWFrOwotCWNhc2UgRU1fU0VUU0VMOgotCQlEUFJJTlRGX0VESVRfTVNHKCJFTV9TRVRTRUwiKTsKKwljYXNlIEVNX1NFVFNFTDMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX1NFVFNFTCIpOwogCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRTZWwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOwotCWNhc2UgRU1fU0VUVEFCU1RPUFM6Ci0JCURQUklOVEZfRURJVF9NU0coIkVNX1NFVFRBQlNUT1BTIik7Ci0JCWxSZXN1bHQgPSBFRElUX0VNX1NldFRhYlN0b3BzKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCisJY2FzZSBFTV9HRVRSRUNUMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUUkVDVCIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRSZWN0MTYod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOwotCWNhc2UgRU1fU0VUV09SREJSRUFLUFJPQzoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fU0VUV09SREJSRUFLUFJPQyIpOwotCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRXb3JkQnJlYWtQcm9jKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCWNhc2UgRU1fR0VUUkVDVDMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0dFVFJFQ1QiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0UmVjdCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7Ci0JY2FzZSBFTV9VTkRPOgorCisJY2FzZSBFTV9TRVRSRUNUMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fU0VUUkVDVCIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX1NFVFJFQ1QzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRSRUNUIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1NldFJlY3Qod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9TRVRSRUNUTlAxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9TRVRSRUNUTlAiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9TRVRSRUNUTlAzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRSRUNUTlAiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UmVjdE5QKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fU0NST0xMMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fU0NST0xMIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fU0NST0xMMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0NST0xMIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1Njcm9sbCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKyAJCWJyZWFrOworCisJY2FzZSBFTV9MSU5FU0NST0xMMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fTElORVNDUk9MTCIpOworCQl3UGFyYW0gPSAoV1BBUkFNMzIpKElOVDMyKShJTlQxNilISVdPUkQobFBhcmFtKTsKKwkJbFBhcmFtID0gKExQQVJBTSkoSU5UMzIpKElOVDE2KUxPV09SRChsUGFyYW0pOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0xJTkVTQ1JPTEwzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9MSU5FU0NST0xMIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0xpbmVTY3JvbGwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9TQ1JPTExDQVJFVDE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NDUk9MTENBUkVUIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fU0NST0xMQ0FSRVQzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TQ1JPTExDQVJFVCIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX0dFVE1PRElGWTE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0dFVE1PRElGWSIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0dFVE1PRElGWTMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0dFVE1PRElGWSIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRNb2RpZnkod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9TRVRNT0RJRlkxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9TRVRNT0RJRlkiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9TRVRNT0RJRlkzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRNT0RJRlkiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VUTElORUNPVU5UMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUTElORUNPVU5UIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fR0VUTElORUNPVU5UMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUTElORUNPVU5UIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX0xJTkVJTkRFWDE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0xJTkVJTkRFWCIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0xJTkVJTkRFWDMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0xJTkVJTkRFWCIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9TRVRIQU5ETEUxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9TRVRIQU5ETEUiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0SGFuZGxlMTYod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCWNhc2UgRU1fU0VUSEFORExFMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0VUSEFORExFIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1NldEhhbmRsZSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX0dFVEhBTkRMRTE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0dFVEhBTkRMRSIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRIYW5kbGUxNih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisJY2FzZSBFTV9HRVRIQU5ETEUzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9HRVRIQU5ETEUiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0SGFuZGxlKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VUVEhVTUIxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9HRVRUSFVNQiIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0dFVFRIVU1CMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUVEhVTUIiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fR2V0VGh1bWIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJLyogbWVzc2FnZXMgMHgwMGJmIGFuZCAweDAwYzAgbWlzc2luZyBmcm9tIHNwZWNzICovCisKKwljYXNlIFdNX1VTRVIrMTU6CisJCURQUklOVEZfRURJVF9NU0cxNigidW5kb2N1bWVudGVkIFdNX1VTRVIrMTUsIHBsZWFzZSByZXBvcnQiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAweDAwYmY6CisJCURQUklOVEZfRURJVF9NU0czMigidW5kb2N1bWVudGVkIDB4MDBiZiwgcGxlYXNlIHJlcG9ydCIpOworCQlsUmVzdWx0ID0gRGVmV2luZG93UHJvYzMyQShod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIFdNX1VTRVIrMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigidW5kb2N1bWVudGVkIFdNX1VTRVIrMTYsIHBsZWFzZSByZXBvcnQiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAweDAwYzA6CisJCURQUklOVEZfRURJVF9NU0czMigidW5kb2N1bWVudGVkIDB4MDBjMCwgcGxlYXNlIHJlcG9ydCIpOworCQlsUmVzdWx0ID0gRGVmV2luZG93UHJvYzMyQShod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX0xJTkVMRU5HVEgxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9MSU5FTEVOR1RIIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fTElORUxFTkdUSDMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX0xJTkVMRU5HVEgiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX1JFUExBQ0VTRUwxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9SRVBMQUNFU0VMIik7CisJCWxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX1JFUExBQ0VTRUwzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9SRVBMQUNFU0VMIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJLyogbWVzc2FnZSAweDAwYzMgbWlzc2luZyBmcm9tIHNwZWNzICovCisKKwljYXNlIFdNX1VTRVIrMTk6CisJCURQUklOVEZfRURJVF9NU0cxNigidW5kb2N1bWVudGVkIFdNX1VTRVIrMTksIHBsZWFzZSByZXBvcnQiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAweDAwYzM6CisJCURQUklOVEZfRURJVF9NU0czMigidW5kb2N1bWVudGVkIDB4MDBjMywgcGxlYXNlIHJlcG9ydCIpOworCQlsUmVzdWx0ID0gRGVmV2luZG93UHJvYzMyQShod25kLCBtc2csIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX0dFVExJTkUxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9HRVRMSU5FIik7CisJCWxQYXJhbSA9IChMUEFSQU0pUFRSX1NFR19UT19MSU4oKFNFR1BUUilsUGFyYW0pOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0dFVExJTkUzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9HRVRMSU5FIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldExpbmUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9MSU1JVFRFWFQxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9MSU1JVFRFWFQiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9TRVRMSU1JVFRFWFQzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRMSU1JVFRFWFQiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0TGltaXRUZXh0KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fQ0FOVU5ETzE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0NBTlVORE8iKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9DQU5VTkRPMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fQ0FOVU5ETyIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9DYW5VbmRvKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fVU5ETzE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1VORE8iKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9VTkRPMzI6CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgV01fVU5ETzoKLQkJRFBSSU5URl9FRElUX01TRygiRU1fVU5ETyAvIFdNX1VORE8iKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9VTkRPIC8gV01fVU5ETyIpOwogCQlsUmVzdWx0ID0gRURJVF9FTV9VbmRvKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKworCWNhc2UgRU1fRk1UTElORVMxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9GTVRMSU5FUyIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX0ZNVExJTkVTMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fRk1UTElORVMiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fRm10TGluZXMod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9MSU5FRlJPTUNIQVIxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9MSU5FRlJPTUNIQVIiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9MSU5FRlJPTUNIQVIzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9MSU5FRlJPTUNIQVIiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCS8qIG1lc3NhZ2UgMHgwMGNhIG1pc3NpbmcgZnJvbSBzcGVjcyAqLworCisJY2FzZSBXTV9VU0VSKzI2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoInVuZG9jdW1lbnRlZCBXTV9VU0VSKzI2LCBwbGVhc2UgcmVwb3J0Iik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgMHgwMGNhOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoInVuZG9jdW1lbnRlZCAweDAwY2EsIHBsZWFzZSByZXBvcnQiKTsKKwkJbFJlc3VsdCA9IERlZldpbmRvd1Byb2MzMkEoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9TRVRUQUJTVE9QUzE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NFVFRBQlNUT1BTIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1NldFRhYlN0b3BzMTYod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCWNhc2UgRU1fU0VUVEFCU1RPUFMzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9TRVRUQUJTVE9QUyIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRUYWJTdG9wcyh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX1NFVFBBU1NXT1JEQ0hBUjE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NFVFBBU1NXT1JEQ0hBUiIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX1NFVFBBU1NXT1JEQ0hBUjMyOgorCQlEUFJJTlRGX0VESVRfTVNHMzIoIkVNX1NFVFBBU1NXT1JEQ0hBUiIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRQYXNzd29yZENoYXIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9FTVBUWVVORE9CVUZGRVIxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9FTVBUWVVORE9CVUZGRVIiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9FTVBUWVVORE9CVUZGRVIzMjoKKwkJRFBSSU5URl9FRElUX01TRzMyKCJFTV9FTVBUWVVORE9CVUZGRVIiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VURklSU1RWSVNJQkxFTElORTE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0dFVEZJUlNUVklTSUJMRUxJTkUiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9HRVRGSVJTVFZJU0lCTEVMSU5FMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VURklSU1RWSVNJQkxFTElORSIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fU0VUUkVBRE9OTFkxNjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9TRVRSRUFET05MWSIpOworCQkvKiBmYWxsIHRocm91Z2ggKi8KKwljYXNlIEVNX1NFVFJFQURPTkxZMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0VUUkVBRE9OTFkiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fU2V0UmVhZE9ubHkod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisgCQlicmVhazsKKworCWNhc2UgRU1fU0VUV09SREJSRUFLUFJPQzE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX1NFVFdPUkRCUkVBS1BST0MiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9TRVRXT1JEQlJFQUtQUk9DMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fU0VUV09SREJSRUFLUFJPQyIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9TZXRXb3JkQnJlYWtQcm9jKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VUV09SREJSRUFLUFJPQzE2OgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0dFVFdPUkRCUkVBS1BST0MiKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSBFTV9HRVRXT1JEQlJFQUtQUk9DMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUV09SREJSRUFLUFJPQyIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRXb3JkQnJlYWtQcm9jKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VUUEFTU1dPUkRDSEFSMTY6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUUEFTU1dPUkRDSEFSIik7CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgRU1fR0VUUEFTU1dPUkRDSEFSMzI6CisJCURQUklOVEZfRURJVF9NU0czMigiRU1fR0VUUEFTU1dPUkRDSEFSIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldFBhc3N3b3JkQ2hhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwkvKiBUaGUgZm9sbG93aW5nIEVNX3h4eCBhcmUgbmV3IHRvIHdpbjk1IGFuZCBkb24ndCBleGlzdCBmb3IgMTYgYml0ICovCisKKwljYXNlIEVNX1NFVE1BUkdJTlMzMjoKKwkJRFBSSU5URl9FRElUX01TRzE2KCJFTV9TRVRNQVJHSU5TIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX1NldE1hcmdpbnMod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9HRVRNQVJHSU5TMzI6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUTUFSR0lOUyIpOworCQlsUmVzdWx0ID0gRURJVF9FTV9HZXRNYXJnaW5zKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKworCWNhc2UgRU1fR0VUTElNSVRURVhUMzI6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fR0VUTElNSVRURVhUIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0dldExpbWl0VGV4dCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKKwkJYnJlYWs7CisKKwljYXNlIEVNX1BPU0ZST01DSEFSMzI6CisJCURQUklOVEZfRURJVF9NU0cxNigiRU1fUE9TRlJPTUNIQVIiKTsKKwkJbFJlc3VsdCA9IEVESVRfRU1fUG9zRnJvbUNoYXIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CisJCWJyZWFrOworCisJY2FzZSBFTV9DSEFSRlJPTVBPUzMyOgorCQlEUFJJTlRGX0VESVRfTVNHMTYoIkVNX0NIQVJGUk9NUE9TIik7CisJCWxSZXN1bHQgPSBFRElUX0VNX0NoYXJGcm9tUG9zKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOworCQlicmVhazsKKwogCWNhc2UgV01fR0VURExHQ09ERToKLQkJRFBSSU5URl9FRElUX01TRygiV01fR0VURExHQ09ERSIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0dFVERMR0NPREUiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fR2V0RGxnQ29kZSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX0NIQVI6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0NIQVIiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9DSEFSIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0NoYXIod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9DTEVBUjoKLQkJRFBSSU5URl9FRElUX01TRygiV01fQ0xFQVIiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9DTEVBUiIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9DbGVhcih3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX0NPUFk6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0NPUFkiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9DT1BZIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0NvcHkod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9DUkVBVEU6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0NSRUFURSIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NSRUFURSIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9DcmVhdGUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9DVVQ6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0NVVCIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0NVVCIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9DdXQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9ERVNUUk9ZOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9ERVNUUk9ZIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fREVTVFJPWSIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9EZXN0cm95KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fRU5BQkxFOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9FTkFCTEUiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9FTkFCTEUiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fRW5hYmxlKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fRVJBU0VCS0dORDoKLQkJRFBSSU5URl9FRElUX01TRygiV01fRVJBU0VCS0dORCIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0VSQVNFQktHTkQiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fRXJhc2VCa0duZCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX0dFVEZPTlQ6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0dFVEZPTlQiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9HRVRGT05UIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0dldEZvbnQod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9HRVRURVhUOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9HRVRURVhUIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fR0VUVEVYVCIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9HZXRUZXh0KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fR0VUVEVYVExFTkdUSDoKLQkJRFBSSU5URl9FRElUX01TRygiV01fR0VUVEVYVExFTkdUSCIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0dFVFRFWFRMRU5HVEgiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX0hTQ1JPTEw6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX0hTQ1JPTEwiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9IU0NST0xMIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0hTY3JvbGwod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9LRVlET1dOOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9LRVlET1dOIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fS0VZRE9XTiIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9LZXlEb3duKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fS0lMTEZPQ1VTOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9LSUxMRk9DVVMiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9LSUxMRk9DVVMiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fS2lsbEZvY3VzKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fTEJVVFRPTkRCTENMSzoKLQkJRFBSSU5URl9FRElUX01TRygiV01fTEJVVFRPTkRCTENMSyIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0xCVVRUT05EQkxDTEsiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fTEJ1dHRvbkRibENsayh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX0xCVVRUT05ET1dOOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9MQlVUVE9ORE9XTiIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX0xCVVRUT05ET1dOIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX0xCdXR0b25Eb3duKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fTEJVVFRPTlVQOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9MQlVUVE9OVVAiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9MQlVUVE9OVVAiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fTEJ1dHRvblVwKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fTU9VU0VNT1ZFOgogCQkvKgotCQkgKglEUFJJTlRGX0VESVRfTVNHKCJXTV9NT1VTRU1PVkUiKTsKKwkJICoJRFBSSU5URl9FRElUX01TRzMyKCJXTV9NT1VTRU1PVkUiKTsKIAkJICovCiAJCWxSZXN1bHQgPSBFRElUX1dNX01vdXNlTW92ZSh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX1BBSU5UOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9QQUlOVCIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1BBSU5UIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX1BhaW50KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fUEFTVEU6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX1BBU1RFIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fUEFTVEUiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fUGFzdGUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9TRVRDVVJTT1I6CiAJCS8qCi0JCSAqCURQUklOVEZfRURJVF9NU0coIldNX1NFVENVUlNPUiIpOworCQkgKglEUFJJTlRGX0VESVRfTVNHMzIoIldNX1NFVENVUlNPUiIpOwogCQkgKi8KIAkJbFJlc3VsdCA9IEVESVRfV01fU2V0Q3Vyc29yKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fU0VURk9DVVM6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX1NFVEZPQ1VTIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fU0VURk9DVVMiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fU2V0Rm9jdXMod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9TRVRGT05UOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9TRVRGT05UIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fU0VURk9OVCIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9TZXRGb250KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fU0VUUkVEUkFXOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9TRVRSRURSQVciKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9TRVRSRURSQVciKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWNhc2UgV01fU0VUVEVYVDoKLQkJRFBSSU5URl9FRElUX01TRygiV01fU0VUVEVYVCIpOworCQlEUFJJTlRGX0VESVRfTVNHMzIoIldNX1NFVFRFWFQiKTsKIAkJbFJlc3VsdCA9IEVESVRfV01fU2V0VGV4dCh3bmRQdHIsIHdQYXJhbSwgbFBhcmFtKTsKIAkJYnJlYWs7CisKIAljYXNlIFdNX1NJWkU6Ci0JCURQUklOVEZfRURJVF9NU0coIldNX1NJWkUiKTsKKwkJRFBSSU5URl9FRElUX01TRzMyKCJXTV9TSVpFIik7CiAJCWxSZXN1bHQgPSBFRElUX1dNX1NpemUod25kUHRyLCB3UGFyYW0sIGxQYXJhbSk7CiAJCWJyZWFrOworCiAJY2FzZSBXTV9WU0NST0xMOgotCQlEUFJJTlRGX0VESVRfTVNHKCJXTV9WU0NST0xMIik7CisJCURQUklOVEZfRURJVF9NU0czMigiV01fVlNDUk9MTCIpOwogCQlsUmVzdWx0ID0gRURJVF9XTV9WU2Nyb2xsKHduZFB0ciwgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKKwogCWRlZmF1bHQ6Ci0JCWxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jMTYoaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSk7CisJCWxSZXN1bHQgPSBEZWZXaW5kb3dQcm9jMzJBKGh3bmQsIG1zZywgd1BhcmFtLCBsUGFyYW0pOwogCQlicmVhazsKIAl9CiAJRURJVF9SZWxlYXNlUG9pbnRlcih3bmRQdHIpOwpAQCAtNTAzLDI4ICs3OTgsMjggQEAKIHN0YXRpYyB2b2lkIEVESVRfQnVpbGRMaW5lRGVmcyhXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JY2hhciAqdGV4dCA9IEVESVRfR2V0UGFzc3dvcmRQb2ludGVyKHduZFB0cik7Ci0JaW50IHd3ID0gRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpOworCUxQU1RSIHRleHQgPSBFRElUX0dldFBhc3N3b3JkUG9pbnRlcih3bmRQdHIpOworCUlOVDMyIHd3ID0gRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpOwogCUhEQzMyIGhkYzsKLQlIRk9OVDE2IGhGb250OworCUhGT05UMzIgaEZvbnQ7CiAJSEZPTlQzMiBvbGRGb250ID0gMDsKLQljaGFyICpzdGFydCwgKmNwOwotCWludCBwcmV2LCBuZXh0OwotCWludCB3aWR0aDsKLQlpbnQgbGVuZ3RoOworCUxQU1RSIHN0YXJ0LCBjcDsKKwlJTlQzMiBwcmV2LCBuZXh0OworCUlOVDMyIHdpZHRoOworCUlOVDMyIGxlbmd0aDsKIAlMSU5FX0VORCBlbmRpbmc7CiAKIAloZGMgPSBHZXREQzMyKHduZFB0ci0+aHduZFNlbGYpOwotCWhGb250ID0gKEhGT05UMTYpRURJVF9XTV9HZXRGb250KHduZFB0ciwgMCwgMEwpOworCWhGb250ID0gKEhGT05UMzIpRURJVF9XTV9HZXRGb250KHduZFB0ciwgMCwgMCk7CiAJaWYgKGhGb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAKIAlpZiAoIUlzTXVsdGlMaW5lKHduZFB0cikpIHsKIAkJZXMtPkxpbmVDb3VudCA9IDE7CiAJCWVzLT5MaW5lRGVmcyA9IHhyZWFsbG9jKGVzLT5MaW5lRGVmcywgc2l6ZW9mKExJTkVERUYpKTsKIAkJZXMtPkxpbmVEZWZzWzBdLm9mZnNldCA9IDA7Ci0JCWVzLT5MaW5lRGVmc1swXS5sZW5ndGggPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwTCk7CisJCWVzLT5MaW5lRGVmc1swXS5sZW5ndGggPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKTsKIAkJZXMtPkxpbmVEZWZzWzBdLmVuZGluZyA9IEVORF8wOwotCQllcy0+VGV4dFdpZHRoID0gTE9XT1JEKEdldFRhYmJlZFRleHRFeHRlbnQoaGRjLCB0ZXh0LAorCQllcy0+VGV4dFdpZHRoID0gKElOVDMyKUxPV09SRChHZXRUYWJiZWRUZXh0RXh0ZW50KGhkYywgdGV4dCwKIAkJCQkJZXMtPkxpbmVEZWZzWzBdLmxlbmd0aCwKIAkJCQkJZXMtPk51bVRhYlN0b3BzLCBlcy0+VGFiU3RvcHMpKTsKIAl9IGVsc2UgewpAQCAtNTMzLDcgKzgyOCw3IEBACiAJCWRvIHsKIAkJCWlmICghKGNwID0gc3Ryc3RyKHN0YXJ0LCAiXHJcbiIpKSkgewogCQkJCWVuZGluZyA9IEVORF8wOwotCQkJCWxlbmd0aCA9IHN0cmxlbihzdGFydCk7CisJCQkJbGVuZ3RoID0gbHN0cmxlbjMyQShzdGFydCk7CiAJCQl9IGVsc2UgaWYgKChjcCA+IHN0YXJ0KSAmJiAoKihjcCAtIDEpID09ICdccicpKSB7CiAJCQkJZW5kaW5nID0gRU5EX1NPRlQ7CiAJCQkJbGVuZ3RoID0gY3AgLSBzdGFydCAtIDE7CkBAIC01NDEsNyArODM2LDcgQEAKIAkJCQllbmRpbmcgPSBFTkRfSEFSRDsKIAkJCQlsZW5ndGggPSBjcCAtIHN0YXJ0OwogCQkJfQotCQkJd2lkdGggPSBMT1dPUkQoR2V0VGFiYmVkVGV4dEV4dGVudChoZGMsIHN0YXJ0LCBsZW5ndGgsCisJCQl3aWR0aCA9IChJTlQzMilMT1dPUkQoR2V0VGFiYmVkVGV4dEV4dGVudChoZGMsIHN0YXJ0LCBsZW5ndGgsCiAJCQkJCQllcy0+TnVtVGFiU3RvcHMsIGVzLT5UYWJTdG9wcykpOwogCiAJCQlpZiAoSXNXb3JkV3JhcCh3bmRQdHIpICYmICh3aWR0aCA+IHd3KSkgewpAQCAtNTUwLDcgKzg0NSw3IEBACiAJCQkJCXByZXYgPSBuZXh0OwogCQkJCQluZXh0ID0gRURJVF9DYWxsV29yZEJyZWFrUHJvYyh3bmRQdHIsIHN0YXJ0LAogCQkJCQkJCXByZXYgKyAxLCBsZW5ndGgsIFdCX1JJR0hUKTsKLQkJCQkJd2lkdGggPSBMT1dPUkQoR2V0VGFiYmVkVGV4dEV4dGVudChoZGMsIHN0YXJ0LCBuZXh0LAorCQkJCQl3aWR0aCA9IChJTlQzMilMT1dPUkQoR2V0VGFiYmVkVGV4dEV4dGVudChoZGMsIHN0YXJ0LCBuZXh0LAogCQkJCQkJCWVzLT5OdW1UYWJTdG9wcywgZXMtPlRhYlN0b3BzKSk7CiAJCQkJfSB3aGlsZSAod2lkdGggPD0gd3cpOwogCQkJCWlmICghcHJldikgewpAQCAtNTU4LDcgKzg1Myw3IEBACiAJCQkJCWRvIHsKIAkJCQkJCXByZXYgPSBuZXh0OwogCQkJCQkJbmV4dCsrOwotCQkJCQkJd2lkdGggPSBMT1dPUkQoR2V0VGFiYmVkVGV4dEV4dGVudChoZGMsIHN0YXJ0LCBuZXh0LAorCQkJCQkJd2lkdGggPSAoSU5UMzIpTE9XT1JEKEdldFRhYmJlZFRleHRFeHRlbnQoaGRjLCBzdGFydCwgbmV4dCwKIAkJCQkJCQkJZXMtPk51bVRhYlN0b3BzLCBlcy0+VGFiU3RvcHMpKTsKIAkJCQkJfSB3aGlsZSAod2lkdGggPD0gd3cpOwogCQkJCQlpZighcHJldikgcHJldiA9IDE7CkBAIC01NzAsNyArODY1LDcgQEAKIAkJCQkJZW5kaW5nID0gRU5EX0RFTElNSVQ7CiAJCQkJfSBlbHNlCiAJCQkJCWVuZGluZyA9IEVORF9OT05FOwotCQkJCXdpZHRoID0gTE9XT1JEKEdldFRhYmJlZFRleHRFeHRlbnQoaGRjLCBzdGFydCwgbGVuZ3RoLAorCQkJCXdpZHRoID0gKElOVDMyKUxPV09SRChHZXRUYWJiZWRUZXh0RXh0ZW50KGhkYywgc3RhcnQsIGxlbmd0aCwKIAkJCQkJCQllcy0+TnVtVGFiU3RvcHMsIGVzLT5UYWJTdG9wcykpOwogCQkJfQogCkBAIC02MTAsMjQgKzkwNSwyOCBAQAogICoKICAqCUNhbGwgYXBwcm9wcmlhdGUgV29yZEJyZWFrUHJvYyAoaW50ZXJuYWwgb3IgZXh0ZXJuYWwpLgogICoKKyAqCUZJWE1FOiBIZWF2aWx5IGJyb2tlbiBub3cgdGhhdCB3ZSBoYXZlIGEgTE9DQUwzMiBidWZmZXIuCisgKglFeHRlcm5hbCB3b3JkYnJlYWsgZnVuY3Rpb25zIGhhdmUgYmVlbiBkaXNhYmxlZCBpbgorICoJRU1fU0VUV09SREJSRUFLUFJPQy4KKyAqCiAgKi8KLXN0YXRpYyBJTlQgRURJVF9DYWxsV29yZEJyZWFrUHJvYyhXTkQgKnduZFB0ciwgY2hhciAqcywgSU5UIGluZGV4LCBJTlQgY291bnQsIElOVCBhY3Rpb24pCitzdGF0aWMgSU5UMzIgRURJVF9DYWxsV29yZEJyZWFrUHJvYyhXTkQgKnduZFB0ciwgTFBTVFIgcywgSU5UMzIgaW5kZXgsIElOVDMyIGNvdW50LCBJTlQzMiBhY3Rpb24pCiB7Ci0gICAgRURJVFdPUkRCUkVBS1BST0Mgd2JwID0gKEVESVRXT1JEQlJFQUtQUk9DKUVESVRfRU1fR2V0V29yZEJyZWFrUHJvYyh3bmRQdHIsIDAsIDBMKTsKLQotICAgIGlmICghd2JwKSByZXR1cm4gRURJVF9Xb3JkQnJlYWtQcm9jKHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBXZSBuZWVkIGEgU0VHUFRSIGhlcmUgKi8KLQotICAgICAgICBFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0gICAgICAgIFNFR1BUUiBwdHIgPSBMT0NBTF9Mb2NrU2VncHRyKCB3bmRQdHItPmhJbnN0YW5jZSwgZXMtPmhCdWYgKSArCi0gICAgICAgICAgICAgICAgICAgICAoVUlOVDE2KShzIC0gRURJVF9HZXRQb2ludGVyKHduZFB0cikpOwotICAgICAgICBJTlQgcmV0ID0gQ2FsbFdvcmRCcmVha1Byb2MoIChGQVJQUk9DMTYpd2JwLCBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGNvdW50LCBhY3Rpb24pOwotICAgICAgICBMT0NBTF9VbmxvY2soIHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZiApOwotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KKwlyZXR1cm4gRURJVF9Xb3JkQnJlYWtQcm9jKHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKKy8qCisgKglFRElUV09SREJSRUFLUFJPQyB3YnAgPSAoRURJVFdPUkRCUkVBS1BST0MpRURJVF9FTV9HZXRXb3JkQnJlYWtQcm9jKHduZFB0ciwgMCwgMCk7CisgKgorICoJaWYgKCF3YnApIHJldHVybiBFRElUX1dvcmRCcmVha1Byb2MocywgaW5kZXgsIGNvdW50LCBhY3Rpb24pOworICoJZWxzZSB7CisgKgkJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworICoJCVNFR1BUUiBwdHIgPSBMT0NBTF9Mb2NrU2VncHRyKCB3bmRQdHItPmhJbnN0YW5jZSwgZXMtPmhCdWYxNiApICsKKyAqCQkJKElOVDE2KShzIC0gRURJVF9HZXRQb2ludGVyKHduZFB0cikpOworICoJCUlOVCByZXQgPSBDYWxsV29yZEJyZWFrUHJvYyggKEZBUlBST0MxNil3YnAsIHB0ciwKKyAqCQkJCQkJaW5kZXgsIGNvdW50LCBhY3Rpb24pOworICoJCUxPQ0FMX1VubG9jayggd25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmMTYgKTsKKyAqCQlyZXR1cm4gcmV0OworICoJfQorICovCiB9CiAKIApAQCAtNjM4LDEyICs5MzcsMTIgQEAKICAqCUNhbGN1bGF0ZXMsIGZvciBhIGdpdmVuIGxpbmUgYW5kIFgtY29vcmRpbmF0ZSBvbiB0aGUgc2NyZWVuLCB0aGUgY29sdW1uLgogICoKICAqLwotc3RhdGljIFVJTlQgRURJVF9Db2xGcm9tV25kWChXTkQgKnduZFB0ciwgVUlOVCBsaW5lLCBJTlQgeCkKLXsJCi0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDBMKTsKLQlVSU5UIGxsID0gKFVJTlQpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgbGksIDBMKTsKLQlVSU5UIGk7CitzdGF0aWMgSU5UMzIgRURJVF9Db2xGcm9tV25kWChXTkQgKnduZFB0ciwgSU5UMzIgbGluZSwgSU5UMzIgeCkKK3sKKwlJTlQzMiBsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDApOworCUlOVDMyIGxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSwgMCk7CisJSU5UMzIgbGwgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgbGksIDApOworCUlOVDMyIGk7CiAKIAlsaW5lID0gTUFYKDAsIE1JTihsaW5lLCBsYyAtIDEpKTsKIAlmb3IgKGkgPSAwIDsgaSA8IGxsIDsgaSsrKQpAQCAtNjYyLDkgKzk2MSw5IEBACiAgKi8KIHN0YXRpYyB2b2lkIEVESVRfRGVsRW5kKFdORCAqd25kUHRyKQogewotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMSwgTUFLRUxQQVJBTSgtMSwgMCkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgLTEsIDApOwogCUVESVRfTW92ZUVuZCh3bmRQdHIsIFRSVUUpOwotCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwTCk7CisJRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTY3Nyw5ICs5NzYsOSBAQAogICovCiBzdGF0aWMgdm9pZCBFRElUX0RlbExlZnQoV05EICp3bmRQdHIpCiB7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCAxLCBNQUtFTFBBUkFNKC0xLCAwKSk7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCAtMSwgMCk7CiAJRURJVF9Nb3ZlQmFja3dhcmQod25kUHRyLCBUUlVFKTsKLQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMEwpOworCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKIH0KIAogCkBAIC02OTIsOSArOTkxLDkgQEAKICAqLwogc3RhdGljIHZvaWQgRURJVF9EZWxSaWdodChXTkQgKnduZFB0cikKIHsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDEsIE1BS0VMUEFSQU0oLTEsIDApKTsKKwlFRElUX0VNX1NldFNlbCh3bmRQdHIsIC0xLCAwKTsKIAlFRElUX01vdmVGb3J3YXJkKHduZFB0ciwgVFJVRSk7Ci0JRURJVF9XTV9DbGVhcih3bmRQdHIsIDAsIDBMKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMCk7CiB9CiAKIApAQCAtNzAzLDEwICsxMDAyLDEwIEBACiAgKglFRElUX0dldEF2ZUNoYXJXaWR0aAogICoKICAqLwotc3RhdGljIFVJTlQgRURJVF9HZXRBdmVDaGFyV2lkdGgoV05EICp3bmRQdHIpCitzdGF0aWMgSU5UMzIgRURJVF9HZXRBdmVDaGFyV2lkdGgoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCQorCiAJcmV0dXJuIGVzLT5BdmVDaGFyV2lkdGg7CiB9CiAKQEAgLTcxNiwxMCArMTAxNSwxMCBAQAogICoJRURJVF9HZXRMaW5lSGVpZ2h0CiAgKgogICovCi1zdGF0aWMgVUlOVCBFRElUX0dldExpbmVIZWlnaHQoV05EICp3bmRQdHIpCitzdGF0aWMgSU5UMzIgRURJVF9HZXRMaW5lSGVpZ2h0KFdORCAqd25kUHRyKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQkKKwogCXJldHVybiBlcy0+TGluZUhlaWdodDsKIH0KIApAQCAtNzMyLDEyICsxMDMxLDEyIEBACiAgKgljb2x1bW4gdG8gYW4gZW5kaW5nIGNvbHVtbi4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfR2V0TGluZVJlY3QoV05EICp3bmRQdHIsIFVJTlQgbGluZSwgVUlOVCBzY29sLCBVSU5UIGVjb2wsIExQUkVDVDE2IHJjKQorc3RhdGljIHZvaWQgRURJVF9HZXRMaW5lUmVjdChXTkQgKnduZFB0ciwgSU5UMzIgbGluZSwgSU5UMzIgc2NvbCwgSU5UMzIgZWNvbCwgTFBSRUNUMzIgcmMpCiB7CiAJcmMtPnRvcCA9IEVESVRfV25kWUZyb21MaW5lKHduZFB0ciwgbGluZSk7CiAJcmMtPmJvdHRvbSA9IHJjLT50b3AgKyBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKTsKIAlyYy0+bGVmdCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsaW5lLCBzY29sKTsKLQlyYy0+cmlnaHQgPSAoKElOVCllY29sID09IC0xKSA/IEVESVRfR2V0V25kV2lkdGgod25kUHRyKSA6CisJcmMtPnJpZ2h0ID0gKGVjb2wgPT0gLTEpID8gRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpIDoKIAkJCQlFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbGluZSwgZWNvbCk7CiB9CiAKQEAgLTc1MCwxMiArMTA0OSwxNiBAQAogICoJeW91IGNhbiBjYWxsIGl0IHdoZW5ldmVyIHlvdSBsaWtlLCB3aXRob3V0IHVubG9ja2luZy4KICAqCiAgKi8KLXN0YXRpYyBjaGFyICpFRElUX0dldFBvaW50ZXIoV05EICp3bmRQdHIpCitzdGF0aWMgTFBTVFIgRURJVF9HZXRQb2ludGVyKFdORCAqd25kUHRyKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQkKLQlpZiAoIWVzLT50ZXh0ICYmIGVzLT5oQnVmKQotCQllcy0+dGV4dCA9IExPQ0FMX0xvY2sod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmKTsKKworCWlmICghZXMtPnRleHQgJiYgKGVzLT5oQnVmMzIgfHwgZXMtPmhCdWYxNikpIHsKKwkJaWYgKGVzLT5oQnVmMzIpCisJCQllcy0+dGV4dCA9IChMUFNUUilMb2NhbExvY2szMihlcy0+aEJ1ZjMyKTsKKwkJZWxzZQorCQkJZXMtPnRleHQgPSBMT0NBTF9Mb2NrKHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZjE2KTsKKwl9CiAJcmV0dXJuIGVzLT50ZXh0OwogfQogCkBAIC03NjYsMTEgKzEwNjksMTEgQEAKICAqCiAgKgogICovCi1zdGF0aWMgY2hhciAqRURJVF9HZXRQYXNzd29yZFBvaW50ZXIoV05EICp3bmRQdHIpCitzdGF0aWMgTFBTVFIgRURJVF9HZXRQYXNzd29yZFBvaW50ZXIoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCWNoYXIgKnRleHQgPSB4c3RyZHVwKEVESVRfR2V0UG9pbnRlcih3bmRQdHIpKTsKLQljaGFyICpwOworCUxQU1RSIHRleHQgPSB4c3RyZHVwKEVESVRfR2V0UG9pbnRlcih3bmRQdHIpKTsKKwlMUFNUUiBwOwogCiAJaWYoZXMtPlBhc3N3b3JkQ2hhcikgewogCQlwID0gdGV4dDsKQEAgLTc4NiwyNiArMTA4OSwxMCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgotICoJRURJVF9HZXRSZWN0Ci0gKgotICoJQmV3YXJlOiBUaGlzIGlzIG5vdCB0aGUgZnVuY3Rpb24gY2FsbGVkIG9uIEVNX0dFVFJFQ1QuCi0gKglJdCBleHBlY3RzIGEgKExQUkVDVCkgaW4gbFBhcmFtLCBub3QgYSAoU0VHUFRSKS4KLSAqCUl0IGlzIHVzZWQgaW50ZXJuYWxseSwgYXMgaWYgdGhlcmUgd2VyZSBubyBwb2ludGVyIGRpZmZpY3VsdGllcy4KLSAqCi0gKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfR2V0UmVjdChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCUdldENsaWVudFJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgKExQUkVDVDE2KWxQYXJhbSApOwotCXJldHVybiAwTDsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgogICoJRURJVF9HZXRSZWRyYXcKICAqCiAgKi8KLXN0YXRpYyBCT09MIEVESVRfR2V0UmVkcmF3KFdORCAqd25kUHRyKQorc3RhdGljIEJPT0wzMiBFRElUX0dldFJlZHJhdyhXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKQEAgLTgxOCwyNiArMTEwNSwyOSBAQAogICoJRURJVF9HZXRTZWwKICAqCiAgKglCZXdhcmU6IFRoaXMgaXMgbm90IHRoZSBmdW5jdGlvbiBjYWxsZWQgb24gRU1fR0VUU0VMLgotICoJSXQgcmV0dXJucyB0aGUgc3RhcnQgaW4gdGhlIGxvdyB3b3JkIGFuZCB0aGUgZW5kIGluIHRoZSBoaWdoIHdvcmQuCi0gKglOQiBzIGNhbiBiZSBncmVhdGVyIHRoYW4gZS4KKyAqCShiZWNhdXNlIHMgY2FuIGJlIGdyZWF0ZXIgdGhhbiBlKS4KICAqCiAgKi8KLXN0YXRpYyBMUkVTVUxUIEVESVRfR2V0U2VsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCitzdGF0aWMgdm9pZCBFRElUX0dldFNlbChXTkQgKnduZFB0ciwgTFBJTlQzMiBzLCBMUElOVDMyIGUpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCi0JcmV0dXJuIE1BS0VMT05HKGVzLT5TZWxTdGFydCwgZXMtPlNlbEVuZCk7CisJaWYgKHMpCisJCSpzID0gZXMtPlNlbFN0YXJ0OworCWlmIChlKQorCQkqZSA9IGVzLT5TZWxFbmQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKICAqCUVESVRfR2V0VGV4dFdpZHRoCiAgKgogICovCi1zdGF0aWMgVUlOVCBFRElUX0dldFRleHRXaWR0aChXTkQgKnduZFB0cikKK3N0YXRpYyBJTlQzMiBFRElUX0dldFRleHRXaWR0aChXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JCisKIAlyZXR1cm4gZXMtPlRleHRXaWR0aDsKIH0KIApAQCAtODQ3LDExICsxMTM3LDExIEBACiAgKglFRElUX0dldFZpc2libGVMaW5lQ291bnQKICAqCiAgKi8KLXN0YXRpYyBVSU5UIEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudChXTkQgKnduZFB0cikKK3N0YXRpYyBJTlQzMiBFRElUX0dldFZpc2libGVMaW5lQ291bnQoV05EICp3bmRQdHIpCiB7Ci0JUkVDVDE2IHJjOwotCQotCUVESVRfR2V0UmVjdCh3bmRQdHIsIDAsIChMUEFSQU0pJnJjKTsKKwlSRUNUMzIgcmM7CisKKwlFRElUX0VNX0dldFJlY3Qod25kUHRyLCAwLCAoTFBBUkFNKSZyYyk7CiAJcmV0dXJuIE1BWCgxLCBNQVgocmMuYm90dG9tIC0gcmMudG9wLCAwKSAvIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpKTsKIH0KIApAQCAtODYxLDExICsxMTUxLDExIEBACiAgKglFRElUX0dldFduZFdpZHRoCiAgKgogICovCi1zdGF0aWMgVUlOVCBFRElUX0dldFduZFdpZHRoKFdORCAqd25kUHRyKQorc3RhdGljIElOVDMyIEVESVRfR2V0V25kV2lkdGgoV05EICp3bmRQdHIpCiB7Ci0JUkVDVDE2IHJjOwotCQotCUVESVRfR2V0UmVjdCh3bmRQdHIsIDAsIChMUEFSQU0pJnJjKTsKKwlSRUNUMzIgcmM7CisKKwlFRElUX0VNX0dldFJlY3Qod25kUHRyLCAwLCAoTFBBUkFNKSZyYyk7CiAJcmV0dXJuIHJjLnJpZ2h0IC0gcmMubGVmdDsKIH0KIApAQCAtODc1LDEwICsxMTY1LDEwIEBACiAgKglFRElUX0dldFhPZmZzZXQKICAqCiAgKi8KLXN0YXRpYyBVSU5UIEVESVRfR2V0WE9mZnNldChXTkQgKnduZFB0cikKK3N0YXRpYyBJTlQzMiBFRElUX0dldFhPZmZzZXQoV05EICp3bmRQdHIpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCQorCiAJcmV0dXJuIGVzLT5YT2Zmc2V0OwogfQogCkBAIC04OTQsNjQgKzExODQsNjQgQEAKICAqCXN0YXJ0IGFuZCBlbmQgbmVlZCBub3QgYmUgb3JkZXJlZC4KICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfSW52YWxpZGF0ZVRleHQoV05EICp3bmRQdHIsIFVJTlQgc3RhcnQsIFVJTlQgZW5kKQorc3RhdGljIHZvaWQgRURJVF9JbnZhbGlkYXRlVGV4dChXTkQgKnduZFB0ciwgSU5UMzIgc3RhcnQsIElOVDMyIGVuZCkKIHsKLQlVSU5UIGZ2ID0gKFVJTlQpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMEwpOwotCVVJTlQgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7Ci0JVUlOVCBzbDsKLQlVSU5UIGVsOwotCVVJTlQgc2M7Ci0JVUlOVCBlYzsKLQlSRUNUMTYgcmNXbmQ7Ci0JUkVDVDE2IHJjTGluZTsKLQlSRUNUMTYgcmNVcGRhdGU7Ci0JVUlOVCBsOworCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDApOworCUlOVDMyIHZsYyA9IEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpOworCUlOVDMyIHNsOworCUlOVDMyIGVsOworCUlOVDMyIHNjOworCUlOVDMyIGVjOworCVJFQ1QzMiByY1duZDsKKwlSRUNUMzIgcmNMaW5lOworCVJFQ1QzMiByY1VwZGF0ZTsKKwlJTlQzMiBsOwogCiAJaWYgKGVuZCA9PSBzdGFydCApCiAJCXJldHVybjsKIAotCWlmICgoSU5UKWVuZCA9PSAtMSkKLQkJZW5kID0gKFVJTlQpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMEwpOwotCU9SREVSX1VJTlQoc3RhcnQsIGVuZCk7Ci0Jc2wgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHN0YXJ0LCAwTCk7Ci0JZWwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGVuZCwgMEwpOworCWlmIChlbmQgPT0gLTEpCisJCWVuZCA9IChJTlQzMilFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKTsKKwlPUkRFUl9JTlQzMihzdGFydCwgZW5kKTsKKwlzbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHN0YXJ0LCAwKTsKKwllbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGVuZCwgMCk7CiAJaWYgKChlbCA8IGZ2KSB8fCAoc2wgPiBmdiArIHZsYykpCiAJCXJldHVybjsKIAotCXNjID0gc3RhcnQgLSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHNsLCAwTCk7Ci0JZWMgPSBlbmQgLSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwTCk7CisJc2MgPSBzdGFydCAtIChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIHNsLCAwKTsKKwllYyA9IGVuZCAtIChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwKTsKIAlpZiAoc2wgPCBmdikgewogCQlzbCA9IGZ2OwogCQlzYyA9IDA7CiAJfQogCWlmIChlbCA+IGZ2ICsgdmxjKSB7CiAJCWVsID0gZnYgKyB2bGM7Ci0JCWVjID0gKFVJTlQpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwKLQkJCQkoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwTCksIDBMKTsKKwkJZWMgPSAoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwKKwkJCQkoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBlbCwgMCksIDApOwogCX0KLQlFRElUX0dldFJlY3Qod25kUHRyLCAwLCAoTFBBUkFNKSZyY1duZCk7CisJRURJVF9FTV9HZXRSZWN0KHduZFB0ciwgMCwgKExQQVJBTSkmcmNXbmQpOwogCWlmIChzbCA9PSBlbCkgewogCQlFRElUX0dldExpbmVSZWN0KHduZFB0ciwgc2wsIHNjLCBlYywgJnJjTGluZSk7Ci0JCWlmIChJbnRlcnNlY3RSZWN0MTYoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQotCQkJSW52YWxpZGF0ZVJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSApOworCQlpZiAoSW50ZXJzZWN0UmVjdDMyKCZyY1VwZGF0ZSwgJnJjV25kLCAmcmNMaW5lKSkKKwkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsICZyY1VwZGF0ZSwgRkFMU0UgKTsKIAl9IGVsc2UgewogCQlFRElUX0dldExpbmVSZWN0KHduZFB0ciwgc2wsIHNjLAotCQkJCShVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsCi0JCQkJCShVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgc2wsIDBMKSwgMEwpLAorCQkJCShJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLAorCQkJCQkoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBzbCwgMCksIDApLAogCQkJCSZyY0xpbmUpOwotCQlpZiAoSW50ZXJzZWN0UmVjdDE2KCZyY1VwZGF0ZSwgJnJjV25kLCAmcmNMaW5lKSkKLQkJCUludmFsaWRhdGVSZWN0MTYoIHduZFB0ci0+aHduZFNlbGYsICZyY1VwZGF0ZSwgRkFMU0UgKTsKKwkJaWYgKEludGVyc2VjdFJlY3QzMigmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCisJCQlJbnZhbGlkYXRlUmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFICk7CiAJCWZvciAobCA9IHNsICsgMSA7IGwgPCBlbCA7IGwrKykgewogCQkJRURJVF9HZXRMaW5lUmVjdCh3bmRQdHIsIGwsIDAsCi0JCQkJKFVJTlQpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwKLQkJCQkJKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCksIDBMKSwKKwkJCQkoSU5UMzIpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwKKwkJCQkJKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCksIDApLAogCQkJCSZyY0xpbmUpOwotCQkJaWYgKEludGVyc2VjdFJlY3QxNigmcmNVcGRhdGUsICZyY1duZCwgJnJjTGluZSkpCi0JCQkJSW52YWxpZGF0ZVJlY3QxNih3bmRQdHItPmh3bmRTZWxmLCAmcmNVcGRhdGUsIEZBTFNFKTsKKwkJCWlmIChJbnRlcnNlY3RSZWN0MzIoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQorCQkJCUludmFsaWRhdGVSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSk7CiAJCX0KIAkJRURJVF9HZXRMaW5lUmVjdCh3bmRQdHIsIGVsLCAwLCBlYywgJnJjTGluZSk7Ci0JCWlmIChJbnRlcnNlY3RSZWN0MTYoJnJjVXBkYXRlLCAmcmNXbmQsICZyY0xpbmUpKQotCQkJSW52YWxpZGF0ZVJlY3QxNiggd25kUHRyLT5od25kU2VsZiwgJnJjVXBkYXRlLCBGQUxTRSApOworCQlpZiAoSW50ZXJzZWN0UmVjdDMyKCZyY1VwZGF0ZSwgJnJjV25kLCAmcmNMaW5lKSkKKwkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsICZyY1VwZGF0ZSwgRkFMU0UgKTsKIAl9CiB9CiAKQEAgLTk2MywxMSArMTI1MywxMSBAQAogICoJQ2FsY3VsYXRlcywgZm9yIGEgZ2l2ZW4gWS1jb29yZGluYXRlIG9uIHRoZSBzY3JlZW4sIHRoZSBsaW5lLgogICoKICAqLwotc3RhdGljIFVJTlQgRURJVF9MaW5lRnJvbVduZFkoV05EICp3bmRQdHIsIElOVCB5KQorc3RhdGljIElOVDMyIEVESVRfTGluZUZyb21XbmRZKFdORCAqd25kUHRyLCBJTlQzMiB5KQogewotCVVJTlQgZnYgPSAoVUlOVClFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwTCk7Ci0JVUlOVCBsaCA9IEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpOwotCVVJTlQgbGMgPSAoVUlOVClFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDBMKTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBsaCA9IEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CiAKIAlyZXR1cm4gTUFYKDAsIE1JTihsYyAtIDEsIHkgLyBsaCArIGZ2KSk7CiB9CkBAIC05ODAsOSArMTI3MCwxMSBAQAogICoJVHJ5IHRvIGZpdCBzaXplICsgMSBieXRlcyBpbiB0aGUgYnVmZmVyLiAgQ29uc3RyYWluIHRvIGxpbWl0cy4KICAqCiAgKi8KLXN0YXRpYyBCT09MIEVESVRfTWFrZUZpdChXTkQgKnduZFB0ciwgVUlOVCBzaXplKQorc3RhdGljIEJPT0wzMiBFRElUX01ha2VGaXQoV05EICp3bmRQdHIsIElOVDMyIHNpemUpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCUhMT0NBTDMyIGhOZXczMjsKKwlITE9DQUwxNiBoTmV3MTY7CiAKIAlpZiAoc2l6ZSA8PSBlcy0+QnVmU2l6ZSkKIAkJcmV0dXJuIFRSVUU7CkBAIC05OTQsMTEgKzEyODYsMzMgQEAKIAogCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IHRyeWluZyB0byBSZUFsbG9jIHRvICVkKzFcbiIsIHNpemUpOwogCi0JaWYgKExPQ0FMX1JlQWxsb2Mod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmLCBzaXplICsgMSwgTE1FTV9NT1ZFQUJMRSkpIHsKLQkJZXMtPkJ1ZlNpemUgPSBNSU4oTE9DQUxfU2l6ZSh3bmRQdHItPmhJbnN0YW5jZSwgZXMtPmhCdWYpIC0gMSwgZXMtPkJ1ZkxpbWl0KTsKLQkJcmV0dXJuIFRSVUU7Ci0JfSBlbHNlCi0JCXJldHVybiBGQUxTRTsKKwlFRElUX1JlbGVhc2VQb2ludGVyKHduZFB0cik7CisJaWYgKGVzLT5oQnVmMzIpIHsKKwkJaWYgKChoTmV3MzIgPSBMb2NhbFJlQWxsb2MzMihlcy0+aEJ1ZjMyLCBzaXplICsgMSwgMCkpKSB7CisJCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBPbGQgMzIgYml0IGhhbmRsZSAlMDh4LCBuZXcgaGFuZGxlICUwOHhcbiIsIGVzLT5oQnVmMzIsIGhOZXczMik7CisJCQllcy0+aEJ1ZjMyID0gaE5ldzMyOworCQkJZXMtPkJ1ZlNpemUgPSBNSU4oTG9jYWxTaXplMzIoZXMtPmhCdWYzMikgLSAxLCBlcy0+QnVmTGltaXQpOworCQkJaWYgKGVzLT5CdWZTaXplIDwgc2l6ZSkgeworCQkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IEZBSUxFRCAhICBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+QnVmU2l6ZSk7CisJCQkJcmV0dXJuIEZBTFNFOworCQkJfQorCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZUZpdDogV2Ugbm93IGhhdmUgJWQrMVxuIiwgZXMtPkJ1ZlNpemUpOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoKGhOZXcxNiA9IExPQ0FMX1JlQWxsb2Mod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmMTYsIHNpemUgKyAxLCBMTUVNX01PVkVBQkxFKSkpIHsKKwkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBFRElUX01ha2VGaXQ6IE9sZCAxNiBiaXQgaGFuZGxlICUwOHgsIG5ldyBoYW5kbGUgJTA4eFxuIiwgZXMtPmhCdWYxNiwgaE5ldzE2KTsKKwkJCWVzLT5oQnVmMTYgPSBoTmV3MTY7CisJCQllcy0+QnVmU2l6ZSA9IE1JTihMT0NBTF9TaXplKHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZjE2KSAtIDEsIGVzLT5CdWZMaW1pdCk7CisJCQlpZiAoZXMtPkJ1ZlNpemUgPCBzaXplKSB7CisJCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVESVRfTWFrZUZpdDogRkFJTEVEICEgIFdlIG5vdyBoYXZlICVkKzFcbiIsIGVzLT5CdWZTaXplKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9NYWtlRml0OiBXZSBub3cgaGF2ZSAlZCsxXG4iLCBlcy0+QnVmU2l6ZSk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KKwlyZXR1cm4gRkFMU0U7CiB9CiAKIApAQCAtMTAwNywyMyArMTMyMSwyNyBAQAogICoJRURJVF9Nb3ZlQmFja3dhcmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfTW92ZUJhY2t3YXJkKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCkKK3N0YXRpYyB2b2lkIEVESVRfTW92ZUJhY2t3YXJkKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDBMKTsKLQlVSU5UIGxpID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCk7CisJSU5UMzIgczsKKwlJTlQzMiBlOworCUlOVDMyIGw7CisJSU5UMzIgbGk7CiAKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGUgLSBsaSA9PSAwKSB7CiAJCWlmIChsKSB7Ci0JCQlsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCAtIDEsIDBMKTsKLQkJCWUgPSBsaSArIChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwTCk7CisJCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgLSAxLCAwKTsKKwkJCWUgPSBsaSArIChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSwgMCk7CiAJCX0KIAl9IGVsc2UKIAkJZS0tOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTEwMzIsMjQgKzEzNTAsMjkgQEAKICAqCUVESVRfTW92ZURvd253YXJkCiAgKgogICovCi1zdGF0aWMgdm9pZCBFRElUX01vdmVEb3dud2FyZChXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpCitzdGF0aWMgdm9pZCBFRElUX01vdmVEb3dud2FyZChXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQlJTlQgeDsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsYzsKKwlJTlQzMiBsaTsKKwlJTlQzMiB4OwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGwgPCBsYyAtIDEpIHsKIAkJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOwogCQlsKys7Ci0JCWUgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKSArCisJCWUgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKSArCiAJCQkJRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwogCX0KIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCAwLCBNQUtFTFBBUkFNKHMsIGUpKTsKKwlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKIH0KIAogCkBAIC0xMDU4LDE4ICsxMzgxLDIzIEBACiAgKglFRElUX01vdmVFbmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfTW92ZUVuZChXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpCitzdGF0aWMgdm9pZCBFRElUX01vdmVFbmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpCiB7Ci0JVUlOVCBzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGUgPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgbCA9IChVSU5UKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGwgPSAoVUlOVClFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpOworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBsOworCUlOVDMyIGxsOworCUlOVDMyIGxpOwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOwogCWUgPSBsaSArIGxsOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTEwNzgsMjMgKzE0MDYsMjkgQEAKICAqCUVESVRfTW92ZUZvcndhcmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfTW92ZUZvcndhcmQoV05EICp3bmRQdHIsIEJPT0wgZXh0ZW5kKQorc3RhdGljIHZvaWQgRURJVF9Nb3ZlRm9yd2FyZChXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGwgPSAoVUlOVClFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpOworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBsOworCUlOVDMyIGxjOworCUlOVDMyIGxsOworCUlOVDMyIGxpOwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIGUsIDApOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGUgLSBsaSA9PSBsbCkgewogCQlpZiAobCAhPSBsYyAtIDEpCi0JCQllID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsICsgMSwgMEwpOworCQkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgKyAxLCAwKTsKIAl9IGVsc2UKIAkJZSsrOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTExMDUsMTcgKzE0MzksMjEgQEAKICAqCUhvbWUga2V5OiBtb3ZlIHRvIGJlZ2lubmluZyBvZiBsaW5lLgogICoKICAqLwotc3RhdGljIHZvaWQgRURJVF9Nb3ZlSG9tZShXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpCitzdGF0aWMgdm9pZCBFRElUX01vdmVIb21lKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDBMKTsKLQlVSU5UIGxpID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCk7CisJSU5UMzIgczsKKwlJTlQzMiBlOworCUlOVDMyIGw7CisJSU5UMzIgbGk7CiAKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJZSA9IGxpOwogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTExMjQsMjQgKzE0NjIsMjkgQEAKICAqCUVESVRfTW92ZVBhZ2VEb3duCiAgKgogICovCi1zdGF0aWMgdm9pZCBFRElUX01vdmVQYWdlRG93bihXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpCitzdGF0aWMgdm9pZCBFRElUX01vdmVQYWdlRG93bihXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQlJTlQgeDsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsYzsKKwlJTlQzMiBsaTsKKwlJTlQzMiB4OwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGwgPCBsYyAtIDEpIHsKIAkJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOwogCQlsID0gTUlOKGxjIC0gMSwgbCArIEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpKTsKLQkJZSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpICsKKwkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApICsKIAkJCQlFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgbCwgeCk7CiAJfQogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTExNTAsMjMgKzE0OTMsMjcgQEAKICAqCUVESVRfTW92ZVBhZ2VVcAogICoKICAqLwotc3RhdGljIHZvaWQgRURJVF9Nb3ZlUGFnZVVwKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCkKK3N0YXRpYyB2b2lkIEVESVRfTW92ZVBhZ2VVcChXTkQgKnduZFB0ciwgQk9PTDMyIGV4dGVuZCkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpOwotCUlOVCB4OworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBsOworCUlOVDMyIGxpOworCUlOVDMyIHg7CiAKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGwpIHsKIAkJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOwogCQlsID0gTUFYKDAsIGwgLSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKSk7Ci0JCWUgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKSArCisJCWUgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKSArCiAJCQkJRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwogCX0KIAlpZiAoIWV4dGVuZCkKIAkJcyA9IGU7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCAwLCBNQUtFTFBBUkFNKHMsIGUpKTsKKwlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIGUpOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKIH0KIAogCkBAIC0xMTc1LDIzICsxNTIyLDI3IEBACiAgKglFRElUX01vdmVVcHdhcmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfTW92ZVVwd2FyZChXTkQgKnduZFB0ciwgQk9PTCBleHRlbmQpCitzdGF0aWMgdm9pZCBFRElUX01vdmVVcHdhcmQoV05EICp3bmRQdHIsIEJPT0wzMiBleHRlbmQpCiB7Ci0JVUlOVCBzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGUgPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgbCA9IChVSU5UKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQlJTlQgeDsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsaTsKKwlJTlQzMiB4OwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOwogCWlmIChsKSB7CiAJCXggPSBFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbCwgZSAtIGxpKTsKIAkJbC0tOwotCQllID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCkgKworCQllID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCkgKwogCQkJCUVESVRfQ29sRnJvbVduZFgod25kUHRyLCBsLCB4KTsKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgTUFLRUxQQVJBTShzLCBlKSk7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBlKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKIApAQCAtMTIwMCwyOCArMTU1MSwzMyBAQAogICoJRURJVF9Nb3ZlV29yZEJhY2t3YXJkCiAgKgogICovCi1zdGF0aWMgdm9pZCBFRElUX01vdmVXb3JkQmFja3dhcmQoV05EICp3bmRQdHIsIEJPT0wgZXh0ZW5kKQorc3RhdGljIHZvaWQgRURJVF9Nb3ZlV29yZEJhY2t3YXJkKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDBMKTsKLQlVSU5UIGxsID0gKFVJTlQpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQljaGFyICp0ZXh0OworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBsOworCUlOVDMyIGxsOworCUlOVDMyIGxpOworCUxQU1RSIHRleHQ7CiAKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGUgLSBsaSA9PSAwKSB7CiAJCWlmIChsKSB7Ci0JCQlsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCAtIDEsIDBMKTsKLQkJCWUgPSBsaSArIChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwTCk7CisJCQlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgLSAxLCAwKTsKKwkJCWUgPSBsaSArIChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBsaSwgMCk7CiAJCX0KIAl9IGVsc2UgewogCQl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7Ci0JCWUgPSBsaSArIChVSU5UKUVESVRfQ2FsbFdvcmRCcmVha1Byb2Mod25kUHRyLAorCQllID0gbGkgKyAoSU5UMzIpRURJVF9DYWxsV29yZEJyZWFrUHJvYyh3bmRQdHIsCiAJCQkJdGV4dCArIGxpLCBlIC0gbGksIGxsLCBXQl9MRUZUKTsKIAl9CiAJaWYgKCFleHRlbmQpCiAJCXMgPSBlOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgTUFLRUxQQVJBTShzLCBlKSk7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBlKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CiB9CiAKIApAQCAtMTIzMCwyNyArMTU4NiwzMyBAQAogICoJRURJVF9Nb3ZlV29yZEZvcndhcmQKICAqCiAgKi8KLXN0YXRpYyB2b2lkIEVESVRfTW92ZVdvcmRGb3J3YXJkKFdORCAqd25kUHRyLCBCT09MIGV4dGVuZCkKK3N0YXRpYyB2b2lkIEVESVRfTW92ZVdvcmRGb3J3YXJkKFdORCAqd25kUHRyLCBCT09MMzIgZXh0ZW5kKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDBMKTsKLQlVSU5UIGxjID0gKFVJTlQpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsbCA9IChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUsIDBMKTsKLQlVSU5UIGxpID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCk7Ci0JY2hhciAqdGV4dDsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsYzsKKwlJTlQzMiBsbDsKKwlJTlQzMiBsaTsKKwlMUFNUUiB0ZXh0OwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwKTsKKwlsYyA9IChJTlQzMilFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIGUsIDApOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CiAJaWYgKGUgLSBsaSA9PSBsbCkgewogCQlpZiAobCAhPSBsYyAtIDEpCi0JCQllID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsICsgMSwgMEwpOworCQkJZSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwgKyAxLCAwKTsKIAl9IGVsc2UgewogCQl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7Ci0JCWUgPSBsaSArIChVSU5UKUVESVRfQ2FsbFdvcmRCcmVha1Byb2Mod25kUHRyLAorCQllID0gbGkgKyBFRElUX0NhbGxXb3JkQnJlYWtQcm9jKHduZFB0ciwKIAkJCQl0ZXh0ICsgbGksIGUgLSBsaSArIDEsIGxsLCBXQl9SSUdIVCk7CiAJfQogCWlmICghZXh0ZW5kKQogCQlzID0gZTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogfQogCiAKQEAgLTEyNTksMTcgKzE2MjEsMTcgQEAKICAqCUVESVRfUGFpbnRMaW5lCiAgKgogICovCi1zdGF0aWMgdm9pZCBFRElUX1BhaW50TGluZShXTkQgKnduZFB0ciwgSERDMzIgaGRjLCBVSU5UIGxpbmUsIEJPT0wgcmV2KQorc3RhdGljIHZvaWQgRURJVF9QYWludExpbmUoV05EICp3bmRQdHIsIEhEQzMyIGhkYywgSU5UMzIgbGluZSwgQk9PTDMyIHJldikKIHsKLQlVSU5UIGZ2ID0gKFVJTlQpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMEwpOwotCVVJTlQgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMEwpOwotCVVJTlQgbGk7Ci0JVUlOVCBsbDsKLQlVSU5UIHM7Ci0JVUlOVCBlOwotCUlOVCB4OwotCUlOVCB5OworCUlOVDMyIGZ2ID0gKElOVDMyKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDApOworCUlOVDMyIHZsYyA9IEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbGk7CisJSU5UMzIgbGw7CisJSU5UMzIgczsKKwlJTlQzMiBlOworCUlOVDMyIHg7CisJSU5UMzIgeTsKIAogCWlmICgobGluZSA8IGZ2KSB8fCAobGluZSA+IGZ2ICsgdmxjKSB8fCAobGluZSA+PSBsYykpCiAJCXJldHVybjsKQEAgLTEyNzgsMTEgKzE2NDAsMTAgQEAKIAogCXggPSBFRElUX1duZFhGcm9tQ29sKHduZFB0ciwgbGluZSwgMCk7CiAJeSA9IEVESVRfV25kWUZyb21MaW5lKHduZFB0ciwgbGluZSk7Ci0JbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDBMKTsKLQlsbCA9IChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwTCk7Ci0JcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JT1JERVJfVUlOVChzLCBlKTsKKwlsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDApOworCWxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwKTsKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJT1JERVJfSU5UMzIocywgZSk7CiAJcyA9IE1JTihsaSArIGxsLCBNQVgobGksIHMpKTsKIAllID0gTUlOKGxpICsgbGwsIE1BWChsaSwgZSkpOwogCWlmIChyZXYgJiYgKHMgIT0gZSkgJiYKQEAgLTEzMDEsMTUgKzE2NjIsMTUgQEAKICAqCUVESVRfUGFpbnRUZXh0CiAgKgogICovCi1zdGF0aWMgVUlOVCBFRElUX1BhaW50VGV4dChXTkQgKnduZFB0ciwgSERDMzIgaGRjLCBJTlQgeCwgSU5UIHksIFVJTlQgbGluZSwgVUlOVCBjb2wsIFVJTlQgY291bnQsIEJPT0wgcmV2KQorc3RhdGljIElOVDMyIEVESVRfUGFpbnRUZXh0KFdORCAqd25kUHRyLCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIElOVDMyIGxpbmUsIElOVDMyIGNvbCwgSU5UMzIgY291bnQsIEJPT0wzMiByZXYpCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCUNPTE9SUkVGIEJrQ29sb3I7CiAJQ09MT1JSRUYgVGV4dENvbG9yOwotCVVJTlQgcmV0OwotCWNoYXIgKnRleHQ7Ci0JVUlOVCBsaTsKLQlVSU5UIHhvZmY7CisJSU5UMzIgcmV0OworCUxQU1RSIHRleHQ7CisJSU5UMzIgbGk7CisJSU5UMzIgeG9mZjsKIAogCWlmICghY291bnQpCiAJCXJldHVybiAwOwpAQCAtMTMyMCw5ICsxNjgxLDkgQEAKIAkJU2V0VGV4dENvbG9yKGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfSElHSExJR0hUVEVYVCkpOwogCX0KIAl0ZXh0ID0gRURJVF9HZXRQYXNzd29yZFBvaW50ZXIod25kUHRyKTsKLQlsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSwgMEwpOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbGluZSwgMCk7CiAJeG9mZiA9IEVESVRfR2V0WE9mZnNldCh3bmRQdHIpOwotCXJldCA9IExPV09SRChUYWJiZWRUZXh0T3V0KGhkYywgeCwgeSwgdGV4dCArIGxpICsgY29sLCBjb3VudCwKKwlyZXQgPSAoSU5UMzIpTE9XT1JEKFRhYmJlZFRleHRPdXQoaGRjLCB4LCB5LCB0ZXh0ICsgbGkgKyBjb2wsIGNvdW50LAogCQkJCQllcy0+TnVtVGFiU3RvcHMsIGVzLT5UYWJTdG9wcywgLXhvZmYpKTsKIAlmcmVlKHRleHQpOwogCWlmIChyZXYpIHsKQEAgLTEzMzAsNyArMTY5MSw3IEBACiAJCVNldFRleHRDb2xvcihoZGMsIFRleHRDb2xvcik7CiAJfQogCXJldHVybiByZXQ7Ci19CQorfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEzMzksMTM4ICsxNzAwLDUxIEBACiAgKgogICoJVGhpcyBpcyB0aGUgb25seSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBjYW4gYmUgY2FsbGVkIHdpdGggZXMgPSBOVUxMLgogICoJSXQgaXMgY2FsbGVkIGF0IHRoZSBlbmQgb2YgRWRpdFduZFByb2MoKSB0byB1bmxvY2sgdGhlIGJ1ZmZlci4KLSAqCQorICoKICAqLwogc3RhdGljIHZvaWQgRURJVF9SZWxlYXNlUG9pbnRlcihXTkQgKnduZFB0cikKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JCisKIAlpZiAoIWVzKQogCQlyZXR1cm47Ci0JaWYgKGVzLT50ZXh0ICYmIGVzLT5oQnVmKQotCQlMT0NBTF9VbmxvY2sod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmKTsKKwlpZiAoZXMtPnRleHQgJiYgKGVzLT5oQnVmMzIgfHwgZXMtPmhCdWYxNikpCisgICAgICAgIHsKKwkJaWYgKGVzLT5oQnVmMzIpCisJCQlMb2NhbFVubG9jazMyKGVzLT5oQnVmMzIpOworCQllbHNlCisJCQlMT0NBTF9VbmxvY2sod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmMTYpOworICAgICAgICB9CiAJZXMtPnRleHQgPSBOVUxMOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCi0gKglFRElUX1JlcGxhY2VTZWwKLSAqCi0gKglCZXdhcmU6IFRoaXMgaXMgbm90IHRoZSBmdW5jdGlvbiBjYWxsZWQgb24gRU1fUkVQTEFDRVNFTC4KLSAqCUl0IGV4cGVjdHMgYSAoY2hhciAqKSBpbiBsUGFyYW0sIG5vdCBhIChTRUdQVFIpLgotICoJSXQgaXMgdXNlZCBpbnRlcm5hbGx5LCBhcyBpZiB0aGVyZSB3ZXJlIG5vIHBvaW50ZXIgZGlmZmljdWx0aWVzLgotICoKLSAqLwotc3RhdGljIExSRVNVTFQgRURJVF9SZXBsYWNlU2VsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCi17Ci0JY29uc3QgY2hhciAqc3RyID0gKGNoYXIgKilsUGFyYW07Ci0JaW50IHN0cmwgPSBzdHJsZW4oc3RyKTsKLQlVSU5UIHRsID0gKFVJTlQpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMEwpOwotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlpbnQgaTsKLQljaGFyICpwOwotCWNoYXIgKnRleHQ7Ci0JQk9PTCByZWRyYXc7Ci0KLQlPUkRFUl9VSU5UKHMsZSk7Ci0JaWYgKCFFRElUX01ha2VGaXQod25kUHRyLCB0bCAtIChlIC0gcykgKyBzdHJsKSkgewotCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9NQVhURVhUKTsKLQkJcmV0dXJuIDBMOwotCX0KLQlyZWRyYXcgPSBFRElUX0dldFJlZHJhdyh3bmRQdHIpOwotCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgRkFMU0UsIDBMKTsKLQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMEwpOwotCXRsID0gRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMEwpOwotCWUgPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKLQlmb3IgKHAgPSB0ZXh0ICsgdGwgOyBwID49IHRleHQgKyBlIDsgcC0tKQotCQlwW3N0cmxdID0gcFswXTsKLQlmb3IgKGkgPSAwICwgcCA9IHRleHQgKyBlIDsgaSA8IHN0cmwgOyBpKyspCi0JCXBbaV0gPSBzdHJbaV07Ci0JaWYoSXNVcHBlcih3bmRQdHIpKQotCQlBbnNpVXBwZXJCdWZmKHAsIHN0cmwpOwotCWVsc2UgaWYoSXNMb3dlcih3bmRQdHIpKQotCQlBbnNpTG93ZXJCdWZmKHAsIHN0cmwpOwotCUVESVRfQnVpbGRMaW5lRGVmcyh3bmRQdHIpOwotCWUgKz0gc3RybDsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0oZSwgZSkpOwotCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgVFJVRSwgMEwpOwotCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1VQREFURSk7Ci0JRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCByZWRyYXcsIDBMKTsKLQlpZiAocmVkcmF3KSB7Ci0JCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKLQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fQ0hBTkdFKTsKLQl9Ci0JcmV0dXJuIDBMOwotfQotIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJRURJVF9TY3JvbGxJbnRvVmlldwotICoKLSAqCU1ha2VzIHN1cmUgdGhlIGNhcmV0IGlzIHZpc2libGUuCi0gKgotICovCi1zdGF0aWMgdm9pZCBFRElUX1Njcm9sbEludG9WaWV3KFdORCAqd25kUHRyKQotewotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7Ci0JVUlOVCBsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpOwotCVVJTlQgZnYgPSAoVUlOVClFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwTCk7Ci0JVUlOVCB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKLQlVSU5UIHd3ID0gRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpOwotCVVJTlQgY3cgPSBFRElUX0dldEF2ZUNoYXJXaWR0aCh3bmRQdHIpOwotCUlOVCB4ID0gRURJVF9XbmRYRnJvbUNvbCh3bmRQdHIsIGwsIGUgLSBsaSk7Ci0JaW50IGR5ID0gMDsKLQlpbnQgZHggPSAwOwotCi0JaWYgKGwgPj0gZnYgKyB2bGMpCi0JCWR5ID0gbCAtIHZsYyArIDEgLSBmdjsKLQlpZiAobCA8IGZ2KQotCQlkeSA9IGwgLSBmdjsKLQlpZiAoeCA8IDApCi0JCWR4ID0geCAtIHd3IC8gSFNDUk9MTF9GUkFDVElPTiAvIGN3ICogY3c7Ci0JaWYgKHggPiB3dykKLQkJZHggPSB4IC0gKEhTQ1JPTExfRlJBQ1RJT04gLSAxKSAqIHd3IC8gSFNDUk9MTF9GUkFDVElPTiAvIGN3ICogY3c7Ci0JaWYgKGR5IHx8IGR4KSB7Ci0JCUVESVRfRU1fTGluZVNjcm9sbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0oZHksIGR4KSk7Ci0JCWlmIChkeSkgCi0JCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9WU0NST0xMKTsKLQkJaWYgKGR4KQotCQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fSFNDUk9MTCk7Ci0JfQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCiAgKglFRElUX1duZFhGcm9tQ29sCiAgKgogICoJQ2FsY3VsYXRlcywgZm9yIGEgZ2l2ZW4gbGluZSBhbmQgY29sdW1uLCB0aGUgWC1jb29yZGluYXRlIG9uIHRoZSBzY3JlZW4uCiAgKgogICovCi1zdGF0aWMgSU5UIEVESVRfV25kWEZyb21Db2woV05EICp3bmRQdHIsIFVJTlQgbGluZSwgVUlOVCBjb2wpCi17CQorc3RhdGljIElOVDMyIEVESVRfV25kWEZyb21Db2woV05EICp3bmRQdHIsIElOVDMyIGxpbmUsIElOVDMyIGNvbCkKK3sKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JY2hhciAqdGV4dCA9IEVESVRfR2V0UGFzc3dvcmRQb2ludGVyKHduZFB0cik7Ci0JSU5UIHJldDsKKwlMUFNUUiB0ZXh0ID0gRURJVF9HZXRQYXNzd29yZFBvaW50ZXIod25kUHRyKTsKKwlJTlQzMiByZXQ7CiAJSERDMzIgaGRjOwotCUhGT05UMTYgaEZvbnQ7CisJSEZPTlQzMiBoRm9udDsKIAlIRk9OVDMyIG9sZEZvbnQgPSAwOwotCVVJTlQgbGMgPSAoVUlOVClFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDBMKTsKLQlVSU5UIGxpID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsaW5lLCAwTCk7Ci0JVUlOVCBsbCA9IChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwTCk7Ci0JVUlOVCB4b2ZmID0gRURJVF9HZXRYT2Zmc2V0KHduZFB0cik7CisJSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwKTsKKwlJTlQzMiBsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGxpbmUsIDApOworCUlOVDMyIGxsID0gKElOVDMyKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIGxpLCAwKTsKKwlJTlQzMiB4b2ZmID0gRURJVF9HZXRYT2Zmc2V0KHduZFB0cik7CiAKIAloZGMgPSBHZXREQzMyKHduZFB0ci0+aHduZFNlbGYpOwotCWhGb250ID0gKEhGT05UMTYpRURJVF9XTV9HZXRGb250KHduZFB0ciwgMCwgMEwpOworCWhGb250ID0gKEhGT05UMzIpRURJVF9XTV9HZXRGb250KHduZFB0ciwgMCwgMCk7CiAJaWYgKGhGb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAJbGluZSA9IE1BWCgwLCBNSU4obGluZSwgbGMgLSAxKSk7CiAJY29sID0gTUlOKGNvbCwgbGwpOwotCXJldCA9IExPV09SRChHZXRUYWJiZWRUZXh0RXh0ZW50KGhkYywKKwlyZXQgPSAoSU5UMzIpTE9XT1JEKEdldFRhYmJlZFRleHRFeHRlbnQoaGRjLAogCQkJdGV4dCArIGxpLCBjb2wsCiAJCQllcy0+TnVtVGFiU3RvcHMsIGVzLT5UYWJTdG9wcykpIC0geG9mZjsKIAlpZiAoaEZvbnQpIFNlbGVjdE9iamVjdDMyKGhkYywgb2xkRm9udCk7CkBAIC0xNDg3LDEwICsxNzYxLDEwIEBACiAgKglDYWxjdWxhdGVzLCBmb3IgYSBnaXZlbiBsaW5lLCB0aGUgWS1jb29yZGluYXRlIG9uIHRoZSBzY3JlZW4uCiAgKgogICovCi1zdGF0aWMgSU5UIEVESVRfV25kWUZyb21MaW5lKFdORCAqd25kUHRyLCBVSU5UIGxpbmUpCitzdGF0aWMgSU5UMzIgRURJVF9XbmRZRnJvbUxpbmUoV05EICp3bmRQdHIsIElOVDMyIGxpbmUpCiB7Ci0JVUlOVCBmdiA9IChVSU5UKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDBMKTsKLQlVSU5UIGxoID0gRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cik7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbGggPSBFRElUX0dldExpbmVIZWlnaHQod25kUHRyKTsKIAogCXJldHVybiAobGluZSAtIGZ2KSAqIGxoOwogfQpAQCAtMTUwNywxNiArMTc4MSwxNiBAQAogICoJCWludGVybmFsbHksIHNvIHdlIGNhbiBkZWNpZGUgdGhpcyBmb3Igb3Vyc2VsdmVzLgogICoKICAqLwotc3RhdGljIElOVCBFRElUX1dvcmRCcmVha1Byb2MoY2hhciAqcywgSU5UIGluZGV4LCBJTlQgY291bnQsIElOVCBhY3Rpb24pCitzdGF0aWMgSU5UMzIgRURJVF9Xb3JkQnJlYWtQcm9jKExQU1RSIHMsIElOVDMyIGluZGV4LCBJTlQzMiBjb3VudCwgSU5UMzIgYWN0aW9uKQogewotCUlOVCByZXQgPSAwOworCUlOVDMyIHJldCA9IDA7CiAKLQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9Xb3JkQnJlYWtQcm9jOiBzPSVwLCBpbmRleD0lZCIKLQkJCSIsIGNvdW50PSVkLCBhY3Rpb249JWRcbiIsIHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKKwlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRURJVF9Xb3JkQnJlYWtQcm9jOiBzPSVwLCBpbmRleD0ldSIKKwkJCSIsIGNvdW50PSV1LCBhY3Rpb249JWRcbiIsIHMsIGluZGV4LCBjb3VudCwgYWN0aW9uKTsKIAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBXQl9MRUZUOgotCQlpZiAoIWNvdW50KSAKKwkJaWYgKCFjb3VudCkKIAkJCWJyZWFrOwogCQlpZiAoaW5kZXgpCiAJCQlpbmRleC0tOwpAQCAtMTU2OSw3ICsxODQzLDM4IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fQ2FuVW5kbyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCXJldHVybiAwTDsKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CisKKwlyZXR1cm4gKExSRVNVTFQpZXMtPkNhblVuZG87Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUVNX0NIQVJGUk9NUE9TCisgKgorICoJRklYTUU6IGRvIHRoZSBzcGVjcyBtZWFuIExpbmVJbmRleCBvciBMaW5lTnVtYmVyIChsaSB2LnMuIGwpID8/PworICovCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0NoYXJGcm9tUG9zKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJUE9JTlQzMiBwdDsKKwlSRUNUMzIgcmM7CisJSU5UMzIgbDsKKwlJTlQzMiBsaTsKKwlJTlQzMiBjOworCisJcHQueCA9IExPV09SRChsUGFyYW0pOworCXB0LnkgPSBISVdPUkQobFBhcmFtKTsKKwlHZXRDbGllbnRSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJnJjKTsKKworCWlmICghUHRJblJlY3QzMigmcmMsIHB0KSkKKwkJcmV0dXJuIC0xOworCisJbCA9IEVESVRfTGluZUZyb21XbmRZKHduZFB0ciwgcHQueSk7CisJbGkgPSBFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApOworCWMgPSBFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgbCwgcHQueCk7CisKKwlyZXR1cm4gKExSRVNVTFQpTUFLRUxPTkcobGkgKyBjLCBsaSk7CiB9CiAKIApAQCAtMTU4MCw3ICsxODg1LDEwIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JcmV0dXJuIDBMOworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKworCWVzLT5DYW5VbmRvID0gRkFMU0U7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTU5MSw4ICsxODk5LDggQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9GbXRMaW5lcyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCWZwcmludGYoc3RkbmltcCwgImVkaXQ6IEVNX0ZNVExJTkVTOiBtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZC5cbiIpOwotCXJldHVybiB3UGFyYW0gPyAtMUwgOiAwTDsKKwlmcHJpbnRmKHN0ZG5pbXAsICJlZGl0OiBFTV9GTVRMSU5FUzogbWVzc2FnZSBub3QgaW1wbGVtZW50ZWRcbiIpOworCXJldHVybiB3UGFyYW0gPyBUUlVFIDogRkFMU0U7CiB9CiAKIApAQCAtMTYwNCw4ICsxOTEyLDExIEBACiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JCi0JcmV0dXJuIChMUkVTVUxUKWVzLT5GaXJzdFZpc2libGVMaW5lOworCisJaWYgKElzTXVsdGlMaW5lKHduZFB0cikpCisJCXJldHVybiAoTFJFU1VMVCllcy0+Rmlyc3RWaXNpYmxlTGluZTsKKwllbHNlCisJCXJldHVybiAoTFJFU1VMVClFRElUX0NvbEZyb21XbmRYKHduZFB0ciwgMCwgMCk7CiB9CiAKIApAQCAtMTYxOCw5ICsxOTI5LDkxIEBACiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCi0JcmV0dXJuIChMUkVTVUxUKWVzLT5oQnVmOworCWlmICghSXNNdWx0aUxpbmUod25kUHRyKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoZXMtPmhCdWYzMikKKwkJcmV0dXJuIChMUkVTVUxUKWVzLT5oQnVmMzI7CisJZWxzZQorCQlyZXR1cm4gKExSRVNVTFQpZXMtPmhCdWYxNjsKIH0KLSAKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fR0VUSEFORExFMTYKKyAqCisgKglIb3BlZnVsbHkgdGhpcyB3b24ndCBmaXJlIGJhY2sgYXQgdXMuCisgKglXZSBhbHdheXMgc3RhcnQgd2l0aCBhIGJ1ZmZlciBpbiAzMiBiaXQgbGluZWFyIG1lbW9yeS4KKyAqCUhvd2V2ZXIsIHdpdGggdGhpcyBtZXNzYWdlIGEgMTYgYml0IGFwcGxpY2F0aW9uIHJlcXVlc3RzCisgKglhIGhhbmRsZSBvZiAxNiBiaXQgbG9jYWwgaGVhcCBtZW1vcnksIHdoZXJlIGl0IGV4cGVjdHMgdG8gZmluZAorICoJdGhlIHRleHQuCisgKglJdCdzIGEgcGl0dHkgdGhhdCBmcm9tIHRoaXMgbW9tZW50IG9uIHdlIGhhdmUgdG8gdXNlIHRoaXMKKyAqCWxvY2FsIGhlYXAsIGJlY2F1c2UgYXBwbGljYXRpb25zIG1heSByZWx5IG9uIHRoZSBoYW5kbGUKKyAqCWluIHRoZSBmdXR1cmUuCisgKgorICoJSW4gdGhpcyBmdW5jdGlvbiB3ZSdsbCB0cnkgdG8gc3dpdGNoIHRvIGxvY2FsIGhlYXAuCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0SGFuZGxlMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CisJTFBTVFIgdGV4dDsKKwlITE9DQUwxNiBuZXdCdWY7CisJTFBTVFIgbmV3VGV4dDsKKwlJTlQxNiBuZXdTaXplOworCisJaWYgKCFJc011bHRpTGluZSh3bmRQdHIpKQorCQlyZXR1cm4gMDsKKworCWlmIChlcy0+aEJ1ZjE2KQorCQlyZXR1cm4gKExSRVNVTFQpZXMtPmhCdWYxNjsKKworCWlmICghTE9DQUxfSGVhcFNpemUod25kUHRyLT5oSW5zdGFuY2UpKSB7CisJCWlmICghTG9jYWxJbml0KHduZFB0ci0+aEluc3RhbmNlLCAwLAorCQkJICAgICAgIEdsb2JhbFNpemUxNih3bmRQdHItPmhJbnN0YW5jZSkpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IEVNX0dFVEhBTkRMRTogY291bGQgbm90IGluaXRpYWxpemUgbG9jYWwgaGVhcFxuIik7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogRU1fR0VUSEFORExFOiBsb2NhbCBoZWFwIGluaXRpYWxpemVkXG4iKTsKKwl9CisJaWYgKCEobmV3QnVmID0gTE9DQUxfQWxsb2Mod25kUHRyLT5oSW5zdGFuY2UsCisJCQkJRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCkgKyAxLAorCQkJCUxNRU1fTU9WRUFCTEUpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IEVNX0dFVEhBTkRMRTogY291bGQgbm90IGFsbG9jYXRlIG5ldyAxNiBiaXQgYnVmZmVyXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCW5ld1NpemUgPSBNSU4oTE9DQUxfU2l6ZSh3bmRQdHItPmhJbnN0YW5jZSwgbmV3QnVmKSAtIDEsIGVzLT5CdWZMaW1pdCk7CisJaWYgKCEobmV3VGV4dCA9IExPQ0FMX0xvY2sod25kUHRyLT5oSW5zdGFuY2UsIG5ld0J1ZikpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZWRpdDogRU1fR0VUSEFORExFOiBjb3VsZCBub3QgbG9jayBuZXcgMTYgYml0IGJ1ZmZlclxuIik7CisJCUxPQ0FMX0ZyZWUod25kUHRyLT5oSW5zdGFuY2UsIG5ld0J1Zik7CisJCXJldHVybiAwOworCX0KKwl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CisJbHN0cmNweTMyQShuZXdUZXh0LCB0ZXh0KTsKKwlFRElUX1JlbGVhc2VQb2ludGVyKHduZFB0cik7CisJR2xvYmFsRnJlZTMyKGVzLT5oQnVmMzIpOworCWVzLT5oQnVmMzIgPSAoSExPQ0FMMzIpTlVMTDsKKwllcy0+aEJ1ZjE2ID0gbmV3QnVmOworCWVzLT5CdWZTaXplID0gbmV3U2l6ZTsKKwllcy0+dGV4dCA9IG5ld1RleHQ7CisJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IEVNX0dFVEhBTkRMRTogc3dpdGNoZWQgdG8gMTYgYml0IGJ1ZmZlclxuIik7CisKKwlyZXR1cm4gKExSRVNVTFQpZXMtPmhCdWYxNjsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fR0VUTElNSVRURVhUCisgKgorICovCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldExpbWl0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKworCXJldHVybiBlcy0+QnVmTGltaXQ7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTE2MjksMjEgKzIwMjIsMjEgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRMaW5lKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JY2hhciAqdGV4dDsKLQljaGFyICpzcmM7Ci0JY2hhciAqZHN0OwotCVVJTlQgbGVuOwotCVVJTlQgaTsKLQlVSU5UIGxjID0gKFVJTlQpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwTCk7CisJTFBTVFIgdGV4dDsKKwlMUFNUUiBzcmM7CisJTFBTVFIgZHN0OworCUlOVDMyIGxlbjsKKwlJTlQzMiBpOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CiAKIAlpZiAoIUlzTXVsdGlMaW5lKHduZFB0cikpCiAJCXdQYXJhbSA9IDA7Ci0JaWYgKChVSU5UKXdQYXJhbSA+PSBsYykKLQkJcmV0dXJuIDBMOworCWlmICgoSU5UMzIpd1BhcmFtID49IGxjKQorCQlyZXR1cm4gMDsKIAl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7Ci0Jc3JjID0gdGV4dCArIChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgd1BhcmFtLCAwTCk7Ci0JZHN0ID0gKGNoYXIgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOwotCWxlbiA9IE1JTigqKFdPUkQgKilkc3QsIChVSU5UKUVESVRfRU1fTGluZUxlbmd0aCh3bmRQdHIsIHdQYXJhbSwgMEwpKTsKKwlzcmMgPSB0ZXh0ICsgKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgd1BhcmFtLCAwKTsKKwlkc3QgPSAoTFBTVFIpbFBhcmFtOworCWxlbiA9IE1JTigqKFdPUkQgKilkc3QsIChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCB3UGFyYW0sIDApKTsKIAlmb3IgKGkgPSAwIDsgaSA8IGxlbiA7IGkrKykgewogCQkqZHN0ID0gKnNyYzsKIAkJc3JjKys7CkBAIC0xNjYxLDEzICsyMDU0LDI2IEBACiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldExpbmVDb3VudChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQkKKwogCXJldHVybiAoTFJFU1VMVCllcy0+TGluZUNvdW50OwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCisgKglFTV9HRVRNQVJHSU5TCisgKgorICovCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldE1hcmdpbnMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CisKKwlyZXR1cm4gKExSRVNVTFQpTUFLRUxPTkcoZXMtPkxlZnRNYXJnaW4sIGVzLT5SaWdodE1hcmdpbik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKICAqCUVNX0dFVE1PRElGWQogICoKICAqLwpAQCAtMTY5OSw3ICsyMTA1LDI0IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0UmVjdChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCXJldHVybiBFRElUX0dldFJlY3Qod25kUHRyLCB3UGFyYW0sIChMUEFSQU0pUFRSX1NFR19UT19MSU4obFBhcmFtKSk7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJQ29weVJlY3QzMigoTFBSRUNUMzIpbFBhcmFtLCAmZXMtPkZvcm1hdFJlY3QpOworCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglFTV9HRVRSRUNUMTYKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0UmVjdDE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJQ09OVl9SRUNUMzJUTzE2KCZlcy0+Rm9ybWF0UmVjdCwgKExQUkVDVDE2KVBUUl9TRUdfVE9fTElOKChTRUdQVFIpbFBhcmFtKSk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTcxMywxMSArMjEzNiwxNiBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0dldFNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKKwlJTlQzMiBzOworCUlOVDMyIGU7CiAKLQlPUkRFUl9VSU5UKHMsIGUpOwotCXJldHVybiBNQUtFTE9ORyhzLCBlKTsKKwlFRElUX0dldFNlbCh3bmRQdHIsICZzLCAmZSk7CisJT1JERVJfSU5UMzIocywgZSk7CisJaWYgKHdQYXJhbSkKKwkJKihMUElOVDMyKXdQYXJhbSA9IHM7CisJaWYgKGxQYXJhbSkKKwkJKihMUElOVDMyKWxQYXJhbSA9IGU7CisJcmV0dXJuIE1BS0VMT05HKChJTlQxNilzLCAoSU5UMTYpZSk7CiB9CiAKIApAQCAtMTcyNSwxMyArMjE1MywxNiBAQAogICoKICAqCUVNX0dFVFRIVU1CCiAgKgotICoJRklYTUU6IHVuZG9jdW1lbnRlZDogaXMgdGhpcyByaWdodCA/CisgKglGSVhNRTogaXMgdGhpcyByaWdodCA/ICAob3Igc2hvdWxkIGl0IGJlIG9ubHkgSFNDUk9MTCkKKyAqCShhbmQgbWF5YmUgb25seSBmb3IgZWRpdCBjb250cm9scyB0aGF0IHJlYWxseSBoYXZlIHRoZWlyCisgKglvd24gc2Nyb2xsYmFycykgKGFuZCBtYXliZSBvbmx5IGZvciBtdWx0aWxpbmUgY29udHJvbHMgPykKKyAqCUFsbCBpbiBhbGw6IHZlcnkgcG9vcmx5IGRvY3VtZW50ZWQKICAqCiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fR2V0VGh1bWIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlyZXR1cm4gTUFLRUxPTkcoRURJVF9XTV9WU2Nyb2xsKHduZFB0ciwgRU1fR0VUVEhVTUIsIDBMKSwKLQkJRURJVF9XTV9IU2Nyb2xsKHduZFB0ciwgRU1fR0VUVEhVTUIsIDBMKSk7CisJcmV0dXJuIE1BS0VMT05HKEVESVRfV01fVlNjcm9sbCh3bmRQdHIsIEVNX0dFVFRIVU1CMTYsIDApLAorCQlFRElUX1dNX0hTY3JvbGwod25kUHRyLCBFTV9HRVRUSFVNQjE2LCAwKSk7CiB9CiAKIApAQCAtMTczOSwzNiArMjE3MCwxNyBAQAogICoKICAqCUVNX0dFVFdPUkRCUkVBS1BST0MKICAqCisgKglGSVhNRTogQXBwbGljYXRpb24gZGVmaW5lZCBXb3JkQnJlYWtQcm9jIHNob3VsZCBiZSByZXR1cm5lZAorICoKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9HZXRXb3JkQnJlYWtQcm9jKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CisvKgogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAogCXJldHVybiAoTFJFU1VMVCllcy0+V29yZEJyZWFrUHJvYzsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICoJRU1fTElNSVRURVhUCi0gKgotICovCi1zdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbWl0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQotewotCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQotCWlmIChJc011bHRpTGluZSh3bmRQdHIpKSB7Ci0JCWlmICh3UGFyYW0pCi0JCQllcy0+QnVmTGltaXQgPSBNSU4oKFVJTlQpd1BhcmFtLCBCVUZMSU1JVF9NVUxUSSk7Ci0JCWVsc2UKLQkJCWVzLT5CdWZMaW1pdCA9IEJVRkxJTUlUX01VTFRJOwotCX0gZWxzZSB7Ci0JCWlmICh3UGFyYW0pCi0JCQllcy0+QnVmTGltaXQgPSBNSU4oKFVJTlQpd1BhcmFtLCBCVUZMSU1JVF9TSU5HTEUpOwotCQllbHNlCi0JCQllcy0+QnVmTGltaXQgPSBCVUZMSU1JVF9TSU5HTEU7Ci0JfQotCXJldHVybiAwTDsKKyovCisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTc3OSwxNCArMjE5MSwxNCBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVGcm9tQ2hhcihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCVVJTlQgbDsKKwlJTlQzMiBsOwogCiAJaWYgKCFJc011bHRpTGluZSh3bmRQdHIpKQotCQlyZXR1cm4gMEw7Ci0JaWYgKChJTlQpd1BhcmFtID09IC0xKQotCQl3UGFyYW0gPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCWwgPSAoVUlOVClFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDBMKSAtIDE7Ci0Jd2hpbGUgKChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMEwpID4gKFVJTlQpd1BhcmFtKQorCQlyZXR1cm4gMDsKKwlpZiAoKElOVDMyKXdQYXJhbSA9PSAtMSkKKwkJRURJVF9FTV9HZXRTZWwod25kUHRyLCAoV1BBUkFNMzIpJndQYXJhbSwgMCk7CS8qIGludGVudGlvbmFsIChsb29rcyB3ZWlyZCwgZG9lc24ndCBpdCA/KSAqLworCWwgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwKSAtIDE7CisJd2hpbGUgKChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDApID4gKElOVDMyKXdQYXJhbSkKIAkJbC0tOwogCXJldHVybiAoTFJFU1VMVClsOwogfQpAQCAtMTgwMCwyMCArMjIxMiwyMCBAQAogc3RhdGljIExSRVNVTFQgRURJVF9FTV9MaW5lSW5kZXgoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JVUlOVCBlOwotCVVJTlQgbDsKLQlVSU5UIGxjID0gKFVJTlQpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwTCk7CisJSU5UMzIgZTsKKwlJTlQzMiBsOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CiAKLQlpZiAoKElOVCl3UGFyYW0gPT0gLTEpIHsKLQkJZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7CisJaWYgKChJTlQzMil3UGFyYW0gPT0gLTEpIHsKKwkJRURJVF9HZXRTZWwod25kUHRyLCBOVUxMLCAmZSk7CiAJCWwgPSBsYyAtIDE7CiAJCXdoaWxlIChlcy0+TGluZURlZnNbbF0ub2Zmc2V0ID4gZSkKIAkJCWwtLTsKIAkJcmV0dXJuIChMUkVTVUxUKWVzLT5MaW5lRGVmc1tsXS5vZmZzZXQ7CiAJfQotCWlmICgoVUlOVCl3UGFyYW0gPj0gbGMpCi0JCXJldHVybiAtMUw7Ci0JcmV0dXJuIChMUkVTVUxUKWVzLT5MaW5lRGVmc1soVUlOVCl3UGFyYW1dLm9mZnNldDsKKwlpZiAoKElOVDMyKXdQYXJhbSA+PSBsYykKKwkJcmV0dXJuIC0xOworCXJldHVybiAoTFJFU1VMVCllcy0+TGluZURlZnNbKElOVDMyKXdQYXJhbV0ub2Zmc2V0OwogfQogCiAKQEAgLTE4MjUsNDMgKzIyMzcsNDcgQEAKIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fTGluZUxlbmd0aChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQlVSU5UIHM7Ci0JVUlOVCBlOwotCVVJTlQgc2w7Ci0JVUlOVCBlbDsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgc2w7CisJSU5UMzIgZWw7CiAKIAlpZiAoIUlzTXVsdGlMaW5lKHduZFB0cikpCiAJCXJldHVybiAoTFJFU1VMVCllcy0+TGluZURlZnNbMF0ubGVuZ3RoOwotCWlmICgoSU5UKXdQYXJhbSA9PSAtMSkgewotCQlzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQkJZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JCXNsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBzLCAwTCk7Ci0JCWVsID0gKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBlLCAwTCk7CisJaWYgKChJTlQzMil3UGFyYW0gPT0gLTEpIHsKKwkJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCQlzbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIHMsIDApOworCQllbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOwogCQlyZXR1cm4gKExSRVNVTFQpKHMgLSBlcy0+TGluZURlZnNbc2xdLm9mZnNldCArCiAJCQkJZXMtPkxpbmVEZWZzW2VsXS5vZmZzZXQgKwogCQkJCWVzLT5MaW5lRGVmc1tlbF0ubGVuZ3RoIC0gZSk7CiAJfQotCXJldHVybiAoTFJFU1VMVCllcy0+TGluZURlZnNbKFVJTlQpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCB3UGFyYW0sIDBMKV0ubGVuZ3RoOworCXJldHVybiAoTFJFU1VMVCllcy0+TGluZURlZnNbKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgd1BhcmFtLCAwKV0ubGVuZ3RoOwogfQotIAorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKglFTV9MSU5FU0NST0xMCiAgKgorICoJRklYTUU6IGlzIHdQYXJhbSBpbiBwaXhlbHMgb3IgaW4gYXZlcmFnZSBjaGFyYWN0ZXIgd2lkdGhzID8/PworICoJRklYTUU6IHdlIHVzZSB0aGlzIGludGVybmFsbHkgdG8gc2Nyb2xsIHNpbmdsZSBsaW5lIGNvbnRyb2xzIGFzIHdlbGwKKyAqCShzcGVjcyBhcmUgdmFndWUgYWJvdXQgd2hldGhlciB0aGlzIG1lc3NhZ2UgaXMgdmFsaWQgb3Igbm90IGZvcgorICoJc2luZ2xlIGxpbmUgY29udHJvbHMpCisgKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX0xpbmVTY3JvbGwoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMEwpOwotCVVJTlQgZnYgPSAoVUlOVClFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwTCk7Ci0JVUlOVCBuZnYgPSBNQVgoMCwgZnYgKyAoSU5UKUxPV09SRChsUGFyYW0pKTsKLQlVSU5UIHhvZmYgPSBFRElUX0dldFhPZmZzZXQod25kUHRyKTsKLQlVSU5UIG54b2ZmID0gTUFYKDAsIHhvZmYgKyAoSU5UKUhJV09SRChsUGFyYW0pKTsKLQlVSU5UIHR3ID0gRURJVF9HZXRUZXh0V2lkdGgod25kUHRyKTsKLQlJTlQgZHg7Ci0JSU5UIGR5OwotCVBPSU5UMTYgcG9zOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbmZ2ID0gTUFYKDAsIGZ2ICsgKElOVDMyKWxQYXJhbSk7CisJSU5UMzIgeG9mZiA9IEVESVRfR2V0WE9mZnNldCh3bmRQdHIpOworCUlOVDMyIG54b2ZmID0gTUFYKDAsIHhvZmYgKyAoSU5UMzIpd1BhcmFtKTsKKwlJTlQzMiB0dyA9IEVESVRfR2V0VGV4dFdpZHRoKHduZFB0cik7CisJSU5UMzIgZHg7CisJSU5UMzIgZHk7CisJUE9JTlQzMiBwb3M7CiAKIAlpZiAobmZ2ID49IGxjKQogCQluZnYgPSBsYyAtIDE7CkBAIC0xODczLDIzICsyMjg5LDQ1IEBACiAJaWYgKGR4IHx8IGR5KSB7CiAJCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkKIAkJCUhpZGVDYXJldCh3bmRQdHItPmh3bmRTZWxmKTsKLQkJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikpIAorCQlpZiAoRURJVF9HZXRSZWRyYXcod25kUHRyKSkKIAkJCVNjcm9sbFdpbmRvdzMyKHduZFB0ci0+aHduZFNlbGYsIGR4LCBkeSwgTlVMTCwgTlVMTCk7CiAJCWVzLT5GaXJzdFZpc2libGVMaW5lID0gbmZ2OwogCQllcy0+WE9mZnNldCA9IG54b2ZmOwogCQlpZiAoSXNWU2Nyb2xsQmFyKHduZFB0cikpCiAJCQlTZXRTY3JvbGxQb3MzMih3bmRQdHItPmh3bmRTZWxmLCBTQl9WRVJULAotCQkJCUVESVRfV01fVlNjcm9sbCh3bmRQdHIsIEVNX0dFVFRIVU1CLCAwTCksIFRSVUUpOworCQkJCUVESVRfV01fVlNjcm9sbCh3bmRQdHIsIEVNX0dFVFRIVU1CMTYsIDApLCBUUlVFKTsKIAkJaWYgKElzSFNjcm9sbEJhcih3bmRQdHIpKQogCQkJU2V0U2Nyb2xsUG9zMzIod25kUHRyLT5od25kU2VsZiwgU0JfSE9SWiwKLQkJCQlFRElUX1dNX0hTY3JvbGwod25kUHRyLCBFTV9HRVRUSFVNQiwgMEwpLCBUUlVFKTsKKwkJCQlFRElUX1dNX0hTY3JvbGwod25kUHRyLCBFTV9HRVRUSFVNQjE2LCAwKSwgVFJVRSk7CiAJCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgewotCQkJR2V0Q2FyZXRQb3MxNigmcG9zKTsKKwkJCUdldENhcmV0UG9zMzIoJnBvcyk7CiAJCQlTZXRDYXJldFBvcyhwb3MueCArIGR4LCBwb3MueSArIGR5KTsKIAkJCVNob3dDYXJldCh3bmRQdHItPmh3bmRTZWxmKTsKIAkJfQogCX0KLQlyZXR1cm4gLTFMOworCWlmIChJc011bHRpTGluZSh3bmRQdHIpKQorCQlyZXR1cm4gVFJVRTsKKwllbHNlCisJCXJldHVybiBGQUxTRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fUE9TRlJPTUNIQVIKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fUG9zRnJvbUNoYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlJTlQzMiBsZW4gPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgbDsKKwlJTlQzMiBsaTsKKworCXdQYXJhbSA9IE1JTih3UGFyYW0sIGxlbik7CisJbCA9IEVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgd1BhcmFtLCAwKTsKKwlsaSA9IEVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJcmV0dXJuIChMUkVTVUxUKU1BS0VMT05HKEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCB3UGFyYW0gLSBsaSksCisJCQkJRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBsKSk7CiB9CiAKIApAQCAtMTg5NywyNSArMjMzNSwxMjAgQEAKICAqCiAgKglFTV9SRVBMQUNFU0VMCiAgKgorICoJRklYTUU6IHdQYXJhbSBpbmRpY2F0ZXMgd2hldGhlciB3ZSBzaG91bGQgbWFpbnRhaW4gYW4gdW5kbyBidWZmZXIKKyAqCWZvciB0aGlzIG9wZXJhdGlvbi4KKyAqCiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fUmVwbGFjZVNlbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCXJldHVybiAoTFJFU1VMVClFRElUX1JlcGxhY2VTZWwod25kUHRyLCB3UGFyYW0sCi0JCQkJKExQQVJBTSkoY2hhciAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSkpOworCUxQQ1NUUiBzdHIgPSAoTFBDU1RSKWxQYXJhbTsKKwlJTlQzMiBzdHJsID0gbHN0cmxlbjMyQShzdHIpOworCUlOVDMyIHRsID0gKElOVDMyKUVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIDAsIDApOworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBpOworCUxQU1RSIHA7CisJTFBTVFIgdGV4dDsKKwlCT09MMzIgcmVkcmF3OworCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOworCU9SREVSX0lOVDMyKHMsZSk7CisJaWYgKCFFRElUX01ha2VGaXQod25kUHRyLCB0bCAtIChlIC0gcykgKyBzdHJsKSkgeworCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX01BWFRFWFQgc2VudFxuIik7CisJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX01BWFRFWFQpOworCQlyZXR1cm4gMDsKKwl9CisJcmVkcmF3ID0gRURJVF9HZXRSZWRyYXcod25kUHRyKTsKKwlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIEZBTFNFLCAwKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMCk7CisJdGwgPSBFRElUX1dNX0dldFRleHRMZW5ndGgod25kUHRyLCAwLCAwKTsKKwlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZlKTsKKwl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CisJZm9yIChwID0gdGV4dCArIHRsIDsgcCA+PSB0ZXh0ICsgZSA7IHAtLSkKKwkJcFtzdHJsXSA9IHBbMF07CisJZm9yIChpID0gMCAsIHAgPSB0ZXh0ICsgZSA7IGkgPCBzdHJsIDsgaSsrKQorCQlwW2ldID0gc3RyW2ldOworCWlmKElzVXBwZXIod25kUHRyKSkKKwkJQ2hhclVwcGVyQnVmZjMyQShwLCBzdHJsKTsKKwllbHNlIGlmKElzTG93ZXIod25kUHRyKSkKKwkJQ2hhckxvd2VyQnVmZjMyQShwLCBzdHJsKTsKKwlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKKwllICs9IHN0cmw7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBlLCBlKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBUUlVFLCAwKTsKKwlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX1VQREFURSBzZW50XG4iKTsKKwlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9VUERBVEUpOworCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgcmVkcmF3LCAwKTsKKwlpZiAocmVkcmF3KSB7CisJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKKwkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9DSEFOR0Ugc2VudFxuIik7CisJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX0NIQU5HRSk7CisJfQorCXJldHVybiAwOwogfQotIAorCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKglFTV9TQ1JPTEwKICAqCi0gKglGSVhNRTogdW5kb2N1bWVudGVkIG1lc3NhZ2UuCisgKglGSVhNRTogU2Nyb2xsIHdoYXQgPz8/ICBBbmQgd2hlcmUgPz8/CiAgKgogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1Njcm9sbChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCWZwcmludGYoc3RkbmltcCwgImVkaXQ6IEVNX1NDUk9MTDogbWVzc2FnZSBub3QgaW1wbGVtZW50ZWQgKHVuZG9jdW1lbnRlZCksIHBsZWFzZSByZXBvcnQuXG4iKTsKLQlyZXR1cm4gMEw7CisJZnByaW50ZihzdGRuaW1wLCAiZWRpdDogRU1fU0NST0xMOiBtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUVNX1NDUk9MTENBUkVUCisgKgorICoJTWFrZXMgc3VyZSB0aGUgY2FyZXQgaXMgdmlzaWJsZS4KKyAqCUZJWE1FOiBXZSB1c2UgRU1fTElORVNDUk9MTCwgYnV0IG1heSB3ZSBkbyB0aGF0IGZvciBzaW5nbGUgbGluZQorICoJCWNvbnRyb2xzID8/PworICoKKyAqLworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TY3JvbGxDYXJldChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQoreworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsaTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKKwlJTlQzMiB3dyA9IEVESVRfR2V0V25kV2lkdGgod25kUHRyKTsKKwlJTlQzMiBjdyA9IEVESVRfR2V0QXZlQ2hhcldpZHRoKHduZFB0cik7CisJSU5UMzIgeDsKKwlJTlQzMiBkeSA9IDA7CisJSU5UMzIgZHggPSAwOworCisJRURJVF9HZXRTZWwod25kUHRyLCBOVUxMLCAmZSk7CisJbCA9IChJTlQzMilFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIGUsIDApOworCWxpID0gKElOVDMyKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgbCwgMCk7CisJeCA9IEVESVRfV25kWEZyb21Db2wod25kUHRyLCBsLCBlIC0gbGkpOworCWlmIChsID49IGZ2ICsgdmxjKQorCQlkeSA9IGwgLSB2bGMgKyAxIC0gZnY7CisJaWYgKGwgPCBmdikKKwkJZHkgPSBsIC0gZnY7CisJaWYgKHggPCAwKQorCQlkeCA9IHggLSB3dyAvIEhTQ1JPTExfRlJBQ1RJT04gLyBjdyAqIGN3OworCWlmICh4ID4gd3cpCisJCWR4ID0geCAtIChIU0NST0xMX0ZSQUNUSU9OIC0gMSkgKiB3dyAvIEhTQ1JPTExfRlJBQ1RJT04gLyBjdyAqIGN3OworCWlmIChkeSB8fCBkeCkgeworCQlFRElUX0VNX0xpbmVTY3JvbGwod25kUHRyLCBkeCwgZHkpOworCQlpZiAoZHkpIHsKKwkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fVlNDUk9MTCBzZW50XG4iKTsKKwkJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1ZTQ1JPTEwpOworCQl9CisJCWlmIChkeCkgeworCQkJZHByaW50Zl9lZGl0KHN0ZGRlYiwgImVkaXQ6IG5vdGlmaWNhdGlvbiBFTl9IU0NST0xMIHNlbnRcbiIpOworCQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fSFNDUk9MTCk7CisJCX0KKwl9CisJcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMTkzMywxOSArMjQ2NiwxMDUgQEAKIAkJLyoKIAkJICoJb2xkIGJ1ZmZlciBpcyBmcmVlZCBieSBjYWxsZXIKIAkJICovCi0JCWVzLT5oQnVmID0gKEhMT0NBTDE2KXdQYXJhbTsKLQkJZXMtPkJ1ZlNpemUgPSBMT0NBTF9TaXplKHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZikgLSAxOworCQllcy0+aEJ1ZjE2ID0gKEhMT0NBTDE2KU5VTEw7CisJCWVzLT5oQnVmMzIgPSAoSExPQ0FMMzIpd1BhcmFtOworCQllcy0+QnVmU2l6ZSA9IExvY2FsU2l6ZTMyKGVzLT5oQnVmMzIpIC0gMTsKIAkJZXMtPkxpbmVDb3VudCA9IDA7CiAJCWVzLT5GaXJzdFZpc2libGVMaW5lID0gMDsKIAkJZXMtPlNlbFN0YXJ0ID0gZXMtPlNlbEVuZCA9IDA7Ci0JCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0ciwgMCwgMEwpOwotCQlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIEZBTFNFLCAwTCk7CisJCUVESVRfRU1fRW1wdHlVbmRvQnVmZmVyKHduZFB0ciwgMCwgMCk7CisJCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgRkFMU0UsIDApOwogCQlFRElUX0J1aWxkTGluZURlZnMod25kUHRyKTsKIAkJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikpCiAJCQlJbnZhbGlkYXRlUmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCBOVUxMLCBUUlVFICk7Ci0JCUVESVRfU2Nyb2xsSW50b1ZpZXcod25kUHRyKTsKKwkJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOwogCX0KLQlyZXR1cm4gMEw7CisJcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqCUVNX1NFVEhBTkRMRTE2CisgKgorICovCitzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldEhhbmRsZTE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJaWYgKElzTXVsdGlMaW5lKHduZFB0cikpIHsKKwkJRURJVF9SZWxlYXNlUG9pbnRlcih3bmRQdHIpOworCQkvKgorCQkgKglvbGQgYnVmZmVyIGlzIGZyZWVkIGJ5IGNhbGxlcgorCQkgKi8KKwkJZXMtPmhCdWYxNiA9IChITE9DQUwxNil3UGFyYW07CisJCWVzLT5oQnVmMzIgPSAoSExPQ0FMMzIpTlVMTDsKKwkJZXMtPkJ1ZlNpemUgPSBMT0NBTF9TaXplKHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZjE2KSAtIDE7CisJCWVzLT5MaW5lQ291bnQgPSAwOworCQllcy0+Rmlyc3RWaXNpYmxlTGluZSA9IDA7CisJCWVzLT5TZWxTdGFydCA9IGVzLT5TZWxFbmQgPSAwOworCQlFRElUX0VNX0VtcHR5VW5kb0J1ZmZlcih3bmRQdHIsIDAsIDApOworCQlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIEZBTFNFLCAwKTsKKwkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7CisJCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKQorCQkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgVFJVRSApOworCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJfQorCXJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKglFTV9TRVRMSU1JVFRFWFQKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0TGltaXRUZXh0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJaWYgKElzTXVsdGlMaW5lKHduZFB0cikpIHsKKwkJaWYgKHdQYXJhbSkKKwkJCWVzLT5CdWZMaW1pdCA9IE1JTigoSU5UMzIpd1BhcmFtLCBCVUZMSU1JVF9NVUxUSSk7CisJCWVsc2UKKwkJCWVzLT5CdWZMaW1pdCA9IEJVRkxJTUlUX01VTFRJOworCX0gZWxzZSB7CisJCWlmICh3UGFyYW0pCisJCQllcy0+QnVmTGltaXQgPSBNSU4oKElOVDMyKXdQYXJhbSwgQlVGTElNSVRfU0lOR0xFKTsKKwkJZWxzZQorCQkJZXMtPkJ1ZkxpbWl0ID0gQlVGTElNSVRfU0lOR0xFOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fU0VUTUFSR0lOUworICoKKyAqCUZJWE1FOiBXZSBsZXQgdGhlIG1hcmdpbnMgYmUgc2V0LCBidXQgd2UgZG9uJ3QgdXNlIHRoZW0geWV0ICE/IQorICoKKyAqLworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRNYXJnaW5zKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJaWYgKHdQYXJhbSAmIEVDX1VTRUZPTlRJTkZPKSB7CisJCWlmIChJc011bHRpTGluZSh3bmRQdHIpKSB7CisJCQkvKgorCQkJICoJRklYTUU6IGRvIHNvbWUgR2V0QUJDQ2hhcldpZHRoLCBvciBzbworCQkJICoJCVRoaXMgaXMganVzdCBwcmVsaW1pbmFyeQorCQkJICovCisJCQllcy0+TGVmdE1hcmdpbiA9IGVzLT5SaWdodE1hcmdpbiA9IEVESVRfR2V0QXZlQ2hhcldpZHRoKHduZFB0cik7CisJCX0gZWxzZQorCQkJZXMtPkxlZnRNYXJnaW4gPSBlcy0+UmlnaHRNYXJnaW4gPSBFRElUX0dldEF2ZUNoYXJXaWR0aCh3bmRQdHIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKHdQYXJhbSAmIEVDX0xFRlRNQVJHSU4pCisJCWVzLT5MZWZ0TWFyZ2luID0gTE9XT1JEKGxQYXJhbSk7CisJaWYgKHdQYXJhbSAmIEVDX1JJR0hUTUFSR0lOKQorCQllcy0+UmlnaHRNYXJnaW4gPSBISVdPUkQobFBhcmFtKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xOTU4LDggKzI1NzcsOCBAQAogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKIAotCWVzLT5UZXh0Q2hhbmdlZCA9IChCT09MKXdQYXJhbTsKLQlyZXR1cm4gMEw7CisJZXMtPlRleHRDaGFuZ2VkID0gKEJPT0wzMil3UGFyYW07CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMTk2NywxMyArMjU4NiwxNSBAQAogICoKICAqCUVNX1NFVFBBU1NXT1JEQ0hBUgogICoKKyAqCUZJWE1FOiBUaGlzIGltbGVtZW50YXRpb24gaXMgd2F5IHRvbyBzaW1wbGUKKyAqCiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UGFzc3dvcmRDaGFyKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCi0JZXMtPlBhc3N3b3JkQ2hhciA9IChjaGFyKXdQYXJhbTsKLQlyZXR1cm4gMEw7CisJZXMtPlBhc3N3b3JkQ2hhciA9IChDSEFSKXdQYXJhbTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0xOTg0LDExICsyNjA1LDExIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UmVhZE9ubHkoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlpZiAoKEJPT0wpd1BhcmFtKQorCWlmICgoQk9PTDMyKXdQYXJhbSkKIAkJd25kUHRyLT5kd1N0eWxlIHw9IEVTX1JFQURPTkxZOwogCWVsc2UKIAkJd25kUHRyLT5kd1N0eWxlICY9IH4oRFdPUkQpRVNfUkVBRE9OTFk7Ci0JcmV0dXJuIDBMOworCXJldHVybiBUUlVFOwogfQogCiAKQEAgLTE5OTksOCArMjYyMCw4IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0UmVjdChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCWZwcmludGYoc3RkbmltcCwiZWRpdDogRU1fU0VUUkVDVDogbWVzc2FnZSBub3QgaW1wbGVtZW50ZWQsIHBsZWFzZSByZXBvcnQuXG4iKTsKLQlyZXR1cm4gMEw7CisJZnByaW50ZihzdGRuaW1wLCJlZGl0OiBFTV9TRVRSRUNUOiBtZXNzYWdlIG5vdCBpbXBsZW1lbnRlZFxuIik7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjAxMSw4ICsyNjMyLDggQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRSZWN0TlAoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlmcHJpbnRmKHN0ZG5pbXAsImVkaXQ6IEVNX1NFVFJFQ1ROUDogbWVzc2FnZSBub3QgaW1wbGVtZW50ZWQsIHBsZWFzZSByZXBvcnQuXG4iKTsKLQlyZXR1cm4gMEw7CisJZnByaW50ZihzdGRuaW1wLCJlZGl0OiBFTV9TRVRSRUNUTlA6IG1lc3NhZ2Ugbm90IGltcGxlbWVudGVkXG4iKTsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yMDIwLDUwICsyNjQxLDc2IEBACiAgKgogICoJRU1fU0VUU0VMCiAgKgorICoJRklYTUU6IHNwZWNzIHN0YXRlIHRoYXQgd2Ugc2hvdWxkIG9yZGVyIHN0YXJ0IGFuZCBlbmQuCisgKgkJSG93ZXZlciwgd2UgdXNlIGludGVybmFsbHkgdGhhdCB0aGlzIGlzIG5vdCB0aGUgY2FzZS4KKyAqCiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0U2VsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwotCVVJTlQgbnMgPSBMT1dPUkQobFBhcmFtKTsKLQlVSU5UIG5lID0gSElXT1JEKGxQYXJhbSk7Ci0JVUlOVCBzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQlVSU5UIGUgPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZWw7Ci0JVUlOVCBlbGk7Ci0JVUlOVCB0bCA9IChVSU5UKUVESVRfV01fR2V0VGV4dExlbmd0aCh3bmRQdHIsIDAsIDBMKTsKKwlJTlQzMiBucyA9IChJTlQzMil3UGFyYW07CisJSU5UMzIgbmUgPSAoSU5UMzIpbFBhcmFtOworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBlbDsKKwlJTlQzMiBlbGk7CisJSU5UMzIgdGwgPSAoSU5UMzIpRURJVF9XTV9HZXRUZXh0TGVuZ3RoKHduZFB0ciwgMCwgMCk7CiAKLQlpZiAoKElOVClucyA9PSAtMSkgeworCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKKwlpZiAobnMgPT0gLTEpIHsKIAkJbnMgPSBlOwogCQluZSA9IGU7CiAJfQotCWVsc2UgewotCQlucyA9IE1JTihucywgdGwpOwotCQluZSA9IE1JTihuZSwgdGwpOwotCX0KKwlpZiAobmUgPT0gLTEpCisJCW5lID0gZTsKKy8qCisJT1JERVJfSU5UMzIobnMsIG5lKTsKKyovCisJbnMgPSBNSU4obnMsIHRsKTsKKwluZSA9IE1JTihuZSwgdGwpOwogCWVzLT5TZWxTdGFydCA9IG5zOwogCWVzLT5TZWxFbmQgPSBuZTsKIAlpZiAod25kUHRyLT5od25kU2VsZiA9PSBHZXRGb2N1czMyKCkpIHsKLQkJZWwgPSAoVUlOVClFRElUX0VNX0xpbmVGcm9tQ2hhcih3bmRQdHIsIG5lLCAwTCk7Ci0JCWVsaSA9IChVSU5UKUVESVRfRU1fTGluZUluZGV4KHduZFB0ciwgZWwsIDBMKTsKKwkJZWwgPSAoSU5UMzIpRURJVF9FTV9MaW5lRnJvbUNoYXIod25kUHRyLCBuZSwgMCk7CisJCWVsaSA9IChJTlQzMilFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGVsLCAwKTsKIAkJU2V0Q2FyZXRQb3MoRURJVF9XbmRYRnJvbUNvbCh3bmRQdHIsIGVsLCBuZSAtIGVsaSksCiAJCQkJRURJVF9XbmRZRnJvbUxpbmUod25kUHRyLCBlbCkpOwogCX0KLQlpZiAoIXdQYXJhbSkKLQkJRURJVF9TY3JvbGxJbnRvVmlldyh3bmRQdHIpOwogCWlmIChFRElUX0dldFJlZHJhdyh3bmRQdHIpKSB7Ci0JCU9SREVSX1VJTlQocywgZSk7Ci0JCU9SREVSX1VJTlQocywgbnMpOwotCQlPUkRFUl9VSU5UKHMsIG5lKTsKLQkJT1JERVJfVUlOVChlLCBucyk7Ci0JCU9SREVSX1VJTlQoZSwgbmUpOwotCQlPUkRFUl9VSU5UKG5zLCBuZSk7CisJCU9SREVSX0lOVDMyKHMsIGUpOworCQlPUkRFUl9JTlQzMihzLCBucyk7CisJCU9SREVSX0lOVDMyKHMsIG5lKTsKKwkJT1JERVJfSU5UMzIoZSwgbnMpOworCQlPUkRFUl9JTlQzMihlLCBuZSk7CisJCU9SREVSX0lOVDMyKG5zLCBuZSk7CiAJCWlmIChlICE9IG5zKSB7CiAJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgZSk7CiAJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgbnMsIG5lKTsKIAkJfSBlbHNlCiAJCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgbmUpOwogCX0KLQlyZXR1cm4gLTFMOworCXJldHVybiAtMTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fU0VUU0VMMTYKKyAqCisgKi8KK3N0YXRpYyBMUkVTVUxUIEVESVRfRU1fU2V0U2VsMTYoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKK3sKKwlJTlQzMiBucyA9IChJTlQzMilMT1dPUkQobFBhcmFtKTsKKwlJTlQzMiBuZSA9IChJTlQzMilISVdPUkQobFBhcmFtKTsKKworCWlmICgoSU5UMTYpTE9XT1JEKGxQYXJhbSkgPT0gLTEpCisJCW5zID0gLTE7CisJaWYgKChJTlQxNilISVdPUkQobFBhcmFtKSA9PSAtMSkKKwkJbmUgPSAtMTsKKwlFRElUX0VNX1NldFNlbCh3bmRQdHIsIG5zLCBuZSk7CisJaWYgKCF3UGFyYW0pCisJCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwlyZXR1cm4gLTE7CiB9CiAKIApAQCAtMjA3NSwyMCArMjcyMiw0NiBAQAogc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRUYWJTdG9wcyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKKwlJTlQzMiBpOwogCiAJaWYgKCFJc011bHRpTGluZSh3bmRQdHIpKQotCQlyZXR1cm4gMEw7CisJCXJldHVybiBGQUxTRTsKIAlpZiAoZXMtPlRhYlN0b3BzKQogCQlmcmVlKGVzLT5UYWJTdG9wcyk7Ci0JZXMtPk51bVRhYlN0b3BzID0gKFVJTlQpd1BhcmFtOworCWVzLT5OdW1UYWJTdG9wcyA9IChJTlQzMil3UGFyYW07CisJaWYgKCF3UGFyYW0pCisJCWVzLT5UYWJTdG9wcyA9IE5VTEw7CisJZWxzZSB7CisJCWVzLT5UYWJTdG9wcyA9IChMUElOVDE2KXhtYWxsb2Mod1BhcmFtICogc2l6ZW9mKElOVDE2KSk7CisJCWZvciAoIGkgPSAwIDsgaSA8IChJTlQzMil3UGFyYW0gOyBpKysgKQorCQkJZXMtPlRhYlN0b3BzW2ldID0gKElOVDE2KSgoTFBJTlQzMilsUGFyYW0pW2ldOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICoJRU1fU0VUVEFCU1RPUFMxNgorICoKKyAqLworc3RhdGljIExSRVNVTFQgRURJVF9FTV9TZXRUYWJTdG9wczE2KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCit7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJaWYgKCFJc011bHRpTGluZSh3bmRQdHIpKQorCQlyZXR1cm4gRkFMU0U7CisJaWYgKGVzLT5UYWJTdG9wcykKKwkJZnJlZShlcy0+VGFiU3RvcHMpOworCWVzLT5OdW1UYWJTdG9wcyA9IChJTlQzMil3UGFyYW07CiAJaWYgKCF3UGFyYW0pCiAJCWVzLT5UYWJTdG9wcyA9IE5VTEw7CiAJZWxzZSB7CiAJCWVzLT5UYWJTdG9wcyA9IChMUElOVDE2KXhtYWxsb2Mod1BhcmFtICogc2l6ZW9mKElOVDE2KSk7CiAJCW1lbWNweShlcy0+VGFiU3RvcHMsIChMUElOVDE2KVBUUl9TRUdfVE9fTElOKGxQYXJhbSksCi0JCQkJKFVJTlQpd1BhcmFtICogc2l6ZW9mKElOVDE2KSk7CisJCQkJKElOVDMyKXdQYXJhbSAqIHNpemVvZihJTlQxNikpOwogCX0KLQlyZXR1cm4gMUw7CisJcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMjA5OSwxMCArMjc3MiwxMiBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX0VNX1NldFdvcmRCcmVha1Byb2MoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKKy8qCiAJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOwogCiAJZXMtPldvcmRCcmVha1Byb2MgPSAoRURJVFdPUkRCUkVBS1BST0MpbFBhcmFtOwotCXJldHVybiAwTDsKKyovCisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjExMyw3ICsyNzg4LDExIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfRU1fVW5kbyhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCXJldHVybiAwTDsKKwlmcHJpbnRmKHN0ZG5pbXAsImVkaXQ6IEVNX1VORE86IG1lc3NhZ2Ugbm90IGltcGxlbWVudGVkXG4iKTsKKwlpZiAoSXNNdWx0aUxpbmUod25kUHRyKSkKKwkJcmV0dXJuIEZBTFNFOworCWVsc2UKKwkJcmV0dXJuIFRSVUU7CiB9CiAKIApAQCAtMjEzNSwyMiArMjgxNCwyMiBAQAogCQkJCUVESVRfTW92ZUhvbWUod25kUHRyLCBGQUxTRSk7CiAJCQkJRURJVF9Nb3ZlRG93bndhcmQod25kUHRyLCBGQUxTRSk7CiAJCQl9IGVsc2UKLQkJCQlFRElUX1JlcGxhY2VTZWwod25kUHRyLCAwLCAoTFBBUkFNKSJcclxuIik7CisJCQkJRURJVF9FTV9SZXBsYWNlU2VsKHduZFB0ciwgMCwgKExQQVJBTSkiXHJcbiIpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgJ1x0JzoKIAkJaWYgKElzTXVsdGlMaW5lKHduZFB0cikgJiYgIUlzUmVhZE9ubHkod25kUHRyKSkKLQkJCUVESVRfUmVwbGFjZVNlbCh3bmRQdHIsIDAsIChMUEFSQU0pIlx0Iik7CisJCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAwLCAoTFBBUkFNKSJcdCIpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlpZiAoIUlzUmVhZE9ubHkod25kUHRyKSAmJiAoYyA+PSAnICcpICYmIChjICE9IDEyNykpIHsKICAJCQlzdHJbMF0gPSBjOwogIAkJCXN0clsxXSA9ICdcMCc7Ci0gCQkJRURJVF9SZXBsYWNlU2VsKHduZFB0ciwgMCwgKExQQVJBTSlzdHIpOworIAkJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIDAsIChMUEFSQU0pc3RyKTsKICAJCX0KIAkJYnJlYWs7CiAJfQotCXJldHVybiAwTDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yMTYxLDI4ICsyODQwLDMyIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ2xlYXIoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JY2hhciAqdGV4dDsKLQlCT09MIHJlZHJhdzsKLQkKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJTFBTVFIgdGV4dDsKKwlCT09MMzIgcmVkcmF3OworCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwogCWlmIChzICE9IGUpIHsKIAkJcmVkcmF3ID0gRURJVF9HZXRSZWRyYXcod25kUHRyKTsKLQkJRURJVF9XTV9TZXRSZWRyYXcod25kUHRyLCBGQUxTRSwgMEwpOwotCQlPUkRFUl9VSU5UKHMsIGUpOworCQlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIEZBTFNFLCAwKTsKKwkJT1JERVJfSU5UMzIocywgZSk7CiAJCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKLQkJc3RyY3B5KHRleHQgKyBzLCB0ZXh0ICsgZSk7CisJCWxzdHJjcHkzMkEodGV4dCArIHMsIHRleHQgKyBlKTsKIAkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7Ci0JCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgTUFLRUxQQVJBTShzLCBzKSk7Ci0JCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgVFJVRSwgMEwpOworCQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIHMsIHMpOworCQlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJCUVESVRfRU1fU2V0TW9kaWZ5KHduZFB0ciwgVFJVRSwgMCk7CisJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fVVBEQVRFIHNlbnRcbiIpOwogCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9VUERBVEUpOwotCQlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIHJlZHJhdywgMEwpOworCQlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIHJlZHJhdywgMCk7CiAJCWlmIChyZWRyYXcpIHsKIAkJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKKwkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fQ0hBTkdFIHNlbnRcbiIpOwogCQkJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fQ0hBTkdFKTsKIAkJfQogCX0KLQlyZXR1cm4gLTFMOworCXJldHVybiAtMTsKIH0KIAogCkBAIC0yMTkzLDE3ICsyODc2LDE4IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ29weShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCVVJTlQgcyA9IExPV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JVUlOVCBlID0gSElXT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKKwlJTlQzMiBzOworCUlOVDMyIGU7CiAJSEdMT0JBTDE2IGhkc3Q7Ci0JY2hhciAqdGV4dDsKLQljaGFyICpkc3Q7Ci0JY2hhciAqc3JjOwotCWludCBpOworCUxQU1RSIHRleHQ7CisJTFBTVFIgZHN0OworCUxQU1RSIHNyYzsKKwlJTlQzMiBpOwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwogCWlmIChlID09IHMpCi0JCXJldHVybiAtMUw7Ci0JT1JERVJfVUlOVChzLCBlKTsKKwkJcmV0dXJuIC0xOworCU9SREVSX0lOVDMyKHMsIGUpOwogCWhkc3QgPSBHbG9iYWxBbGxvYzE2KEdNRU1fTU9WRUFCTEUsIChEV09SRCkoZSAtIHMgKyAxKSk7CiAJZHN0ID0gR2xvYmFsTG9jazE2KGhkc3QpOwogCXRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKQEAgLTIyMTYsNyArMjkwMCw3IEBACiAJRW1wdHlDbGlwYm9hcmQoKTsKIAlTZXRDbGlwYm9hcmREYXRhKENGX1RFWFQsIGhkc3QpOwogCUNsb3NlQ2xpcGJvYXJkKCk7Ci0JcmV0dXJuIC0xTDsKKwlyZXR1cm4gLTE7CiB9CiAKIApAQCAtMjIyNyw5ICsyOTExLDkgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9DcmVhdGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlDUkVBVEVTVFJVQ1QxNiAqY3MgPSAoQ1JFQVRFU1RSVUNUMTYgKilQVFJfU0VHX1RPX0xJTihsUGFyYW0pOworCUNSRUFURVNUUlVDVDMyQSAqY3MgPSAoQ1JFQVRFU1RSVUNUMzJBICopbFBhcmFtOwogCUVESVRTVEFURSAqZXM7Ci0JY2hhciAqdGV4dDsKKwlMUFNUUiB0ZXh0OwogCiAJZXMgPSB4bWFsbG9jKHNpemVvZihFRElUU1RBVEUpKTsKIAltZW1zZXQoZXMsIDAsIHNpemVvZihFRElUU1RBVEUpKTsKQEAgLTIyNTQsMjcgKzI5MzgsMTkgQEAKIAkJZXMtPkJ1ZkxpbWl0ID0gQlVGTElNSVRfU0lOR0xFOwogCQllcy0+UGFzc3dvcmRDaGFyID0gKGNzLT5zdHlsZSAmIEVTX1BBU1NXT1JEKSA/ICcqJyA6ICdcMCc7CiAJfQotCWlmICghTE9DQUxfSGVhcFNpemUod25kUHRyLT5oSW5zdGFuY2UpKSB7Ci0JCWlmICghTG9jYWxJbml0KHduZFB0ci0+aEluc3RhbmNlLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFNpemUxNih3bmRQdHItPmhJbnN0YW5jZSkpKSB7Ci0JCQlmcHJpbnRmKHN0ZGVyciwgImVkaXQ6IFdNX0NSRUFURTogY291bGQgbm90IGluaXRpYWxpemUgbG9jYWwgaGVhcFxuIik7Ci0JCQlyZXR1cm4gLTFMOwotCQl9Ci0JCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBXTV9DUkVBVEU6IGxvY2FsIGhlYXAgaW5pdGlhbGl6ZWRcbiIpOwotCX0KLQlpZiAoIShlcy0+aEJ1ZiA9IExPQ0FMX0FsbG9jKHduZFB0ci0+aEluc3RhbmNlLCBMTUVNX01PVkVBQkxFLCBlcy0+QnVmU2l6ZSArIDEpKSkgeworCWlmICghKGVzLT5oQnVmMzIgPSBMb2NhbEFsbG9jMzIoTE1FTV9NT1ZFQUJMRSwgZXMtPkJ1ZlNpemUgKyAxKSkpIHsKIAkJZnByaW50ZihzdGRlcnIsICJlZGl0OiBXTV9DUkVBVEU6IHVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXJcbiIpOwotCQlyZXR1cm4gLTFMOworCQlyZXR1cm4gLTE7CiAJfQotCWVzLT5CdWZTaXplID0gTE9DQUxfU2l6ZSh3bmRQdHItPmhJbnN0YW5jZSwgZXMtPmhCdWYpIC0gMTsKKwllcy0+QnVmU2l6ZSA9IExvY2FsU2l6ZTMyKGVzLT5oQnVmMzIpIC0gMTsKIAl0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CiAJKnRleHQgPSAnXDAnOwogCUVESVRfQnVpbGRMaW5lRGVmcyh3bmRQdHIpOwotCUVESVRfV01fU2V0Rm9udCh3bmRQdHIsIDAsIDBMKTsKLQlpZiAoY3MtPmxwc3pOYW1lICYmICooY2hhciAqKVBUUl9TRUdfVE9fTElOKGNzLT5scHN6TmFtZSkgIT0gJ1wwJykKKwlFRElUX1dNX1NldEZvbnQod25kUHRyLCAwLCAwKTsKKwlpZiAoY3MtPmxwc3pOYW1lICYmICooY3MtPmxwc3pOYW1lKSAhPSAnXDAnKQogCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCBGQUxTRSwgKExQQVJBTSljcy0+bHBzek5hbWUpOwotCUVESVRfV01fU2V0UmVkcmF3KHduZFB0ciwgVFJVRSwgMEwpOwotCXJldHVybiAwTDsKKwlFRElUX1dNX1NldFJlZHJhdyh3bmRQdHIsIFRSVUUsIDApOworCXJldHVybiAwOwogfQogCiAKQEAgLTIyODUsOSArMjk2MSw5IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fQ3V0KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JRURJVF9XTV9Db3B5KHduZFB0ciwgMCwgMEwpOwotCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwTCk7Ci0JcmV0dXJuIC0xTDsKKwlFRElUX1dNX0NvcHkod25kUHRyLCAwLCAwKTsKKwlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMCk7CisJcmV0dXJuIC0xOwogfQogCiAKQEAgLTIzMDQsMTAgKzI5ODAsMTMgQEAKIAlpZiAoZXMtPlRhYlN0b3BzKQogCQlmcmVlKGVzLT5UYWJTdG9wcyk7CiAJRURJVF9SZWxlYXNlUG9pbnRlcih3bmRQdHIpOwotCUxPQ0FMX0ZyZWUod25kUHRyLT5oSW5zdGFuY2UsIGVzLT5oQnVmKTsKKwlpZiAoZXMtPmhCdWYzMikKKwkJTG9jYWxGcmVlMzIoZXMtPmhCdWYzMik7CisJZWxzZQorCQlMT0NBTF9GcmVlKHduZFB0ci0+aEluc3RhbmNlLCBlcy0+aEJ1ZjE2KTsKIAlmcmVlKGVzKTsKIAkqKEVESVRTVEFURSAqKikmd25kUHRyLT53RXh0cmEgPSBOVUxMOwotCXJldHVybiAwTDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yMzE5LDcgKzI5OTgsNyBAQAogc3RhdGljIExSRVNVTFQgRURJVF9XTV9FbmFibGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgMCwgLTEpOwotCXJldHVybiAwTDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yMzMxLDIzICszMDEwLDIzIEBACiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0VyYXNlQmtHbmQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlIQlJVU0gzMiBoQnJ1c2g7Ci0JUkVDVDE2IHJjOworCVJFQ1QzMiByYzsKIAotCWhCcnVzaCA9IChIQlJVU0gxNilFRElUX1NFTkRfQ1RMQ09MT1Iod25kUHRyLCB3UGFyYW0pOworCWhCcnVzaCA9IChIQlJVU0gzMilFRElUX1NFTkRfQ1RMQ09MT1Iod25kUHRyLCB3UGFyYW0pOwogCWlmICghaEJydXNoKSBoQnJ1c2ggPSAoSEJSVVNIMzIpR2V0U3RvY2tPYmplY3QzMihXSElURV9CUlVTSCk7CiAKLQlHZXRDbGllbnRSZWN0MTYod25kUHRyLT5od25kU2VsZiwgJnJjKTsKLQlJbnRlcnNlY3RDbGlwUmVjdDE2KCAoSERDMTYpd1BhcmFtLCByYy5sZWZ0LCByYy50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJjLnJpZ2h0LCByYy5ib3R0b20pOwotCUdldENsaXBCb3gxNigoSERDMTYpd1BhcmFtLCAmcmMpOworCUdldENsaWVudFJlY3QzMih3bmRQdHItPmh3bmRTZWxmLCAmcmMpOworCUludGVyc2VjdENsaXBSZWN0MzIoKEhEQzMyKXdQYXJhbSwgcmMubGVmdCwgcmMudG9wLAorCQkJICAgICByYy5yaWdodCwgcmMuYm90dG9tKTsKKwlHZXRDbGlwQm94MzIoKEhEQzMyKXdQYXJhbSwgJnJjKTsKIAkvKgogCSAqCUZJWE1FOglzcGVjcyBzYXkgdGhhdCB3ZSBzaG91bGQgVW5yZWFsaXplT2JqZWN0KCkgdGhlIGJydXNoLAogCSAqCQlidXQgdGhlIHNwZWNzIG9mIFVucmVhbGl6ZU9iamVjdCgpIHNheSB0aGF0IHdlIHNob3VsZG4ndAogCSAqCQl1bnJlYWxpemUgYSBzdG9jayBvYmplY3QuICBUaGUgZGVmYXVsdCBicnVzaCB0aGF0CiAJICoJCURlZlduZFByb2MoKSByZXR1cm5zIGlzIC4uLiBhIHN0b2NrIG9iamVjdC4KIAkgKi8KLQlGaWxsUmVjdDE2KChIREMxNil3UGFyYW0sICZyYywgaEJydXNoKTsKLQlyZXR1cm4gLTFMOworCUZpbGxSZWN0MzIoKEhEQzMyKXdQYXJhbSwgJnJjLCBoQnJ1c2gpOworCXJldHVybiAtMTsKIH0KIAogCkBAIC0yMzgyLDE0ICszMDYxLDE0IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fR2V0VGV4dChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCWNoYXIgKnRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKLQlpbnQgbGVuOwotCUxSRVNVTFQgbFJlc3VsdCA9IDBMOworCUxQU1RSIHRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKKwlJTlQzMiBsZW47CisJTFJFU1VMVCBsUmVzdWx0ID0gMDsKIAotCWxlbiA9IHN0cmxlbih0ZXh0KTsKLQlpZiAoKFVJTlQpd1BhcmFtID4gbGVuKSB7Ci0JCXN0cmNweSgoY2hhciAqKVBUUl9TRUdfVE9fTElOKGxQYXJhbSksIHRleHQpOwotCQlsUmVzdWx0ID0gKExSRVNVTFQpbGVuIDsKKwlsZW4gPSBsc3RybGVuMzJBKHRleHQpOworCWlmICgoSU5UMzIpd1BhcmFtID4gbGVuKSB7CisJCWxzdHJjcHkzMkEoKExQU1RSKWxQYXJhbSwgdGV4dCk7CisJCWxSZXN1bHQgPSAoTFJFU1VMVClsZW4gKyAxOwogCX0KIAlyZXR1cm4gbFJlc3VsdDsKIH0KQEAgLTI0MDIsMTEgKzMwODEsMTEgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9HZXRUZXh0TGVuZ3RoKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JY2hhciAqdGV4dCA9IEVESVRfR2V0UG9pbnRlcih3bmRQdHIpOworCUxQU1RSIHRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKIAotCXJldHVybiAoTFJFU1VMVClzdHJsZW4odGV4dCk7CisJcmV0dXJuIChMUkVTVUxUKWxzdHJsZW4zMkEodGV4dCk7CiB9Ci0gCisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoKQEAgLTI0MTcsMTMgKzMwOTYsMTMgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9IU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JVUlOVCB3dyA9IEVESVRfR2V0V25kV2lkdGgod25kUHRyKTsKLQlVSU5UIHR3ID0gRURJVF9HZXRUZXh0V2lkdGgod25kUHRyKTsKLQlVSU5UIGN3ID0gRURJVF9HZXRBdmVDaGFyV2lkdGgod25kUHRyKTsKLQlVSU5UIHhvZmYgPSBFRElUX0dldFhPZmZzZXQod25kUHRyKTsKLQlJTlQgZHggPSAwOwotCUJPT0wgbm90ID0gVFJVRTsKLQlMUkVTVUxUIHJldCA9IDBMOworCUlOVDMyIHd3ID0gRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpOworCUlOVDMyIHR3ID0gRURJVF9HZXRUZXh0V2lkdGgod25kUHRyKTsKKwlJTlQzMiBjdyA9IEVESVRfR2V0QXZlQ2hhcldpZHRoKHduZFB0cik7CisJSU5UMzIgeG9mZiA9IEVESVRfR2V0WE9mZnNldCh3bmRQdHIpOworCUlOVDMyIGR4ID0gMDsKKwlCT09MMzIgbm90ID0gVFJVRTsKKwlMUkVTVUxUIHJldCA9IDA7CiAKIAlzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgU0JfTElORUxFRlQ6CkBAIC0yNDQ5LDIzICszMTI4LDI1IEBACiAgKgkJbm90ID0gRkFMU0U7CiAgKi8KIAljYXNlIFNCX1RIVU1CUE9TSVRJT046Ci0JCWR4ID0gTE9XT1JEKGxQYXJhbSkgKiB0dyAvIDEwMCAtIHhvZmY7CisJCWR4ID0gSElXT1JEKHdQYXJhbSkgKiB0dyAvIDEwMCAtIHhvZmY7CiAJCWJyZWFrOwogCS8qIFRoZSBuZXh0IHR3byBhcmUgdW5kb2N1bWVudGVkICEgKi8KLQljYXNlIEVNX0dFVFRIVU1COgotCQlyZXQgPSB0dyA/IE1BS0VMT05HKHhvZmYgKiAxMDAgLyB0dywgMCkgOiAwOworCWNhc2UgRU1fR0VUVEhVTUIxNjoKKwkJcmV0ID0gdHcgPyB4b2ZmICogMTAwIC8gdHcgOiAwOwogCQlicmVhazsKLQljYXNlIEVNX0xJTkVTQ1JPTEw6Ci0JCWR4ID0gTE9XT1JEKGxQYXJhbSk7CisJY2FzZSBFTV9MSU5FU0NST0xMMTY6CisJCWR4ID0gKElOVDE2KUhJV09SRCh3UGFyYW0pOwogCQlicmVhazsKIAljYXNlIFNCX0VORFNDUk9MTDoKIAlkZWZhdWx0OgogCQlicmVhazsKIAl9CiAJaWYgKGR4KSB7Ci0JCUVESVRfRU1fTGluZVNjcm9sbCh3bmRQdHIsIDAsIE1BS0VMUEFSQU0oMCwgZHgpKTsKLQkJaWYgKG5vdCkKKwkJRURJVF9FTV9MaW5lU2Nyb2xsKHduZFB0ciwgZHgsIDApOworCQlpZiAobm90KSB7CisJCQlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX0hTQ1JPTEwgc2VudFxuIik7CiAJCQlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9IU0NST0xMKTsKKwkJfQogCX0KIAlyZXR1cm4gcmV0OwogfQpAQCAtMjQ4MSwxNyArMzE2MiwxOCBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX0tleURvd24oV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7Ci0JQk9PTCBzaGlmdDsKLQlCT09MIGNvbnRyb2w7CisJSU5UMzIgczsKKwlJTlQzMiBlOworCUJPT0wzMiBzaGlmdDsKKwlCT09MMzIgY29udHJvbDsKIAogCWlmIChHZXRLZXlTdGF0ZShWS19NRU5VKSAmIDB4ODAwMCkKLQkJcmV0dXJuIDBMOworCQlyZXR1cm4gMDsKIAogCXNoaWZ0ID0gR2V0S2V5U3RhdGUoVktfU0hJRlQpICYgMHg4MDAwOwogCWNvbnRyb2wgPSBHZXRLZXlTdGF0ZShWS19DT05UUk9MKSAmIDB4ODAwMDsKIAorCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKIAlzd2l0Y2ggKHdQYXJhbSkgewogCWNhc2UgVktfTEVGVDoKIAljYXNlIFZLX1VQOgpAQCAtMjUyOSw3ICszMjExLDcgQEAKIAljYXNlIFZLX0JBQ0s6CiAJCWlmICghSXNSZWFkT25seSh3bmRQdHIpICYmICFjb250cm9sKQogCQkJaWYgKGUgIT0gcykKLQkJCQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMEwpOworCQkJCUVESVRfV01fQ2xlYXIod25kUHRyLCAwLCAwKTsKIAkJCWVsc2UKIAkJCQlFRElUX0RlbExlZnQod25kUHRyKTsKIAkJYnJlYWs7CkBAIC0yNTM3LDkgKzMyMTksOSBAQAogCQlpZiAoIUlzUmVhZE9ubHkod25kUHRyKSAmJiAhKHNoaWZ0ICYmIGNvbnRyb2wpKQogCQkJaWYgKGUgIT0gcykgewogCQkJCWlmIChzaGlmdCkKLQkJCQkJRURJVF9XTV9DdXQod25kUHRyLCAwLCAwTCk7CisJCQkJCUVESVRfV01fQ3V0KHduZFB0ciwgMCwgMCk7CiAJCQkJZWxzZQotCQkJCQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMEwpOworCQkJCQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMCk7CiAJCQl9IGVsc2UgewogCQkJCWlmIChzaGlmdCkKIAkJCQkJRURJVF9EZWxMZWZ0KHduZFB0cik7CkBAIC0yNTUyLDEyICszMjM0LDEyIEBACiAJY2FzZSBWS19JTlNFUlQ6CiAJCWlmIChzaGlmdCkgewogCQkJaWYgKCFJc1JlYWRPbmx5KHduZFB0cikpCi0JCQkJRURJVF9XTV9QYXN0ZSh3bmRQdHIsIDAsIDBMKTsKKwkJCQlFRElUX1dNX1Bhc3RlKHduZFB0ciwgMCwgMCk7CiAJCX0gZWxzZSBpZiAoY29udHJvbCkKLQkJCUVESVRfV01fQ29weSh3bmRQdHIsIDAsIDBMKTsKKwkJCUVESVRfV01fQ29weSh3bmRQdHIsIDAsIDApOwogCQlicmVhazsKIAl9Ci0JcmV0dXJuIDBMOworCXJldHVybiAwOwogfQogCiAKQEAgLTI1NjgsMTcgKzMyNTAsMTcgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9LaWxsRm9jdXMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlVSU5UIHM7Ci0JVUlOVCBlOworCUlOVDMyIHM7CisJSU5UMzIgZTsKIAogCURlc3Ryb3lDYXJldCgpOwogCWlmKCEod25kUHRyLT5kd1N0eWxlICYgRVNfTk9ISURFU0VMKSkgewotCQlzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQkJZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7CisJCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKIAkJRURJVF9JbnZhbGlkYXRlVGV4dCh3bmRQdHIsIHMsIGUpOwogCX0KKwlkcHJpbnRmX2VkaXQoc3RkZGViLCAiZWRpdDogbm90aWZpY2F0aW9uIEVOX0tJTExGT0NVUyBzZW50XG4iKTsKIAlFRElUX05PVElGWV9QQVJFTlQod25kUHRyLCBFTl9LSUxMRk9DVVMpOwotCXJldHVybiAwTDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yNTkxLDE3ICszMjczLDIyIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fTEJ1dHRvbkRibENsayhXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCVVJTlQgczsKLQlVSU5UIGUgPSBISVdPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgbCA9IChVSU5UKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMEwpOwotCVVJTlQgbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQlVSU5UIGxsID0gKFVJTlQpRURJVF9FTV9MaW5lTGVuZ3RoKHduZFB0ciwgZSwgMEwpOwotCWNoYXIgKnRleHQgPSBFRElUX0dldFBvaW50ZXIod25kUHRyKTsKKwlJTlQzMiBzOworCUlOVDMyIGU7CisJSU5UMzIgbDsKKwlJTlQzMiBsaTsKKwlJTlQzMiBsbDsKKwlMUFNUUiB0ZXh0ID0gRURJVF9HZXRQb2ludGVyKHduZFB0cik7CiAKKwlFRElUX0dldFNlbCh3bmRQdHIsIE5VTEwsICZlKTsKKwlsID0gKElOVDMyKUVESVRfRU1fTGluZUZyb21DaGFyKHduZFB0ciwgZSwgMCk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwlsbCA9IChJTlQzMilFRElUX0VNX0xpbmVMZW5ndGgod25kUHRyLCBlLCAwKTsKIAlzID0gbGkgKyBFRElUX0NhbGxXb3JkQnJlYWtQcm9jICh3bmRQdHIsIHRleHQgKyBsaSwgZSAtIGxpLCBsbCwgV0JfTEVGVCk7CiAJZSA9IGxpICsgRURJVF9DYWxsV29yZEJyZWFrUHJvYyh3bmRQdHIsIHRleHQgKyBsaSwgZSAtIGxpLCBsbCwgV0JfUklHSFQpOwotCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgTUFLRUxQQVJBTShzLCBlKSk7Ci0JcmV0dXJuIDBMOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CisJRURJVF9FTV9TY3JvbGxDYXJldCh3bmRQdHIsIDAsIDApOworCXJldHVybiAwOwogfQogCiAKQEAgLTI2MTIsMjkgKzMyOTksMzAgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9MQnV0dG9uRG93bihXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUlOVCB4ID0gKElOVClMT1dPUkQobFBhcmFtKTsKLQlJTlQgeSA9IChJTlQpSElXT1JEKGxQYXJhbSk7Ci0JVUlOVCBsID0gRURJVF9MaW5lRnJvbVduZFkod25kUHRyLCB5KTsKLQlVSU5UIGM7Ci0JVUlOVCBzOwotCVVJTlQgZTsKLQlVSU5UIGZ2ID0gKFVJTlQpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMEwpOwotCVVJTlQgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7Ci0JVUlOVCBsaTsKKwlJTlQzMiB4ID0gKElOVDMyKShJTlQxNilMT1dPUkQobFBhcmFtKTsKKwlJTlQzMiB5ID0gKElOVDMyKShJTlQxNilISVdPUkQobFBhcmFtKTsKKwlJTlQzMiBsID0gRURJVF9MaW5lRnJvbVduZFkod25kUHRyLCB5KTsKKwlJTlQzMiBjOworCUlOVDMyIHM7CisJSU5UMzIgZTsKKwlJTlQzMiBmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKKwlJTlQzMiB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKKwlJTlQzMiBsaTsKIAogCVNldEZvY3VzMzIod25kUHRyLT5od25kU2VsZik7CiAJU2V0Q2FwdHVyZTMyKHduZFB0ci0+aHduZFNlbGYpOwogCWwgPSBNSU4oZnYgKyB2bGMgLSAxLCBNQVgoZnYsIGwpKTsKIAl4ID0gTUlOKEVESVRfR2V0V25kV2lkdGgod25kUHRyKSwgTUFYKDAsIHgpKTsKIAljID0gRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwotCWxpID0gKFVJTlQpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwTCk7CisJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKIAllID0gbGkgKyBjOwogCWlmIChHZXRLZXlTdGF0ZShWS19TSElGVCkgJiAweDgwMDApCi0JCXMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCWVsc2UgCisJCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsIE5VTEwpOworCWVsc2UKIAkJcyA9IGU7Ci0JRURJVF9FTV9TZXRTZWwod25kUHRyLCAwLCBNQUtFTFBBUkFNKHMsIGUpKTsKLQlyZXR1cm4gMEw7CisJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBlKTsKKwlFRElUX0VNX1Njcm9sbENhcmV0KHduZFB0ciwgMCwgMCk7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjY0Nyw3ICszMzM1LDcgQEAKIHsKIAlpZiAoR2V0Q2FwdHVyZTMyKCkgPT0gd25kUHRyLT5od25kU2VsZikKIAkJUmVsZWFzZUNhcHR1cmUoKTsKLQlyZXR1cm4gMEw7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjY1OCwyOSArMzM0NiwyOSBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX01vdXNlTW92ZShXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCUlOVCB4OwotCUlOVCB5OwotCVVJTlQgbDsKLQlVSU5UIGM7Ci0JVUlOVCBzOwotCVVJTlQgZnY7Ci0JVUlOVCB2bGM7Ci0JVUlOVCBsaTsKKwlJTlQzMiB4OworCUlOVDMyIHk7CisJSU5UMzIgbDsKKwlJTlQzMiBjOworCUlOVDMyIHM7CisJSU5UMzIgZnY7CisJSU5UMzIgdmxjOworCUlOVDMyIGxpOwogCiAJaWYgKEdldENhcHR1cmUzMigpID09IHduZFB0ci0+aHduZFNlbGYpIHsKLQkJeCA9IChJTlQpTE9XT1JEKGxQYXJhbSk7Ci0JCXkgPSAoSU5UKUhJV09SRChsUGFyYW0pOwotCQlmdiA9IChVSU5UKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDBMKTsKKwkJeCA9IChJTlQzMikoSU5UMTYpTE9XT1JEKGxQYXJhbSk7CisJCXkgPSAoSU5UMzIpKElOVDE2KUhJV09SRChsUGFyYW0pOworCQlmdiA9IChJTlQzMilFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwKTsKIAkJdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CiAJCWwgPSBFRElUX0xpbmVGcm9tV25kWSh3bmRQdHIsIHkpOwogCQlsID0gTUlOKGZ2ICsgdmxjIC0gMSwgTUFYKGZ2LCBsKSk7CiAJCXggPSBNSU4oRURJVF9HZXRXbmRXaWR0aCh3bmRQdHIpLCBNQVgoMCwgeCkpOwogCQljID0gRURJVF9Db2xGcm9tV25kWCh3bmRQdHIsIGwsIHgpOwotCQlzID0gTE9XT1JEKEVESVRfR2V0U2VsKHduZFB0ciwgMCwgMEwpKTsKLQkJbGkgPSAoVUlOVClFRElUX0VNX0xpbmVJbmRleCh3bmRQdHIsIGwsIDBMKTsKLQkJRURJVF9FTV9TZXRTZWwod25kUHRyLCAxLCBNQUtFTFBBUkFNKHMsIGxpICsgYykpOworCQlFRElUX0dldFNlbCh3bmRQdHIsICZzLCBOVUxMKTsKKwkJbGkgPSAoSU5UMzIpRURJVF9FTV9MaW5lSW5kZXgod25kUHRyLCBsLCAwKTsKKwkJRURJVF9FTV9TZXRTZWwod25kUHRyLCBzLCBsaSArIGMpOwogCX0KLQlyZXR1cm4gMEw7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjY5MSwzOCArMzM3OSwzOSBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1BhaW50KFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JUEFJTlRTVFJVQ1QxNiBwczsKLQlVSU5UIGk7Ci0JVUlOVCBmdiA9IChVSU5UKUVESVRfRU1fR2V0Rmlyc3RWaXNpYmxlTGluZSh3bmRQdHIsIDAsIDBMKTsKLQlVSU5UIHZsYyA9IEVESVRfR2V0VmlzaWJsZUxpbmVDb3VudCh3bmRQdHIpOwotCVVJTlQgbGMgPSAoVUlOVClFRElUX0VNX0dldExpbmVDb3VudCh3bmRQdHIsIDAsIDBMKTsKLQlIREMxNiBoZGM7Ci0JSEZPTlQxNiBoRm9udDsKKwlQQUlOVFNUUlVDVDMyIHBzOworCUlOVDMyIGk7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CisJSU5UMzIgbGMgPSAoSU5UMzIpRURJVF9FTV9HZXRMaW5lQ291bnQod25kUHRyLCAwLCAwKTsKKwlIREMzMiBoZGM7CisJSEZPTlQzMiBoRm9udDsKIAlIRk9OVDMyIG9sZEZvbnQgPSAwOwotCVJFQ1QxNiByYzsKLQlSRUNUMTYgcmNMaW5lOwotCVJFQ1QxNiByY1JnbjsKLQlCT09MIHJldiA9IElzV2luZG93RW5hYmxlZCh3bmRQdHItPmh3bmRTZWxmKSAmJgorCVJFQ1QzMiByYzsKKwlSRUNUMzIgcmNMaW5lOworCVJFQ1QzMiByY1JnbjsKKwlCT09MMzIgcmV2ID0gSXNXaW5kb3dFbmFibGVkKHduZFB0ci0+aHduZFNlbGYpICYmCiAJCQkJKChHZXRGb2N1czMyKCkgPT0gd25kUHRyLT5od25kU2VsZikgfHwKIAkJCQkJKHduZFB0ci0+ZHdTdHlsZSAmIEVTX05PSElERVNFTCkpOwogCi0JaGRjID0gQmVnaW5QYWludDE2KHduZFB0ci0+aHduZFNlbGYsICZwcyk7Ci0JR2V0Q2xpZW50UmVjdDE2KHduZFB0ci0+aHduZFNlbGYsICZyYyk7Ci0JSW50ZXJzZWN0Q2xpcFJlY3QxNiggaGRjLCByYy5sZWZ0LCByYy50b3AsIHJjLnJpZ2h0LCByYy5ib3R0b20gKTsKLQloRm9udCA9IEVESVRfV01fR2V0Rm9udCh3bmRQdHIsIDAsIDBMKTsKLQlpZiAoaEZvbnQpIG9sZEZvbnQgPSBTZWxlY3RPYmplY3QzMihoZGMsIGhGb250KTsKKwloZGMgPSBCZWdpblBhaW50MzIod25kUHRyLT5od25kU2VsZiwgJnBzKTsKKwlHZXRDbGllbnRSZWN0MzIod25kUHRyLT5od25kU2VsZiwgJnJjKTsKKwlJbnRlcnNlY3RDbGlwUmVjdDMyKCBoZGMsIHJjLmxlZnQsIHJjLnRvcCwgcmMucmlnaHQsIHJjLmJvdHRvbSApOworCWhGb250ID0gKEhGT05UMzIpRURJVF9XTV9HZXRGb250KHduZFB0ciwgMCwgMCk7CisJaWYgKGhGb250KQorCQlvbGRGb250ID0gKEhGT05UMzIpU2VsZWN0T2JqZWN0MzIoaGRjLCBoRm9udCk7CiAJRURJVF9TRU5EX0NUTENPTE9SKHduZFB0ciwgaGRjKTsKIAlpZiAoIUlzV2luZG93RW5hYmxlZCh3bmRQdHItPmh3bmRTZWxmKSkKIAkJU2V0VGV4dENvbG9yKGhkYywgR2V0U3lzQ29sb3IoQ09MT1JfR1JBWVRFWFQpKTsKLQlHZXRDbGlwQm94MTYoaGRjLCAmcmNSZ24pOworCUdldENsaXBCb3gzMihoZGMsICZyY1Jnbik7CiAJZm9yIChpID0gZnYgOyBpIDw9IE1JTihmdiArIHZsYywgZnYgKyBsYyAtIDEpIDsgaSsrICkgewogCQlFRElUX0dldExpbmVSZWN0KHduZFB0ciwgaSwgMCwgLTEsICZyY0xpbmUpOwotCQlpZiAoSW50ZXJzZWN0UmVjdDE2KCZyYywgJnJjUmduLCAmcmNMaW5lKSkKKwkJaWYgKEludGVyc2VjdFJlY3QzMigmcmMsICZyY1JnbiwgJnJjTGluZSkpCiAJCQlFRElUX1BhaW50TGluZSh3bmRQdHIsIGhkYywgaSwgcmV2KTsKIAl9CiAJaWYgKGhGb250KSBTZWxlY3RPYmplY3QzMihoZGMsIG9sZEZvbnQpOwotCUVuZFBhaW50MTYod25kUHRyLT5od25kU2VsZiwgJnBzKTsKLQlyZXR1cm4gMEw7CisJRW5kUGFpbnQzMih3bmRQdHItPmh3bmRTZWxmLCAmcHMpOworCXJldHVybiAwOwogfQogCiAKQEAgLTI3MzQsMTYgKzM0MjMsMTYgQEAKIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fUGFzdGUoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKIAlIR0xPQkFMMTYgaHNyYzsKLQljaGFyICpzcmM7CisJTFBTVFIgc3JjOwogCiAJT3BlbkNsaXBib2FyZCh3bmRQdHItPmh3bmRTZWxmKTsKIAlpZiAoKGhzcmMgPSBHZXRDbGlwYm9hcmREYXRhKENGX1RFWFQpKSkgewotCQlzcmMgPSAoY2hhciAqKUdsb2JhbExvY2sxNihoc3JjKTsKLQkJRURJVF9SZXBsYWNlU2VsKHduZFB0ciwgMCwgKExQQVJBTSlzcmMpOworCQlzcmMgPSAoTFBTVFIpR2xvYmFsTG9jazE2KGhzcmMpOworCQlFRElUX0VNX1JlcGxhY2VTZWwod25kUHRyLCAwLCAoTFBBUkFNKXNyYyk7CiAJCUdsb2JhbFVubG9jazE2KGhzcmMpOwogCX0KIAlDbG9zZUNsaXBib2FyZCgpOwotCXJldHVybiAtMUw7CisJcmV0dXJuIC0xOwogfQogCiAKQEAgLTI3NTYsOSArMzQ0NSw5IEBACiB7CiAJaWYgKExPV09SRChsUGFyYW0pID09IEhUQ0xJRU5UKSB7CiAJCVNldEN1cnNvcihMb2FkQ3Vyc29yMTYoMCwgSURDX0lCRUFNKSk7Ci0JCXJldHVybiAtMUw7CisJCXJldHVybiAtMTsKIAl9IGVsc2UKLQkJcmV0dXJuIDBMOworCQlyZXR1cm4gMDsKIH0KIAogCkBAIC0yNzY5LDE2ICszNDU4LDE4IEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0Rm9jdXMoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlVSU5UIHMgPSBMT1dPUkQoRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCkpOwotCVVJTlQgZSA9IEhJV09SRChFRElUX0dldFNlbCh3bmRQdHIsIDAsIDBMKSk7CisJSU5UMzIgczsKKwlJTlQzMiBlOwogCisJRURJVF9HZXRTZWwod25kUHRyLCAmcywgJmUpOwogCUNyZWF0ZUNhcmV0KHduZFB0ci0+aHduZFNlbGYsIDAsIDIsIEVESVRfR2V0TGluZUhlaWdodCh3bmRQdHIpKTsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDEsIE1BS0VMUEFSQU0ocywgZSkpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgcywgZSk7CiAJaWYoISh3bmRQdHItPmR3U3R5bGUgJiBFU19OT0hJREVTRUwpKQogCQlFRElUX0ludmFsaWRhdGVUZXh0KHduZFB0ciwgcywgZSk7CiAJU2hvd0NhcmV0KHduZFB0ci0+aHduZFNlbGYpOworCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fU0VURk9DVVMgc2VudFxuIik7CiAJRURJVF9OT1RJRllfUEFSRU5UKHduZFB0ciwgRU5fU0VURk9DVVMpOwotCXJldHVybiAwTDsKKwlyZXR1cm4gMDsKIH0KIAogCkBAIC0yNzg5LDMwICszNDgwLDMyIEBACiAgKi8KIHN0YXRpYyBMUkVTVUxUIEVESVRfV01fU2V0Rm9udChXTkQgKnduZFB0ciwgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtKQogewotCVRFWFRNRVRSSUMxNiB0bTsKKwlURVhUTUVUUklDMzJBIHRtOwogCUVESVRTVEFURSAqZXMgPSBFRElUU1RBVEVQVFIod25kUHRyKTsKLQlMUEFSQU0gc2VsID0gRURJVF9HZXRTZWwod25kUHRyLCAwLCAwTCk7CisJSU5UMzIgczsKKwlJTlQzMiBlOwogCUhEQzMyIGhkYzsKIAlIRk9OVDMyIG9sZEZvbnQgPSAwOwogCi0JZXMtPmhGb250ID0gKEhGT05UMTYpd1BhcmFtOworCUVESVRfR2V0U2VsKHduZFB0ciwgJnMsICZlKTsKKwllcy0+aEZvbnQgPSAoSEZPTlQzMil3UGFyYW07CiAJaGRjID0gR2V0REMzMih3bmRQdHItPmh3bmRTZWxmKTsKIAlpZiAoZXMtPmhGb250KSBvbGRGb250ID0gU2VsZWN0T2JqZWN0MzIoaGRjLCBlcy0+aEZvbnQpOwotCUdldFRleHRNZXRyaWNzMTYoaGRjLCAmdG0pOwotCWVzLT5MaW5lSGVpZ2h0ID0gSElXT1JEKEdldFRleHRFeHRlbnQoaGRjLCAiWCIsIDEpKTsKKwlHZXRUZXh0TWV0cmljczMyQShoZGMsICZ0bSk7CisJZXMtPkxpbmVIZWlnaHQgPSB0bS50bUhlaWdodDsKIAllcy0+QXZlQ2hhcldpZHRoID0gdG0udG1BdmVDaGFyV2lkdGg7CiAJaWYgKGVzLT5oRm9udCkgU2VsZWN0T2JqZWN0MzIoaGRjLCBvbGRGb250KTsKIAlSZWxlYXNlREMzMih3bmRQdHItPmh3bmRTZWxmLCBoZGMpOwogCUVESVRfQnVpbGRMaW5lRGVmcyh3bmRQdHIpOwotCWlmICgoQk9PTClsUGFyYW0gJiYgRURJVF9HZXRSZWRyYXcod25kUHRyKSkKKwlpZiAoKEJPT0wzMilsUGFyYW0gJiYgRURJVF9HZXRSZWRyYXcod25kUHRyKSkKIAkJSW52YWxpZGF0ZVJlY3QzMiggd25kUHRyLT5od25kU2VsZiwgTlVMTCwgVFJVRSApOwogCWlmICh3bmRQdHItPmh3bmRTZWxmID09IEdldEZvY3VzMzIoKSkgewogCQlEZXN0cm95Q2FyZXQoKTsKIAkJQ3JlYXRlQ2FyZXQod25kUHRyLT5od25kU2VsZiwgMCwgMiwgRURJVF9HZXRMaW5lSGVpZ2h0KHduZFB0cikpOwotCQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDEsIHNlbCk7CisJCUVESVRfRU1fU2V0U2VsMTYod25kUHRyLCBzLCBlKTsKIAkJU2hvd0NhcmV0KHduZFB0ci0+aHduZFNlbGYpOwogCX0KLQlyZXR1cm4gMEw7CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjgyNSw4ICszNTE4LDggQEAKIHsKIAlFRElUU1RBVEUgKmVzID0gRURJVFNUQVRFUFRSKHduZFB0cik7CiAKLQllcy0+UmVkcmF3ID0gKEJPT0wpd1BhcmFtOwotCXJldHVybiAwTDsKKwllcy0+UmVkcmF3ID0gKEJPT0wzMil3UGFyYW07CisJcmV0dXJuIDA7CiB9CiAKIApAQCAtMjgzNywxNCArMzUzMCwxNSBAQAogICovCiBzdGF0aWMgTFJFU1VMVCBFRElUX1dNX1NldFRleHQoV05EICp3bmRQdHIsIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSkKIHsKLQlFRElUX0VNX1NldFNlbCh3bmRQdHIsIDEsIE1BS0VMUEFSQU0oMCwgLTEpKTsKLQlFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMEwpOworCUVESVRfRU1fU2V0U2VsKHduZFB0ciwgMCwgLTEpOwogCWlmIChsUGFyYW0pCiAJCUVESVRfRU1fUmVwbGFjZVNlbCh3bmRQdHIsIDAsIGxQYXJhbSk7Ci0JRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwTCk7Ci0JRURJVF9FTV9TZXRNb2RpZnkod25kUHRyLCBUUlVFLCAwTCk7Ci0JRURJVF9TY3JvbGxJbnRvVmlldyh3bmRQdHIpOwotCXJldHVybiAwTDsKKwllbHNlCisgICAgICAgICAgICBFRElUX1dNX0NsZWFyKHduZFB0ciwgMCwgMCk7CisJRURJVF9FTV9FbXB0eVVuZG9CdWZmZXIod25kUHRyLCAwLCAwKTsKKwlFRElUX0VNX1NldE1vZGlmeSh3bmRQdHIsIFRSVUUsIDApOworCUVESVRfRU1fU2Nyb2xsQ2FyZXQod25kUHRyLCAwLCAwKTsKKwlyZXR1cm4gMTsKIH0KIAogCkBAIC0yODUyLDkgKzM1NDYsMTQgQEAKICAqCiAgKglXTV9TSVpFCiAgKgorICoJRklYTUU6IFdoYXQgYWJvdXQgdGhhdCBGb3JtYXRSZWN0ID8/PworICoKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9TaXplKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7CisJRURJVFNUQVRFICplcyA9IEVESVRTVEFURVBUUih3bmRQdHIpOworCisJR2V0Q2xpZW50UmVjdDMyKHduZFB0ci0+aHduZFNlbGYsICZlcy0+Rm9ybWF0UmVjdCk7CiAJaWYgKEVESVRfR2V0UmVkcmF3KHduZFB0cikgJiYKIAkJCSgod1BhcmFtID09IFNJWkVfTUFYSU1JWkVEKSB8fAogCQkJCSh3UGFyYW0gPT0gU0laRV9SRVNUT1JFRCkpKSB7CkBAIC0yODYyLDcgKzM1NjEsNyBAQAogCQkJRURJVF9CdWlsZExpbmVEZWZzKHduZFB0cik7CiAJCUludmFsaWRhdGVSZWN0MzIoIHduZFB0ci0+aHduZFNlbGYsIE5VTEwsIFRSVUUgKTsKIAl9Ci0JcmV0dXJuIDBMOworCXJldHVybiAwOwogfQogCiAKQEAgLTI4NzUsMTIgKzM1NzQsMTIgQEAKICAqLwogc3RhdGljIExSRVNVTFQgRURJVF9XTV9WU2Nyb2xsKFdORCAqd25kUHRyLCBXUEFSQU0zMiB3UGFyYW0sIExQQVJBTSBsUGFyYW0pCiB7Ci0JVUlOVCBsYyA9IChVSU5UKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMEwpOwotCVVJTlQgZnYgPSAoVUlOVClFRElUX0VNX0dldEZpcnN0VmlzaWJsZUxpbmUod25kUHRyLCAwLCAwTCk7Ci0JVUlOVCB2bGMgPSBFRElUX0dldFZpc2libGVMaW5lQ291bnQod25kUHRyKTsKLQlJTlQgZHkgPSAwOwotCUJPT0wgbm90ID0gVFJVRTsKLQlMUkVTVUxUIHJldCA9IDBMOworCUlOVDMyIGxjID0gKElOVDMyKUVESVRfRU1fR2V0TGluZUNvdW50KHduZFB0ciwgMCwgMCk7CisJSU5UMzIgZnYgPSAoSU5UMzIpRURJVF9FTV9HZXRGaXJzdFZpc2libGVMaW5lKHduZFB0ciwgMCwgMCk7CisJSU5UMzIgdmxjID0gRURJVF9HZXRWaXNpYmxlTGluZUNvdW50KHduZFB0cik7CisJSU5UMzIgZHkgPSAwOworCUJPT0wzMiBub3QgPSBUUlVFOworCUxSRVNVTFQgcmV0ID0gMDsKIAogCXN3aXRjaCAod1BhcmFtKSB7CiAJY2FzZSBTQl9MSU5FVVA6CkBAIC0yOTAyLDI3ICszNjAxLDI4IEBACiAJCWR5ID0gbGMgLSAxIC0gZnY7CiAJCWJyZWFrOwogCWNhc2UgU0JfVEhVTUJUUkFDSzoKLS8qCi0gKgkJbm90ID0gRkFMU0U7Ci0gKi8KKwkJbm90ID0gRkFMU0U7CisJCS8qIGZhbGwgdGhyb3VnaCAqLwogCWNhc2UgU0JfVEhVTUJQT1NJVElPTjoKLQkJZHkgPSBMT1dPUkQobFBhcmFtKSAqIChsYyAtIDEpIC8gMTAwIC0gZnY7CisJCWR5ID0gSElXT1JEKHdQYXJhbSkgKiAobGMgLSAxKSAvIDEwMCAtIGZ2OwogCQlicmVhazsKIAkvKiBUaGUgbmV4dCB0d28gYXJlIHVuZG9jdW1lbnRlZCAhICovCi0JY2FzZSBFTV9HRVRUSFVNQjoKLQkJcmV0ID0gKGxjID4gMSkgPyBNQUtFTE9ORyhmdiAqIDEwMCAvIChsYyAtIDEpLCAwKSA6IDBMOworCWNhc2UgRU1fR0VUVEhVTUIxNjoKKwkJcmV0ID0gKGxjID4gMSkgPyBNQUtFTE9ORyhmdiAqIDEwMCAvIChsYyAtIDEpLCAwKSA6IDA7CiAJCWJyZWFrOwotCWNhc2UgRU1fTElORVNDUk9MTDoKLQkJZHkgPSBMT1dPUkQobFBhcmFtKTsKKwljYXNlIEVNX0xJTkVTQ1JPTEwxNjoKKwkJZHkgPSAoSU5UMTYpTE9XT1JEKGxQYXJhbSk7CiAJCWJyZWFrOwogCWNhc2UgU0JfRU5EU0NST0xMOgogCWRlZmF1bHQ6CiAJCWJyZWFrOwogCX0KIAlpZiAoZHkpIHsKLQkJRURJVF9FTV9MaW5lU2Nyb2xsKHduZFB0ciwgMCwgTUFLRUxQQVJBTShkeSwgMCkpOwotCQlpZiAobm90KQorCQlFRElUX0VNX0xpbmVTY3JvbGwod25kUHRyLCAwLCBkeSk7CisJCWlmIChub3QpIHsKKwkJCWRwcmludGZfZWRpdChzdGRkZWIsICJlZGl0OiBub3RpZmljYXRpb24gRU5fVlNDUk9MTCBzZW50XG4iKTsKIAkJCUVESVRfTk9USUZZX1BBUkVOVCh3bmRQdHIsIEVOX1ZTQ1JPTEwpOworCQl9CiAJfQogCXJldHVybiByZXQ7CiB9CmRpZmYgLS1naXQgYS9jb250cm9scy9saXN0Ym94LmMgYi9jb250cm9scy9saXN0Ym94LmMKaW5kZXggNzBmMTNiMy4uMGYzYjQzMSAxMDA2NDQKLS0tIGEvY29udHJvbHMvbGlzdGJveC5jCisrKyBiL2NvbnRyb2xzL2xpc3Rib3guYwpAQCAtMTQ4Nyw3ICsxNDg3LDcgQEAKICAgICAgICAgICAgICAgICBpZiAobG9uZ19uYW1lcykgc3RyY3B5KCBidWZmZXIsIGVudHJ5LmNGaWxlTmFtZSApOwogICAgICAgICAgICAgICAgIGVsc2Ugc3RyY3B5KCBidWZmZXIsIGVudHJ5LmNBbHRlcm5hdGVGaWxlTmFtZSApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFsb25nX25hbWVzKSBBbnNpTG93ZXIoIGJ1ZmZlciApOworICAgICAgICAgICAgaWYgKCFsb25nX25hbWVzKSBDaGFyTG93ZXIzMkEoIGJ1ZmZlciApOwogICAgICAgICAgICAgcG9zID0gTElTVEJPWF9GaW5kRmlsZVN0clBvcyggd25kLCBkZXNjciwgYnVmZmVyICk7CiAgICAgICAgICAgICBpZiAoKHJldCA9IExJU1RCT1hfSW5zZXJ0U3RyaW5nKCB3bmQsIGRlc2NyLCBwb3MsIGJ1ZmZlciApKSA8IDApCiAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0yMjA2LDggKzIyMDYsMTIgQEAKIAogICAgIGNhc2UgTEJfU0VMSVRFTVJBTkdFMTY6CiAgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0UzMjoKLSAgICAgICAgcmV0dXJuIExJU1RCT1hfU2VsZWN0SXRlbVJhbmdlKCB3bmQsIGRlc2NyLCBMT1dPUkQobFBhcmFtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBISVdPUkQobFBhcmFtKSwgd1BhcmFtICk7CisgICAgICAgIGlmIChMT1dPUkQobFBhcmFtKSA8PSBISVdPUkQobFBhcmFtKSkKKyAgICAgICAgICAgIHJldHVybiBMSVNUQk9YX1NlbGVjdEl0ZW1SYW5nZSggd25kLCBkZXNjciwgTE9XT1JEKGxQYXJhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhJV09SRChsUGFyYW0pLCB3UGFyYW0gKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmV0dXJuIExJU1RCT1hfU2VsZWN0SXRlbVJhbmdlKCB3bmQsIGRlc2NyLCBISVdPUkQobFBhcmFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9XT1JEKGxQYXJhbSksIHdQYXJhbSApOwogCiAgICAgY2FzZSBMQl9TRUxJVEVNUkFOR0VFWDE2OgogICAgIGNhc2UgTEJfU0VMSVRFTVJBTkdFRVgzMjoKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA4YzYxMjNmLi4xOTcyNjJmIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0xMSw2ICsxMSw3IEBACiAgKiBUaGlzIGlzIHByb2JhYmx5IG5vdCB0aGUgbWVhbmluZyB0aGlzIHN0eWxlIGhhcyBpbiBNUy1XaW5kb3dzLgogICovCiAKKyNkZWZpbmUgTk9fVFJBTlNJVElPTl9UWVBFUyAgLyogVGhpcyBmaWxlIGlzIFdpbjMyLWNsZWFuICovCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtMjQsNiArMjUsNyBAQAogI2luY2x1ZGUgIm1lbnUuaCIKICNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgorI2luY2x1ZGUgIm5vbmNsaWVudC5oIgogI2luY2x1ZGUgInVzZXIuaCIKICNpbmNsdWRlICJtZXNzYWdlLmgiCiAjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKQEAgLTM0LDEyICszNiwxMiBAQAogLyogTWVudSBpdGVtIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBXT1JECWl0ZW1fZmxhZ3M7ICAgIC8qIEl0ZW0gZmxhZ3MgKi8KLSAgICBVSU5UCWl0ZW1faWQ7ICAgICAgIC8qIEl0ZW0gb3IgcG9wdXAgaWQgKi8KLSAgICBSRUNUMTYgICAgICByZWN0OyAgICAgICAgICAvKiBJdGVtIGFyZWEgKHJlbGF0aXZlIHRvIG1lbnUgd2luZG93KSAqLwotICAgIFdPUkQgICAgICAgIHhUYWI7ICAgICAgICAgIC8qIFggcG9zaXRpb24gb2YgdGV4dCBhZnRlciBUYWIgKi8KLSAgICBIQklUTUFQMTYJaENoZWNrQml0OyAgICAgLyogQml0bWFwIGZvciBjaGVja2VkIGl0ZW0gKi8KLSAgICBIQklUTUFQMTYJaFVuQ2hlY2tCaXQ7ICAgLyogQml0bWFwIGZvciB1bmNoZWNrZWQgaXRlbSAqLworICAgIFVJTlQzMiAgICAgIGl0ZW1fZmxhZ3M7ICAgIC8qIEl0ZW0gZmxhZ3MgKi8KKyAgICBVSU5UMzIgICAgICBpdGVtX2lkOyAgICAgICAvKiBJdGVtIG9yIHBvcHVwIGlkICovCisgICAgUkVDVDMyICAgICAgcmVjdDsgICAgICAgICAgLyogSXRlbSBhcmVhIChyZWxhdGl2ZSB0byBtZW51IHdpbmRvdykgKi8KKyAgICBVSU5UMzIgICAgICB4VGFiOyAgICAgICAgICAvKiBYIHBvc2l0aW9uIG9mIHRleHQgYWZ0ZXIgVGFiICovCisgICAgSEJJVE1BUDMyICAgaENoZWNrQml0OyAgICAgLyogQml0bWFwIGZvciBjaGVja2VkIGl0ZW0gKi8KKyAgICBIQklUTUFQMzIgICBoVW5DaGVja0JpdDsgICAvKiBCaXRtYXAgZm9yIHVuY2hlY2tlZCBpdGVtICovCiAgICAgTFBTVFIgICAgICAgdGV4dDsgICAgICAgICAgLyogSXRlbSB0ZXh0IG9yIGJpdG1hcCBoYW5kbGUgKi8KIH0gTUVOVUlURU07CiAKQEAgLTUyLDkgKzU0LDkgQEAKICAgICBXT1JECVdpZHRoOyAgICAgICAgLyogV2lkdGggb2YgdGhlIHdob2xlIG1lbnUgKi8KICAgICBXT1JECUhlaWdodDsgICAgICAgLyogSGVpZ2h0IG9mIHRoZSB3aG9sZSBtZW51ICovCiAgICAgV09SRAluSXRlbXM7ICAgICAgIC8qIE51bWJlciBvZiBpdGVtcyBpbiB0aGUgbWVudSAqLwotICAgIEhXTkQJaFduZDsJICAgICAgLyogV2luZG93IGNvbnRhaW5pbmcgdGhlIG1lbnUgKi8KKyAgICBIV05EMzIgICAgICBoV25kOyAgICAgICAgIC8qIFdpbmRvdyBjb250YWluaW5nIHRoZSBtZW51ICovCiAgICAgTUVOVUlURU0gICAqaXRlbXM7ICAgICAgICAvKiBBcnJheSBvZiBtZW51IGl0ZW1zICovCi0gICAgVUlOVAlGb2N1c2VkSXRlbTsgIC8qIEN1cnJlbnRseSBmb2N1c2VkIGl0ZW0gKi8KKyAgICBVSU5UMzIgICAgICBGb2N1c2VkSXRlbTsgIC8qIEN1cnJlbnRseSBmb2N1c2VkIGl0ZW0gKi8KIH0gUE9QVVBNRU5VLCAqTFBQT1BVUE1FTlU7CiAKICNkZWZpbmUgTUVOVV9NQUdJQyAgIDB4NTU0ZCAgLyogJ01VJyAqLwpAQCAtNjcsNyArNjksNyBAQAogc3RhdGljIFdPUkQgYXJyb3dfYml0bWFwX3dpZHRoID0gMCwgYXJyb3dfYml0bWFwX2hlaWdodCA9IDA7CiAKICAgLyogRmxhZyBzZXQgYnkgRW5kTWVudSgpIHRvIGZvcmNlIGFuIGV4aXQgZnJvbSBtZW51IHRyYWNraW5nICovCi1zdGF0aWMgQk9PTCBmRW5kTWVudUNhbGxlZCA9IEZBTFNFOworc3RhdGljIEJPT0wzMiBmRW5kTWVudUNhbGxlZCA9IEZBTFNFOwogCiAgIC8qIFNwYWNlIGJldHdlZW4gMiBtZW51IGJhciBpdGVtcyAqLwogI2RlZmluZSBNRU5VX0JBUl9JVEVNU19TUEFDRSAgMTYKQEAgLTg2LDEyICs4OCw5IEBACiAjZGVmaW5lIElTX1NUUklOR19JVEVNKGZsYWdzKSBcCiAgICAgKCEoKGZsYWdzKSAmIChNRl9CSVRNQVAgfCBNRl9PV05FUkRSQVcgfCBNRl9TRVBBUkFUT1IpKSkKIAotZXh0ZXJuIHZvaWQgIE5DX0RyYXdTeXNCdXR0b24oSFdORCBod25kLCBIREMzMiBoZGMsIEJPT0wgZG93bik7IC8qbm9uY2xpZW50LmMqLwotZXh0ZXJuIEJPT0wgIE5DX0dldFN5c1BvcHVwUG9zKFdORCogd25kUHRyLCBSRUNUMTYqIHJlY3QpOwotCi1zdGF0aWMgSEJJVE1BUDE2IGhTdGRDaGVjayA9IDA7Ci1zdGF0aWMgSEJJVE1BUDE2IGhTdGRNbkFycm93ID0gMDsKLXN0YXRpYyBITUVOVTE2IE1FTlVfRGVmU3lzTWVudSA9IDA7ICAvKiBEZWZhdWx0IHN5c3RlbSBtZW51ICovCitzdGF0aWMgSEJJVE1BUDMyIGhTdGRDaGVjayA9IDA7CitzdGF0aWMgSEJJVE1BUDMyIGhTdGRNbkFycm93ID0gMDsKK3N0YXRpYyBITUVOVTMyIE1FTlVfRGVmU3lzTWVudSA9IDA7ICAvKiBEZWZhdWx0IHN5c3RlbSBtZW51ICovCiAKIAogLyogd2UgX2Nhbl8gdXNlIGdsb2JhbCBwb3B1cCB3aW5kb3cgYmVjYXVzZSB0aGVyZSdzIG5vIHdheSAyIG1lbnVlcyBjYW4KQEAgLTk5LDcgKzk4LDcgQEAKICAqLyAKIAogc3RhdGljIFdORCogcFRvcFBXbmQgICA9IDA7Ci1zdGF0aWMgVUlOVCB1U3ViUFduZExldmVsID0gMDsKK3N0YXRpYyBVSU5UMzIgdVN1YlBXbmRMZXZlbCA9IDA7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTEwNyw5ICsxMDYsOSBAQAogICoKICAqIExvYWQgYSBjb3B5IG9mIHRoZSBzeXN0ZW0gbWVudS4KICAqLwotc3RhdGljIEhNRU5VMTYgTUVOVV9Db3B5U3lzTWVudSh2b2lkKQorc3RhdGljIEhNRU5VMzIgTUVOVV9Db3B5U3lzTWVudSh2b2lkKQogewotICAgIEhNRU5VMTYgaE1lbnU7CisgICAgSE1FTlUzMiBoTWVudTsKICAgICBQT1BVUE1FTlUgKm1lbnU7CiAKICAgICBpZiAoIShoTWVudSA9IExvYWRNZW51SW5kaXJlY3QzMkEoIFNZU1JFU19HZXRSZXNQdHIoU1lTUkVTX01FTlVfU1lTTUVOVSkpKSkKQEAgLTEyOSwyMCArMTI4LDIwIEBACiAgKgogICogTWVudXMgaW5pdGlhbGlzYXRpb24uCiAgKi8KLUJPT0wgTUVOVV9Jbml0KCkKK0JPT0wzMiBNRU5VX0luaXQoKQogewotICAgIEJJVE1BUDE2IGJtOworICAgIEJJVE1BUDMyIGJtOwogCiAgICAgICAvKiBMb2FkIGJpdG1hcHMgKi8KIAotICAgIGlmICghKGhTdGRDaGVjayA9IExvYWRCaXRtYXAxNiggMCwgTUFLRUlOVFJFU09VUkNFKE9CTV9DSEVDSykgKSkpCisgICAgaWYgKCEoaFN0ZENoZWNrID0gTG9hZEJpdG1hcDMyQSggMCwgKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fQ0hFQ0spICkpKQogCXJldHVybiBGQUxTRTsKLSAgICBHZXRPYmplY3QxNiggaFN0ZENoZWNrLCBzaXplb2YoYm0pLCAmYm0gKTsKKyAgICBHZXRPYmplY3QzMkEoIGhTdGRDaGVjaywgc2l6ZW9mKGJtKSwgJmJtICk7CiAgICAgY2hlY2tfYml0bWFwX3dpZHRoID0gYm0uYm1XaWR0aDsKICAgICBjaGVja19iaXRtYXBfaGVpZ2h0ID0gYm0uYm1IZWlnaHQ7Ci0gICAgaWYgKCEoaFN0ZE1uQXJyb3cgPSBMb2FkQml0bWFwMTYoIDAsIE1BS0VJTlRSRVNPVVJDRShPQk1fTU5BUlJPVykgKSkpCisgICAgaWYgKCEoaFN0ZE1uQXJyb3cgPSBMb2FkQml0bWFwMzJBKDAsKExQU1RSKU1BS0VJTlRSRVNPVVJDRShPQk1fTU5BUlJPVykpKSkKIAlyZXR1cm4gRkFMU0U7Ci0gICAgR2V0T2JqZWN0MTYoIGhTdGRNbkFycm93LCBzaXplb2YoYm0pLCAmYm0gKTsKKyAgICBHZXRPYmplY3QzMkEoIGhTdGRNbkFycm93LCBzaXplb2YoYm0pLCAmYm0gKTsKICAgICBhcnJvd19iaXRtYXBfd2lkdGggPSBibS5ibVdpZHRoOwogICAgIGFycm93X2JpdG1hcF9oZWlnaHQgPSBibS5ibUhlaWdodDsKIApAQCAtMTYwLDcgKzE1OSw3IEBACiAgKgogICogUmV0dXJuIHRoZSBkZWZhdWx0IHN5c3RlbSBtZW51LgogICovCi1ITUVOVTE2IE1FTlVfR2V0RGVmU3lzTWVudSh2b2lkKQorSE1FTlUzMiBNRU5VX0dldERlZlN5c01lbnUodm9pZCkKIHsKICAgICByZXR1cm4gTUVOVV9EZWZTeXNNZW51OwogfQpAQCAtMTcxLDcgKzE3MCw3IEBACiAgKgogICogQ2hlY2sgd2hldGhlciB0aGUgd2luZG93IG93bmluZyB0aGUgbWVudSBiYXIgaGFzIGEgc3lzdGVtIG1lbnUuCiAgKi8KLXN0YXRpYyBCT09MIE1FTlVfSGFzU3lzTWVudSggUE9QVVBNRU5VICptZW51ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9IYXNTeXNNZW51KCBQT1BVUE1FTlUgKm1lbnUgKQogewogICAgIFdORCAqd25kUHRyOwogCkBAIC0xODcsNyArMTg2LDcgQEAKICAqIENoZWNrIHdoZXRoZXIgdGhlIHBvaW50IChpbiBzY3JlZW4gY29vcmRzKSBpcyBpbiB0aGUgc3lzdGVtIG1lbnUKICAqIG9mIHRoZSB3aW5kb3cgb3duaW5nIHRoZSBnaXZlbiBtZW51LgogICovCi1zdGF0aWMgQk9PTCBNRU5VX0lzSW5TeXNNZW51KCBQT1BVUE1FTlUgKm1lbnUsIFBPSU5UMTYgcHQgKQorc3RhdGljIEJPT0wzMiBNRU5VX0lzSW5TeXNNZW51KCBQT1BVUE1FTlUgKm1lbnUsIFBPSU5UMzIgcHQgKQogewogICAgIFdORCAqd25kUHRyOwogCkBAIC0yMDksMjIgKzIwOCwyMiBAQAogICoKICAqIEdyZXkgdGhlIGFwcHJvcHJpYXRlIGl0ZW1zIGluIFN5c3RlbSBtZW51LgogICovCi12b2lkIE1FTlVfSW5pdFN5c01lbnVQb3B1cChITUVOVTE2IGhtZW51LCBEV09SRCBzdHlsZSwgRFdPUkQgY2xzU3R5bGUpCit2b2lkIE1FTlVfSW5pdFN5c01lbnVQb3B1cCggSE1FTlUzMiBobWVudSwgRFdPUkQgc3R5bGUsIERXT1JEIGNsc1N0eWxlICkKIHsKLSAgICBCT09MIGdyYXk7CisgICAgQk9PTDMyIGdyYXk7CiAKICAgICBncmF5ID0gIShzdHlsZSAmIFdTX1RISUNLRlJBTUUpIHx8IChzdHlsZSAmIChXU19NQVhJTUlaRSB8IFdTX01JTklNSVpFKSk7Ci0gICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19TSVpFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CisgICAgRW5hYmxlTWVudUl0ZW0zMiggaG1lbnUsIFNDX1NJWkUsIChncmF5ID8gTUZfR1JBWUVEIDogTUZfRU5BQkxFRCkgKTsKICAgICBncmF5ID0gKChzdHlsZSAmIFdTX01BWElNSVpFKSAhPSAwKTsKLSAgICBFbmFibGVNZW51SXRlbSggaG1lbnUsIFNDX01PVkUsIChncmF5ID8gTUZfR1JBWUVEIDogTUZfRU5BQkxFRCkgKTsKKyAgICBFbmFibGVNZW51SXRlbTMyKCBobWVudSwgU0NfTU9WRSwgKGdyYXkgPyBNRl9HUkFZRUQgOiBNRl9FTkFCTEVEKSApOwogICAgIGdyYXkgPSAhKHN0eWxlICYgV1NfTUlOSU1JWkVCT1gpIHx8IChzdHlsZSAmIFdTX01JTklNSVpFKTsKLSAgICBFbmFibGVNZW51SXRlbSggaG1lbnUsIFNDX01JTklNSVpFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CisgICAgRW5hYmxlTWVudUl0ZW0zMiggaG1lbnUsIFNDX01JTklNSVpFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CiAgICAgZ3JheSA9ICEoc3R5bGUgJiBXU19NQVhJTUlaRUJPWCkgfHwgKHN0eWxlICYgV1NfTUFYSU1JWkUpOwotICAgIEVuYWJsZU1lbnVJdGVtKCBobWVudSwgU0NfTUFYSU1JWkUsIChncmF5ID8gTUZfR1JBWUVEIDogTUZfRU5BQkxFRCkgKTsKKyAgICBFbmFibGVNZW51SXRlbTMyKCBobWVudSwgU0NfTUFYSU1JWkUsIChncmF5ID8gTUZfR1JBWUVEIDogTUZfRU5BQkxFRCkgKTsKICAgICBncmF5ID0gIShzdHlsZSAmIChXU19NQVhJTUlaRSB8IFdTX01JTklNSVpFKSk7Ci0gICAgRW5hYmxlTWVudUl0ZW0oIGhtZW51LCBTQ19SRVNUT1JFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CisgICAgRW5hYmxlTWVudUl0ZW0zMiggaG1lbnUsIFNDX1JFU1RPUkUsIChncmF5ID8gTUZfR1JBWUVEIDogTUZfRU5BQkxFRCkgKTsKICAgICBncmF5ID0gKGNsc1N0eWxlICYgQ1NfTk9DTE9TRSkgIT0gMDsKLSAgICBFbmFibGVNZW51SXRlbSggaG1lbnUsIFNDX0NMT1NFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CisgICAgRW5hYmxlTWVudUl0ZW0zMiggaG1lbnUsIFNDX0NMT1NFLCAoZ3JheSA/IE1GX0dSQVlFRCA6IE1GX0VOQUJMRUQpICk7CiB9CiAKIApAQCAtMjM0LDEwICsyMzMsMTAgQEAKICAqIEZpbmQgYSBtZW51IGl0ZW0uIFJldHVybiBhIHBvaW50ZXIgb24gdGhlIGl0ZW0sIGFuZCBtb2RpZmllcyAqaG1lbnUKICAqIGluIGNhc2UgdGhlIGl0ZW0gd2FzIGluIGEgc3ViLW1lbnUuCiAgKi8KLXN0YXRpYyBNRU5VSVRFTSAqTUVOVV9GaW5kSXRlbSggSE1FTlUxNiAqaG1lbnUsIFVJTlQgKm5Qb3MsIFVJTlQgd0ZsYWdzICkKK3N0YXRpYyBNRU5VSVRFTSAqTUVOVV9GaW5kSXRlbSggSE1FTlUzMiAqaG1lbnUsIFVJTlQzMiAqblBvcywgVUlOVDMyIHdGbGFncyApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwotICAgIGludCBpOworICAgIFVJTlQzMiBpOwogCiAgICAgaWYgKCEobWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCpobWVudSkpKSByZXR1cm4gTlVMTDsKICAgICBpZiAod0ZsYWdzICYgTUZfQllQT1NJVElPTikKQEAgLTI1Nyw3ICsyNTYsNyBAQAogCSAgICB9CiAJICAgIGVsc2UgaWYgKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkKIAkgICAgewotCQlITUVOVTE2IGhzdWJtZW51ID0gKEhNRU5VMTYpaXRlbS0+aXRlbV9pZDsKKwkJSE1FTlUzMiBoc3VibWVudSA9IChITUVOVTMyKWl0ZW0tPml0ZW1faWQ7CiAJCU1FTlVJVEVNICpzdWJpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhzdWJtZW51LCBuUG9zLCB3RmxhZ3MgKTsKIAkJaWYgKHN1Yml0ZW0pCiAJCXsKQEAgLTI3NiwxMSArMjc1LDEyIEBACiAgKgogICogRmluZCB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGNvb3JkaW5hdGVzIChzY3JlZW4gY29vcmRzKS4KICAqLwotc3RhdGljIE1FTlVJVEVNICpNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIFBPUFVQTUVOVSAqbWVudSwgaW50IHgsIGludCB5LCBVSU5UICpwb3MgKQorc3RhdGljIE1FTlVJVEVNICpNRU5VX0ZpbmRJdGVtQnlDb29yZHMoIFBPUFVQTUVOVSAqbWVudSwgSU5UMzIgeCwgSU5UMzIgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgKnBvcyApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgV05EICp3bmRQdHI7Ci0gICAgaW50IGk7CisgICAgVUlOVDMyIGk7CiAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggbWVudS0+aFduZCApKSkgcmV0dXJuIE5VTEw7CiAgICAgeCAtPSB3bmRQdHItPnJlY3RXaW5kb3cubGVmdDsKQEAgLTMwNSwxNCArMzA1LDE0IEBACiAgKiBGaW5kIHRoZSBtZW51IGl0ZW0gc2VsZWN0ZWQgYnkgYSBrZXkgcHJlc3MuCiAgKiBSZXR1cm4gaXRlbSBpZCwgLTEgaWYgbm9uZSwgLTIgaWYgd2Ugc2hvdWxkIGNsb3NlIHRoZSBtZW51LgogICovCi1zdGF0aWMgVUlOVCBNRU5VX0ZpbmRJdGVtQnlLZXkoIEhXTkQgaHduZE93bmVyLCBITUVOVTE2IGhtZW51LCBVSU5UIGtleSApCitzdGF0aWMgVUlOVDMyIE1FTlVfRmluZEl0ZW1CeUtleSggSFdORDMyIGh3bmRPd25lciwgSE1FTlUzMiBobWVudSwgVUlOVDMyIGtleSApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwotICAgIGludCBpOworICAgIFVJTlQzMiBpOwogICAgIExPTkcgbWVudWNoYXI7CiAKLSAgICBpZiAoIUlzTWVudSggaG1lbnUgKSkgaG1lbnUgPSBXSU5fRmluZFduZFB0cihod25kT3duZXIpLT5oU3lzTWVudTsKKyAgICBpZiAoIUlzTWVudTMyKCBobWVudSApKSBobWVudSA9IFdJTl9GaW5kV25kUHRyKGh3bmRPd25lciktPmhTeXNNZW51OwogICAgIGlmICghaG1lbnUpIHJldHVybiAtMTsKIAogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKQEAgLTMzOSwyOSArMzM5LDI3IEBACiAgKgogICogQ2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBtZW51IGl0ZW0gYW5kIHN0b3JlIGl0IGluIGxwaXRlbS0+cmVjdC4KICAqLwotc3RhdGljIHZvaWQgTUVOVV9DYWxjSXRlbVNpemUoIEhEQzMyIGhkYywgTUVOVUlURU0gKmxwaXRlbSwgSFdORCBod25kT3duZXIsCi0JCQkgICAgICAgaW50IG9yZ1gsIGludCBvcmdZLCBCT09MIG1lbnVCYXIgKQorc3RhdGljIHZvaWQgTUVOVV9DYWxjSXRlbVNpemUoIEhEQzMyIGhkYywgTUVOVUlURU0gKmxwaXRlbSwgSFdORDMyIGh3bmRPd25lciwKKwkJCSAgICAgICBJTlQzMiBvcmdYLCBJTlQzMiBvcmdZLCBCT09MMzIgbWVudUJhciApCiB7CiAgICAgRFdPUkQgZHdTaXplOwogICAgIGNoYXIgKnA7CiAKLSAgICBTZXRSZWN0MTYoICZscGl0ZW0tPnJlY3QsIG9yZ1gsIG9yZ1ksIG9yZ1gsIG9yZ1kgKTsKKyAgICBTZXRSZWN0MzIoICZscGl0ZW0tPnJlY3QsIG9yZ1gsIG9yZ1ksIG9yZ1gsIG9yZ1kgKTsKIAogICAgIGlmIChscGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9PV05FUkRSQVcpCiAgICAgewotICAgICAgICBNRUFTVVJFSVRFTVNUUlVDVDE2ICptaXM7Ci0gICAgICAgIGlmICghKG1pcyA9IFNFR1BUUl9ORVcoTUVBU1VSRUlURU1TVFJVQ1QxNikpKSByZXR1cm47Ci0gICAgICAgIG1pcy0+Q3RsVHlwZSAgICA9IE9EVF9NRU5VOwotICAgICAgICBtaXMtPml0ZW1JRCAgICAgPSBscGl0ZW0tPml0ZW1faWQ7Ci0gICAgICAgIG1pcy0+aXRlbURhdGEgICA9IChEV09SRClscGl0ZW0tPnRleHQ7Ci0gICAgICAgIG1pcy0+aXRlbUhlaWdodCA9IDE2OwotICAgICAgICBtaXMtPml0ZW1XaWR0aCAgPSAzMDsKLSAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZE93bmVyLCBXTV9NRUFTVVJFSVRFTSwgMCwgKExQQVJBTSlTRUdQVFJfR0VUKG1pcykgKTsKLSAgICAgICAgbHBpdGVtLT5yZWN0LmJvdHRvbSArPSBtaXMtPml0ZW1IZWlnaHQ7Ci0gICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCAgKz0gbWlzLT5pdGVtV2lkdGg7CisgICAgICAgIE1FQVNVUkVJVEVNU1RSVUNUMzIgbWlzOworICAgICAgICBtaXMuQ3RsVHlwZSAgICA9IE9EVF9NRU5VOworICAgICAgICBtaXMuaXRlbUlEICAgICA9IGxwaXRlbS0+aXRlbV9pZDsKKyAgICAgICAgbWlzLml0ZW1EYXRhICAgPSAoRFdPUkQpbHBpdGVtLT50ZXh0OworICAgICAgICBtaXMuaXRlbUhlaWdodCA9IDE2OworICAgICAgICBtaXMuaXRlbVdpZHRoICA9IDMwOworICAgICAgICBTZW5kTWVzc2FnZTMyQSggaHduZE93bmVyLCBXTV9NRUFTVVJFSVRFTSwgMCwgKExQQVJBTSkmbWlzICk7CisgICAgICAgIGxwaXRlbS0+cmVjdC5ib3R0b20gKz0gbWlzLml0ZW1IZWlnaHQ7CisgICAgICAgIGxwaXRlbS0+cmVjdC5yaWdodCAgKz0gbWlzLml0ZW1XaWR0aDsKICAgICAgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJEcmF3TWVudUl0ZW06IE1lYXN1cmVJdGVtICUwNHggJWR4JWQhXG4iLAotICAgICAgICAgICAgICAgICAgICAgIGxwaXRlbS0+aXRlbV9pZCwgbWlzLT5pdGVtV2lkdGgsIG1pcy0+aXRlbUhlaWdodCApOwotICAgICAgICBTRUdQVFJfRlJFRShtaXMpOworICAgICAgICAgICAgICAgICAgICAgIGxwaXRlbS0+aXRlbV9pZCwgbWlzLml0ZW1XaWR0aCwgbWlzLml0ZW1IZWlnaHQgKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0gCiAKQEAgLTM4MCw4ICszNzgsOCBAQAogCiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX0JJVE1BUCkKICAgICB7Ci0JQklUTUFQMTYgYm07Ci0gICAgICAgIGlmIChHZXRPYmplY3QxNiggKEhCSVRNQVAxNikoVUlOVDMyKWxwaXRlbS0+dGV4dCwgc2l6ZW9mKGJtKSwgJmJtICkpCisJQklUTUFQMzIgYm07CisgICAgICAgIGlmIChHZXRPYmplY3QzMkEoIChIQklUTUFQMzIpbHBpdGVtLT50ZXh0LCBzaXplb2YoYm0pLCAmYm0gKSkKICAgICAgICAgewogICAgICAgICAgICAgbHBpdGVtLT5yZWN0LnJpZ2h0ICArPSBibS5ibVdpZHRoOwogICAgICAgICAgICAgbHBpdGVtLT5yZWN0LmJvdHRvbSArPSBibS5ibUhlaWdodDsKQEAgLTQyMyw3ICs0MjEsNyBAQAogICoKICAqIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiBhIHBvcHVwIG1lbnUuCiAgKi8KLXN0YXRpYyB2b2lkIE1FTlVfUG9wdXBNZW51Q2FsY1NpemUoIExQUE9QVVBNRU5VIGxwcG9wLCBIV05EIGh3bmRPd25lciApCitzdGF0aWMgdm9pZCBNRU5VX1BvcHVwTWVudUNhbGNTaXplKCBMUFBPUFVQTUVOVSBscHBvcCwgSFdORDMyIGh3bmRPd25lciApCiB7CiAgICAgTUVOVUlURU0gKmxwaXRlbTsKICAgICBIREMzMiBoZGM7CkBAIC00NzgsOCArNDc2LDggQEAKICAqCiAgKiBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIG1lbnUgYmFyLgogICovCi1zdGF0aWMgdm9pZCBNRU5VX01lbnVCYXJDYWxjU2l6ZSggSERDMzIgaGRjLCBMUFJFQ1QxNiBscHJlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBQT1BVUE1FTlUgbHBwb3AsIEhXTkQgaHduZE93bmVyICkKK3N0YXRpYyB2b2lkIE1FTlVfTWVudUJhckNhbGNTaXplKCBIREMzMiBoZGMsIExQUkVDVDMyIGxwcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFBPUFVQTUVOVSBscHBvcCwgSFdORDMyIGh3bmRPd25lciApCiB7CiAgICAgTUVOVUlURU0gKmxwaXRlbTsKICAgICBpbnQgc3RhcnQsIGksIG9yZ1gsIG9yZ1ksIG1heFksIGhlbHBQb3M7CkBAIC01NDYsMTAgKzU0NCwxMCBAQAogICoKICAqIERyYXcgYSBzaW5nbGUgbWVudSBpdGVtLgogICovCi1zdGF0aWMgdm9pZCBNRU5VX0RyYXdNZW51SXRlbSggSFdORCBod25kLCBIREMzMiBoZGMsIE1FTlVJVEVNICpscGl0ZW0sCi0JCQkgICAgICAgVUlOVCBoZWlnaHQsIEJPT0wgbWVudUJhciApCitzdGF0aWMgdm9pZCBNRU5VX0RyYXdNZW51SXRlbSggSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgTUVOVUlURU0gKmxwaXRlbSwKKwkJCSAgICAgICBVSU5UMzIgaGVpZ2h0LCBCT09MMzIgbWVudUJhciApCiB7Ci0gICAgUkVDVDE2IHJlY3Q7CisgICAgUkVDVDMyIHJlY3Q7CiAKICAgICBpZiAobHBpdGVtLT5pdGVtX2ZsYWdzICYgTUZfT1dORVJEUkFXKQogICAgIHsKQEAgLTU2Niw3ICs1NjQsNyBAQAogICAgICAgICBkaXMuaXRlbUFjdGlvbiA9IE9EQV9EUkFXRU5USVJFIHwgT0RBX1NFTEVDVCB8IE9EQV9GT0NVUzsKICAgICAgICAgZGlzLmh3bmRJdGVtICAgPSBod25kOwogICAgICAgICBkaXMuaERDICAgICAgICA9IGhkYzsKLSAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCAmbHBpdGVtLT5yZWN0LCAmZGlzLnJjSXRlbSApOworICAgICAgICBkaXMucmNJdGVtICAgICA9IGxwaXRlbS0+cmVjdDsKICAgICAgICAgU2VuZE1lc3NhZ2UzMkEoIGh3bmQsIFdNX0RSQVdJVEVNLCAwLCAoTFBBUkFNKSZkaXMgKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTU3Nyw4ICs1NzUsOCBAQAogICAgICAgLyogRHJhdyB0aGUgYmFja2dyb3VuZCAqLwogCiAgICAgaWYgKGxwaXRlbS0+aXRlbV9mbGFncyAmIE1GX0hJTElURSkKLQlGaWxsUmVjdDE2KCBoZGMsICZyZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoSGlnaGxpZ2h0ICk7Ci0gICAgZWxzZSBGaWxsUmVjdDE2KCBoZGMsICZyZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworCUZpbGxSZWN0MzIoIGhkYywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hIaWdobGlnaHQgKTsKKyAgICBlbHNlIEZpbGxSZWN0MzIoIGhkYywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CiAgICAgU2V0QmtNb2RlMzIoIGhkYywgVFJBTlNQQVJFTlQgKTsKIAogICAgICAgLyogRHJhdyB0aGUgc2VwYXJhdG9yIGJhciAoaWYgYW55KSAqLwpAQCAtNjc1LDE5ICs2NzMsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAJfQogCQotCURyYXdUZXh0MTYoIGhkYywgbHBpdGVtLT50ZXh0LCBpLCAmcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgRFRfTEVGVCB8IERUX1ZDRU5URVIgfCBEVF9TSU5HTEVMSU5FICk7CisJRHJhd1RleHQzMkEoIGhkYywgbHBpdGVtLT50ZXh0LCBpLCAmcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIERUX0xFRlQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOwogCiAJaWYgKGxwaXRlbS0+dGV4dFtpXSkgIC8qIFRoZXJlJ3MgYSB0YWIgb3IgZmx1c2gtcmlnaHQgY2hhciAqLwogCXsKIAkgICAgaWYgKGxwaXRlbS0+dGV4dFtpXSA9PSAnXHQnKQogCSAgICB7CiAJCXJlY3QubGVmdCA9IGxwaXRlbS0+eFRhYjsKLQkJRHJhd1RleHQxNiggaGRjLCBscGl0ZW0tPnRleHQgKyBpICsgMSwgLTEsICZyZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUX0xFRlQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOworCQlEcmF3VGV4dDMyQSggaGRjLCBscGl0ZW0tPnRleHQgKyBpICsgMSwgLTEsICZyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVF9MRUZUIHwgRFRfVkNFTlRFUiB8IERUX1NJTkdMRUxJTkUgKTsKIAkgICAgfQotCSAgICBlbHNlIERyYXdUZXh0MTYoIGhkYywgbHBpdGVtLT50ZXh0ICsgaSArIDEsIC0xLCAmcmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFRfUklHSFQgfCBEVF9WQ0VOVEVSIHwgRFRfU0lOR0xFTElORSApOworCSAgICBlbHNlIERyYXdUZXh0MzJBKCBoZGMsIGxwaXRlbS0+dGV4dCArIGkgKyAxLCAtMSwgJnJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEVF9SSUdIVCB8IERUX1ZDRU5URVIgfCBEVF9TSU5HTEVMSU5FICk7CiAJfQogICAgIH0KIH0KQEAgLTY5OCwxNSArNjk2LDE1IEBACiAgKgogICogUGFpbnQgYSBwb3B1cCBtZW51LgogICovCi1zdGF0aWMgdm9pZCBNRU5VX0RyYXdQb3B1cE1lbnUoIEhXTkQgaHduZCwgSERDMzIgaGRjLCBITUVOVTE2IGhtZW51ICkKK3N0YXRpYyB2b2lkIE1FTlVfRHJhd1BvcHVwTWVudSggSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgSE1FTlUzMiBobWVudSApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwotICAgIFJFQ1QxNiByZWN0OwotICAgIGludCBpOworICAgIFJFQ1QzMiByZWN0OworICAgIFVJTlQzMiBpOwogCi0gICAgR2V0Q2xpZW50UmVjdDE2KCBod25kLCAmcmVjdCApOwotICAgIEZpbGxSZWN0MTYoIGhkYywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CisgICAgR2V0Q2xpZW50UmVjdDMyKCBod25kLCAmcmVjdCApOworICAgIEZpbGxSZWN0MzIoIGhkYywgJnJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CiAgICAgbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwogICAgIGlmICghbWVudSB8fCAhbWVudS0+bkl0ZW1zKSByZXR1cm47CiAgICAgZm9yIChpID0gbWVudS0+bkl0ZW1zLCBpdGVtID0gbWVudS0+aXRlbXM7IGkgPiAwOyBpLS0sIGl0ZW0rKykKQEAgLTcxOSwxMSArNzE3LDExIEBACiAgKgogICogUGFpbnQgYSBtZW51IGJhci4gUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSBtZW51IGJhci4KICAqLwotVUlOVCBNRU5VX0RyYXdNZW51QmFyKCBIREMzMiBoREMsIExQUkVDVDE2IGxwcmVjdCwgSFdORCBod25kLAotICAgICAgICAgICAgICAgICAgICAgICBCT09MIHN1cHByZXNzX2RyYXcpCitVSU5UMzIgTUVOVV9EcmF3TWVudUJhciggSERDMzIgaERDLCBMUFJFQ1QzMiBscHJlY3QsIEhXTkQzMiBod25kLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBzdXBwcmVzc19kcmF3KQogewogICAgIExQUE9QVVBNRU5VIGxwcG9wOwotICAgIGludCBpOworICAgIFVJTlQzMiBpOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKICAgICAKICAgICBscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKCAoSE1FTlUxNil3bmRQdHItPndJRG1lbnUgKTsKQEAgLTczNCw3ICs3MzIsNyBAQAogICAgIGxwcmVjdC0+Ym90dG9tID0gbHByZWN0LT50b3AgKyBscHBvcC0+SGVpZ2h0OwogICAgIGlmIChzdXBwcmVzc19kcmF3KSByZXR1cm4gbHBwb3AtPkhlaWdodDsKICAgICAKLSAgICBGaWxsUmVjdDE2KGhEQywgbHByZWN0LCBzeXNDb2xvck9iamVjdHMuaGJydXNoTWVudSApOworICAgIEZpbGxSZWN0MzIoaERDLCBscHJlY3QsIHN5c0NvbG9yT2JqZWN0cy5oYnJ1c2hNZW51ICk7CiAgICAgU2VsZWN0T2JqZWN0MzIoIGhEQywgc3lzQ29sb3JPYmplY3RzLmhwZW5XaW5kb3dGcmFtZSApOwogICAgIE1vdmVUbyggaERDLCBscHJlY3QtPmxlZnQsIGxwcmVjdC0+Ym90dG9tICk7CiAgICAgTGluZVRvMzIoIGhEQywgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKQEAgLTc4NCwxMyArNzgyLDEzIEBACiAgKgogICogRGlzcGxheSBhIHBvcHVwIG1lbnUuCiAgKi8KLXN0YXRpYyBCT09MIE1FTlVfU2hvd1BvcHVwKEhXTkQgaHduZE93bmVyLCBITUVOVTE2IGhtZW51LCBVSU5UIGlkLCBpbnQgeCwgaW50IHksIAotCQkJCQkJICAgICAgICBpbnQgeGFuY2hvciwgaW50IHlhbmNob3IpCitzdGF0aWMgQk9PTDMyIE1FTlVfU2hvd1BvcHVwKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCBVSU5UMzIgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4LCBJTlQzMiB5LCBJTlQzMiB4YW5jaG9yLCBJTlQzMiB5YW5jaG9yICkKIHsKICAgICBQT1BVUE1FTlUgCSptZW51OwogICAgIFdORCAJKnduZFB0ciA9IE5VTEw7Ci0gICAgQk9PTAkgc2tpcF9pbml0ID0gMDsKLSAgICBVSU5UCSB3aWR0aCwgaGVpZ2h0OworICAgIEJPT0wzMgkgc2tpcF9pbml0ID0gMDsKKyAgICBVSU5UMzIJIHdpZHRoLCBoZWlnaHQ7CiAKICAgICBpZiAoIShtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtICE9IE5PX1NFTEVDVEVEX0lURU0pCkBAIC03OTksNyArNzk3LDcgQEAKIAltZW51LT5Gb2N1c2VkSXRlbSA9IE5PX1NFTEVDVEVEX0lURU07CiAgICAgfQogICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRPd25lciwgV01fSU5JVE1FTlVQT1BVUCwgKFdQQVJBTTE2KWhtZW51LAotCQkgTUFLRUxPTkcoIGlkLCAobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkgPyAxIDogMCApKTsKKyAgICAgICAgICAgICAgICAgICBNQUtFTE9ORyggaWQsIChtZW51LT53RmxhZ3MgJiBNRl9TWVNNRU5VKSA/IDEgOiAwICkpOwogICAgIE1FTlVfUG9wdXBNZW51Q2FsY1NpemUoIG1lbnUsIGh3bmRPd25lciApOwogCiAgICAgLyogYWRqdXN0IHBvcHVwIG1lbnUgcG9zIHNvIHRoYXQgaXQgZml0cyB3aXRoaW4gdGhlIGRlc2t0b3AgKi8KQEAgLTgzMiwxMSArODMwLDExIEBACiAKICAgICBpZiAoIXBUb3BQV25kKQogICAgIHsKLQlwVG9wUFduZCA9IFdJTl9GaW5kV25kUHRyKENyZWF0ZVdpbmRvdzE2KCBQT1BVUE1FTlVfQ0xBU1NfQVRPTSwgTlVMTCwKKwlwVG9wUFduZCA9IFdJTl9GaW5kV25kUHRyKENyZWF0ZVdpbmRvdzMyQSggUE9QVVBNRU5VX0NMQVNTX0FUT00sIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19QT1BVUCB8IFdTX0JPUkRFUiwgeCwgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBod25kT3duZXIsIDAsIHduZFB0ci0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQVk9JRCkoSE1FTlUzMilobWVudSApKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpaG1lbnUgKSk7CiAJaWYgKCFwVG9wUFduZCkgcmV0dXJuIEZBTFNFOwogCXNraXBfaW5pdCA9IFRSVUU7CiAgICAgfQpAQCAtODQ0LDExICs4NDIsMTEgQEAKICAgICBpZiggdVN1YlBXbmRMZXZlbCApCiAgICAgewogCS8qIGNyZWF0ZSBuZXcgd2luZG93IGZvciB0aGUgc3VibWVudSAqLwotCUhXTkQgIGhXbmQgPSBDcmVhdGVXaW5kb3cxNiggUE9QVVBNRU5VX0NMQVNTX0FUT00sIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdTX1BPUFVQIHwgV1NfQk9SREVSLCB4LCB5LAotCQkJCSAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUtPmhXbmQsIDAsIHduZFB0ci0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKShITUVOVTMyKWhtZW51ICk7CisJSFdORDMyIGhXbmQgPSBDcmVhdGVXaW5kb3czMkEoIFBPUFVQTUVOVV9DTEFTU19BVE9NLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXU19QT1BVUCB8IFdTX0JPUkRFUiwgeCwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudS0+aFduZCwgMCwgd25kUHRyLT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpaG1lbnUgKTsKIAlpZiggIWhXbmQgKSByZXR1cm4gRkFMU0U7CiAJbWVudS0+aFduZCA9IGhXbmQ7CiAgICAgfQpAQCAtODgwLDggKzg3OCw4IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNRU5VX1NlbGVjdEl0ZW0KICAqLwotc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RJdGVtKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwgVUlOVCB3SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgc2VuZE1lbnVTZWxlY3QgKQorc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RJdGVtKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LCBVSU5UMzIgd0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgc2VuZE1lbnVTZWxlY3QgKQogewogICAgIExQUE9QVVBNRU5VIGxwcG9wOwogICAgIEhEQzMyIGhkYzsKQEAgLTk0NCw5ICs5NDIsOSBAQAogICogICAgICAgICAgIE1FTlVfU2VsZWN0SXRlbVJlbAogICoKICAqLwotc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RJdGVtUmVsKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwgaW50IG9mZnNldCApCitzdGF0aWMgdm9pZCBNRU5VX1NlbGVjdEl0ZW1SZWwoIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsIElOVDMyIG9mZnNldCApCiB7Ci0gICAgaW50IGksIG1pbiA9IDA7CisgICAgSU5UMzIgaSwgbWluID0gMDsKICAgICBQT1BVUE1FTlUgKm1lbnU7CiAKICAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CkBAIC05OTIsNyArOTkwLDggQEAKICAqCiAgKiBTZXQgYW4gaXRlbSBmbGFncywgaWQgYW5kIHRleHQgcHRyLgogICovCi1zdGF0aWMgQk9PTCBNRU5VX1NldEl0ZW1EYXRhKCBNRU5VSVRFTSAqaXRlbSwgVUlOVCBmbGFncywgVUlOVCBpZCwgTFBDU1RSIHN0ciApCitzdGF0aWMgQk9PTDMyIE1FTlVfU2V0SXRlbURhdGEoIE1FTlVJVEVNICppdGVtLCBVSU5UMzIgZmxhZ3MsIFVJTlQzMiBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHN0ciApCiB7CiAgICAgTFBTVFIgcHJldlRleHQgPSBJU19TVFJJTkdfSVRFTShpdGVtLT5pdGVtX2ZsYWdzKSA/IGl0ZW0tPnRleHQgOiBOVUxMOwogCkBAIC0xMDIyLDcgKzEwMjEsNyBAQAogCiAgICAgaXRlbS0+aXRlbV9mbGFncyA9IGZsYWdzICYgfihNRl9ISUxJVEUgfCBNRl9NT1VTRVNFTEVDVCk7CiAgICAgaXRlbS0+aXRlbV9pZCAgICA9IGlkOwotICAgIFNldFJlY3RFbXB0eTE2KCAmaXRlbS0+cmVjdCApOworICAgIFNldFJlY3RFbXB0eTMyKCAmaXRlbS0+cmVjdCApOwogICAgIGlmIChwcmV2VGV4dCkgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHByZXZUZXh0ICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xMDMzLDcgKzEwMzIsNyBAQAogICoKICAqIEluc2VydCBhIG5ldyBpdGVtIGludG8gYSBtZW51LgogICovCi1zdGF0aWMgTUVOVUlURU0gKk1FTlVfSW5zZXJ0SXRlbSggSE1FTlUxNiBoTWVudSwgVUlOVCBwb3MsIFVJTlQgZmxhZ3MgKQorc3RhdGljIE1FTlVJVEVNICpNRU5VX0luc2VydEl0ZW0oIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBwb3MsIFVJTlQzMiBmbGFncyApCiB7CiAgICAgTUVOVUlURU0gKm5ld0l0ZW1zOwogICAgIFBPUFVQTUVOVSAqbWVudTsKQEAgLTEwNDgsNyArMTA0Nyw3IEBACiAgICAgLyogRmluZCB3aGVyZSB0byBpbnNlcnQgbmV3IGl0ZW0gKi8KIAogICAgIGlmICgoZmxhZ3MgJiBNRl9CWVBPU0lUSU9OKSAmJgotICAgICAgICAoKHBvcyA9PSAoVUlOVCktMSkgfHwgKHBvcyA9PSBtZW51LT5uSXRlbXMpKSkKKyAgICAgICAgKChwb3MgPT0gKFVJTlQzMiktMSkgfHwgKHBvcyA9PSBtZW51LT5uSXRlbXMpKSkKICAgICB7CiAgICAgICAgIC8qIFNwZWNpYWwgY2FzZTogYXBwZW5kIHRvIG1lbnUgKi8KICAgICAgICAgLyogU29tZSBwcm9ncmFtcyBzcGVjaWZ5IHRoZSBtZW51IGxlbmd0aCB0byBkbyB0aGF0ICovCkBAIC0xMDk5LDcgKzEwOTgsNyBAQAogICogUGFyc2UgYSBzdGFuZGFyZCBtZW51IHJlc291cmNlIGFuZCBhZGQgaXRlbXMgdG8gdGhlIG1lbnUuCiAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHJlc291cmNlLgogICovCi1zdGF0aWMgTFBDU1RSIE1FTlVfUGFyc2VSZXNvdXJjZSggTFBDU1RSIHJlcywgSE1FTlUxNiBoTWVudSwgQk9PTCB1bmljb2RlICkKK3N0YXRpYyBMUENTVFIgTUVOVV9QYXJzZVJlc291cmNlKCBMUENTVFIgcmVzLCBITUVOVTMyIGhNZW51LCBCT09MMzIgdW5pY29kZSApCiB7CiAgICAgV09SRCBmbGFncywgaWQgPSAwOwogICAgIExQQ1NUUiBzdHI7CkBAIC0xMTIxLDEyICsxMTIwLDEyIEBACiAgICAgICAgIGVsc2UgcmVzICs9IChsc3RybGVuMzJXKChMUENXU1RSKXN0cikgKyAxKSAqIHNpemVvZihXQ0hBUik7CiAgICAgICAgIGlmIChmbGFncyAmIE1GX1BPUFVQKQogICAgICAgICB7Ci0gICAgICAgICAgICBITUVOVTE2IGhTdWJNZW51ID0gQ3JlYXRlUG9wdXBNZW51KCk7CisgICAgICAgICAgICBITUVOVTMyIGhTdWJNZW51ID0gQ3JlYXRlUG9wdXBNZW51MzIoKTsKICAgICAgICAgICAgIGlmICghaFN1Yk1lbnUpIHJldHVybiBOVUxMOwogICAgICAgICAgICAgaWYgKCEocmVzID0gTUVOVV9QYXJzZVJlc291cmNlKCByZXMsIGhTdWJNZW51LCB1bmljb2RlICkpKQogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgaWYgKCF1bmljb2RlKSBBcHBlbmRNZW51MzJBKCBoTWVudSwgZmxhZ3MsIChVSU5UKWhTdWJNZW51LCBzdHIgKTsKLSAgICAgICAgICAgIGVsc2UgQXBwZW5kTWVudTMyVyggaE1lbnUsIGZsYWdzLCAoVUlOVCloU3ViTWVudSwgKExQQ1dTVFIpc3RyICk7CisgICAgICAgICAgICBpZiAoIXVuaWNvZGUpIEFwcGVuZE1lbnUzMkEoIGhNZW51LCBmbGFncywgKFVJTlQzMiloU3ViTWVudSwgc3RyICk7CisgICAgICAgICAgICBlbHNlIEFwcGVuZE1lbnUzMlcoIGhNZW51LCBmbGFncywgKFVJTlQzMiloU3ViTWVudSwgKExQQ1dTVFIpc3RyICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZSAgLyogTm90IGEgcG9wdXAgKi8KICAgICAgICAgewpAQCAtMTE0NCw3ICsxMTQzLDcgQEAKICAqCiAgKiBSZXR1cm4gdGhlIGhhbmRsZSBvZiB0aGUgc2VsZWN0ZWQgc3ViLXBvcHVwIG1lbnUgKGlmIGFueSkuCiAgKi8KLXN0YXRpYyBITUVOVTE2IE1FTlVfR2V0U3ViUG9wdXAoIEhNRU5VMTYgaG1lbnUgKQorc3RhdGljIEhNRU5VMzIgTUVOVV9HZXRTdWJQb3B1cCggSE1FTlUzMiBobWVudSApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwpAQCAtMTE1Nyw3ICsxMTU2LDcgQEAKICAgICBpdGVtID0gJm1lbnUtPml0ZW1zW21lbnUtPkZvY3VzZWRJdGVtXTsKICAgICBpZiAoIShpdGVtLT5pdGVtX2ZsYWdzICYgTUZfUE9QVVApIHx8ICEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX01PVVNFU0VMRUNUKSkKIAlyZXR1cm4gMDsKLSAgICByZXR1cm4gKEhNRU5VMTYpaXRlbS0+aXRlbV9pZDsKKyAgICByZXR1cm4gKEhNRU5VMzIpaXRlbS0+aXRlbV9pZDsKIH0KIAogCkBAIC0xMTY2LDEyICsxMTY1LDEyIEBACiAgKgogICogSGlkZSB0aGUgc3ViLXBvcHVwIG1lbnVzIG9mIHRoaXMgbWVudS4KICAqLwotc3RhdGljIHZvaWQgTUVOVV9IaWRlU3ViUG9wdXBzKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBzZW5kTWVudVNlbGVjdCApCitzdGF0aWMgdm9pZCBNRU5VX0hpZGVTdWJQb3B1cHMoIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBzZW5kTWVudVNlbGVjdCApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgUE9QVVBNRU5VICptZW51LCAqc3VibWVudTsKLSAgICBITUVOVTE2IGhzdWJtZW51OworICAgIEhNRU5VMzIgaHN1Ym1lbnU7CiAKICAgICBpZiAoIShtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICkpKSByZXR1cm47CiAgICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IE5PX1NFTEVDVEVEX0lURU0pIHJldHVybjsKQEAgLTExODUsNyArMTE4NCw3IEBACiAJaWYgKCEoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKSB8fAogCSAgICAhKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9NT1VTRVNFTEVDVCkpIHJldHVybjsKIAlpdGVtLT5pdGVtX2ZsYWdzICY9IH5NRl9NT1VTRVNFTEVDVDsKLQloc3VibWVudSA9IChITUVOVTE2KWl0ZW0tPml0ZW1faWQ7CisJaHN1Ym1lbnUgPSAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOwogICAgIH0KICAgICBzdWJtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhzdWJtZW51ICk7CiAgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhzdWJtZW51LCBGQUxTRSApOwpAQCAtMTIwOSw4ICsxMjA4LDggQEAKICAqIERpc3BsYXkgdGhlIHN1Yi1tZW51IG9mIHRoZSBzZWxlY3RlZCBpdGVtIG9mIHRoaXMgbWVudS4KICAqIFJldHVybiB0aGUgaGFuZGxlIG9mIHRoZSBzdWJtZW51LCBvciBobWVudSBpZiBubyBzdWJtZW51IHRvIGRpc3BsYXkuCiAgKi8KLXN0YXRpYyBITUVOVTE2IE1FTlVfU2hvd1N1YlBvcHVwKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHNlbGVjdEZpcnN0ICkKK3N0YXRpYyBITUVOVTMyIE1FTlVfU2hvd1N1YlBvcHVwKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBzZWxlY3RGaXJzdCApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwpAQCAtMTIyNiw3ICsxMjI1LDggQEAKIAlNRU5VX1Nob3dQb3B1cChod25kT3duZXIsIHduZFB0ci0+aFN5c01lbnUsIDAsIHduZFB0ci0+cmVjdENsaWVudC5sZWZ0LAogCQl3bmRQdHItPnJlY3RDbGllbnQudG9wIC0gbWVudS0+SGVpZ2h0IC0gMipTWVNNRVRSSUNTX0NZQk9SREVSLAogCQlTWVNNRVRSSUNTX0NYU0laRSwgU1lTTUVUUklDU19DWVNJWkUgKTsKLQlpZiAoc2VsZWN0Rmlyc3QpIE1FTlVfU2VsZWN0SXRlbVJlbCggaHduZE93bmVyLCB3bmRQdHItPmhTeXNNZW51LCBJVEVNX05FWFQgKTsKKwlpZiAoc2VsZWN0Rmlyc3QpCisgICAgICAgICAgICBNRU5VX1NlbGVjdEl0ZW1SZWwoIGh3bmRPd25lciwgd25kUHRyLT5oU3lzTWVudSwgSVRFTV9ORVhUICk7CiAJcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7CiAgICAgfQogICAgIGl0ZW0gPSAmbWVudS0+aXRlbXNbbWVudS0+Rm9jdXNlZEl0ZW1dOwpAQCAtMTI0NiwxMCArMTI0NiwxMiBAQAogCU1FTlVfU2hvd1BvcHVwKCBod25kT3duZXIsIChITUVOVTE2KWl0ZW0tPml0ZW1faWQsIG1lbnUtPkZvY3VzZWRJdGVtLAogCQkgICAgICAgIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0ICsgaXRlbS0+cmVjdC5sZWZ0LAogCQkgICAgICAgIHduZFB0ci0+cmVjdFdpbmRvdy50b3AgKyBpdGVtLT5yZWN0LmJvdHRvbSwKLQkJCWl0ZW0tPnJlY3QucmlnaHQgLSBpdGVtLT5yZWN0LmxlZnQsIGl0ZW0tPnJlY3QuYm90dG9tIC0gaXRlbS0+cmVjdC50b3AgKTsKKwkJCWl0ZW0tPnJlY3QucmlnaHQgLSBpdGVtLT5yZWN0LmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5yZWN0LmJvdHRvbSAtIGl0ZW0tPnJlY3QudG9wICk7CiAgICAgfQotICAgIGlmIChzZWxlY3RGaXJzdCkgTUVOVV9TZWxlY3RJdGVtUmVsKCBod25kT3duZXIsIChITUVOVTE2KWl0ZW0tPml0ZW1faWQsIElURU1fTkVYVCApOwotICAgIHJldHVybiAoSE1FTlUxNilpdGVtLT5pdGVtX2lkOworICAgIGlmIChzZWxlY3RGaXJzdCkKKyAgICAgICAgTUVOVV9TZWxlY3RJdGVtUmVsKCBod25kT3duZXIsIChITUVOVTMyKWl0ZW0tPml0ZW1faWQsIElURU1fTkVYVCApOworICAgIHJldHVybiAoSE1FTlUzMilpdGVtLT5pdGVtX2lkOwogfQogCiAKQEAgLTEyNTgsMTIgKzEyNjAsMTIgQEAKICAqCiAgKiBGaW5kIHRoZSBtZW51IGNvbnRhaW5pbmcgYSBnaXZlbiBwb2ludCAoaW4gc2NyZWVuIGNvb3JkcykuCiAgKi8KLXN0YXRpYyBITUVOVTE2IE1FTlVfRmluZE1lbnVCeUNvb3JkcyggSE1FTlUxNiBobWVudSwgUE9JTlQxNiBwdCApCitzdGF0aWMgSE1FTlUzMiBNRU5VX0ZpbmRNZW51QnlDb29yZHMoIEhNRU5VMzIgaG1lbnUsIFBPSU5UMzIgcHQgKQogewogICAgIFBPUFVQTUVOVSAqbWVudTsKLSAgICBIV05EIGh3bmQ7CisgICAgSFdORDMyIGh3bmQ7CiAKLSAgICBpZiAoIShod25kID0gV2luZG93RnJvbVBvaW50MTYoIHB0ICkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShod25kID0gV2luZG93RnJvbVBvaW50MzIoIHB0ICkpKSByZXR1cm4gMDsKICAgICB3aGlsZSAoaG1lbnUpCiAgICAgewogCW1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKQEAgLTEyOTYsOCArMTI5OCw4IEBACiAgKiBFeGVjdXRlIGEgbWVudSBpdGVtIChmb3IgaW5zdGFuY2Ugd2hlbiB1c2VyIHByZXNzZWQgRW50ZXIpLgogICogUmV0dXJuIFRSVUUgaWYgd2UgY2FuIGdvIG9uIHdpdGggbWVudSB0cmFja2luZy4KICAqLwotc3RhdGljIEJPT0wgTUVOVV9FeGVjRm9jdXNlZEl0ZW0oIEhXTkQgaHduZE93bmVyLCBITUVOVTE2IGhtZW51LAotCQkJCSAgSE1FTlUxNiAqaG1lbnVDdXJyZW50ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9FeGVjRm9jdXNlZEl0ZW0oIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyICpobWVudUN1cnJlbnQgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwpAQCAtMTMyOSwxMiArMTMzMSwxMiBAQAogICogaG1lbnVDdXJyZW50IGlzIHRoZSB0b3AtbW9zdCB2aXNpYmxlIHBvcHVwLgogICogUmV0dXJuIFRSVUUgaWYgd2UgY2FuIGdvIG9uIHdpdGggbWVudSB0cmFja2luZy4KICAqLwotc3RhdGljIEJPT0wgTUVOVV9CdXR0b25Eb3duKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUxNiAqaG1lbnVDdXJyZW50LCBQT0lOVDE2IHB0ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9CdXR0b25Eb3duKCBIV05EMzIgaHduZE93bmVyLCBITUVOVTMyIGhtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCwgUE9JTlQzMiBwdCApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwotICAgIFVJTlQgaWQ7CisgICAgVUlOVDMyIGlkOwogCiAgICAgaWYgKCFobWVudSkgcmV0dXJuIEZBTFNFOyAgLyogT3V0c2lkZSBhbGwgbWVudXMgKi8KICAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CkBAIC0xMzc5LDEzICsxMzgxLDEzIEBACiAgKiBobWVudUN1cnJlbnQgaXMgdGhlIHRvcC1tb3N0IHZpc2libGUgcG9wdXAuCiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCi1zdGF0aWMgQk9PTCBNRU5VX0J1dHRvblVwKCBIV05EIGh3bmRPd25lciwgSE1FTlUxNiBobWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMTYgKmhtZW51Q3VycmVudCwgUE9JTlQxNiBwdCApCitzdGF0aWMgQk9PTDMyIE1FTlVfQnV0dG9uVXAoIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCwgUE9JTlQzMiBwdCApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwogICAgIE1FTlVJVEVNICppdGVtOwotICAgIEhNRU5VMTYgaHN1Ym1lbnUgPSAwOwotICAgIFVJTlQgaWQ7CisgICAgSE1FTlUzMiBoc3VibWVudSA9IDA7CisgICAgVUlOVDMyIGlkOwogCiAgICAgaWYgKCFobWVudSkgcmV0dXJuIEZBTFNFOyAgLyogT3V0c2lkZSBhbGwgbWVudXMgKi8KICAgICBtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICk7CkBAIC0xNDA1LDcgKzE0MDcsNyBAQAogCXsKIAkgICAgcmV0dXJuIE1FTlVfRXhlY0ZvY3VzZWRJdGVtKCBod25kT3duZXIsIGhtZW51LCBobWVudUN1cnJlbnQgKTsKIAl9Ci0JaHN1Ym1lbnUgPSAoSE1FTlUxNilpdGVtLT5pdGVtX2lkOworCWhzdWJtZW51ID0gKEhNRU5VMzIpaXRlbS0+aXRlbV9pZDsKICAgICB9CiAgICAgICAvKiBTZWxlY3QgZmlyc3QgaXRlbSBvZiBzdWItcG9wdXAgKi8KICAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaHN1Ym1lbnUsIE5PX1NFTEVDVEVEX0lURU0sIEZBTFNFICk7CkBAIC0xNDIxLDEyICsxNDIzLDEyIEBACiAgKiBobWVudUN1cnJlbnQgaXMgdGhlIHRvcC1tb3N0IHZpc2libGUgcG9wdXAuCiAgKiBSZXR1cm4gVFJVRSBpZiB3ZSBjYW4gZ28gb24gd2l0aCBtZW51IHRyYWNraW5nLgogICovCi1zdGF0aWMgQk9PTCBNRU5VX01vdXNlTW92ZSggSFdORCBod25kT3duZXIsIEhNRU5VMTYgaG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUxNiAqaG1lbnVDdXJyZW50LCBQT0lOVDE2IHB0ICkKK3N0YXRpYyBCT09MMzIgTUVOVV9Nb3VzZU1vdmUoIEhXTkQzMiBod25kT3duZXIsIEhNRU5VMzIgaG1lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyICpobWVudUN1cnJlbnQsIFBPSU5UMzIgcHQgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApOwotICAgIFVJTlQgaWQgPSBOT19TRUxFQ1RFRF9JVEVNOworICAgIFVJTlQzMiBpZCA9IE5PX1NFTEVDVEVEX0lURU07CiAKICAgICBpZiAoaG1lbnUpCiAgICAgewpAQCAtMTQ1MSwyNiArMTQ1MywyNyBAQAogICAgIHJldHVybiBUUlVFOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfRG9OZXh0TWVudQogICovCi1zdGF0aWMgTFJFU1VMVCBNRU5VX0RvTmV4dE1lbnUoIEhXTkQqIGh3bmRPd25lciwgSE1FTlUxNiogaG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMTYgKmhtZW51Q3VycmVudCwgVUlOVCB2aykKK3N0YXRpYyBMUkVTVUxUIE1FTlVfRG9OZXh0TWVudSggSFdORDMyKiBod25kT3duZXIsIEhNRU5VMzIqIGhtZW51LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBITUVOVTMyICpobWVudUN1cnJlbnQsIFVJTlQzMiB2ayApCiB7CiAgIFBPUFVQTUVOVSAqbWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCAqaG1lbnUgKTsKLSAgVUlOVAkgICAgIGlkID0gMDsKKyAgVUlOVDMyICAgICBpZCA9IDA7CiAKICAgaWYoICAgICh2ayA9PSBWS19MRUZUICYmICFtZW51LT5Gb2N1c2VkSXRlbSkKICAgICAgIHx8ICh2ayA9PSBWS19SSUdIVCAmJiBtZW51LT5Gb2N1c2VkSXRlbSA9PSBtZW51LT5uSXRlbXMgLSAxKSAKICAgICAgIHx8IG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQgCi0gICAgICB8fCAoKG1lbnUtPndGbGFncyAmIChNRl9QT1BVUCB8IE1GX1NZU01FTlUpKSA9PSAoTUZfUE9QVVAgfCBNRl9TWVNNRU5VKSkgKQorICAgICAgfHwgKChtZW51LT53RmxhZ3MgJiAoTUZfUE9QVVAgfCBNRl9TWVNNRU5VKSkgPT0gKE1GX1BPUFVQIHwgTUZfU1lTTUVOVSkpKQogICB7CiAgICAgTFJFU1VMVCBsID0gU2VuZE1lc3NhZ2UxNiggKmh3bmRPd25lciwgV01fTkVYVE1FTlUsIChXUEFSQU0xNil2aywgCi0JCQkJKExQQVJBTSkoKG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCi0JCQkJCT8gR2V0U3lzdGVtTWVudSggKmh3bmRPd25lciwgMCkgCi0JCQkJCTogKmhtZW51KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQVJBTSkoKG1lbnUtPkZvY3VzZWRJdGVtID09IFNZU01FTlVfU0VMRUNURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBHZXRTeXN0ZW1NZW51MzIoICpod25kT3duZXIsIDApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKmhtZW51KSk7CiAKLSAgICBpZiggbCA9PSAwIHx8ICFJc01lbnUoTE9XT1JEKGwpKSB8fCAhSXNXaW5kb3coSElXT1JEKGwpKSApIHJldHVybiAwOworICAgIGlmKCBsID09IDAgfHwgIUlzTWVudTMyKExPV09SRChsKSkgfHwgIUlzV2luZG93KEhJV09SRChsKSkgKSByZXR1cm4gMDsKIAogICAgIC8qIHNodXRkb3duIGN1cnJlbnQgbWVudSAtCiAgICAgICogYWxsIHRoZXNlIGNoZWNrcyBmb3Igc3lzdGVtIHBvcHVwIHdpbmRvdyBhcmUgbmVlZGVkCkBAIC0xNTAzLDI4ICsxNTA2LDMxIEBACiAgICAgLyogaW5pdCBuZXh0IG1lbnUgKi8KIAogICAgIGlmKCAobWVudS0+d0ZsYWdzICYgKE1GX1BPUFVQIHwgTUZfU1lTTUVOVSkpID09IChNRl9QT1BVUCB8IE1GX1NZU01FTlUpICkKLQl7Ci0JICBSRUNUMTYgcmVjdDsKLQkgIFdORCogICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggKmh3bmRPd25lciApOworICAgIHsKKyAgICAgICAgUkVDVDMyIHJlY3Q7CisgICAgICAgIFdORCogICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggKmh3bmRPd25lciApOwogCi0JICAvKiBzdHVwaWQga2x1ZGdlLCBzZWUgYWJvdmUgKi8KKyAgICAgICAgLyogc3R1cGlkIGtsdWRnZSwgc2VlIGFib3ZlICovCiAKLQkgIGlmKCB3bmRQdHItPndJRG1lbnUgJiYgISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkgKQotCSAgICAgeyAqaG1lbnUgPSB3bmRQdHItPndJRG1lbnU7IGlkID0gU1lTTUVOVV9TRUxFQ1RFRDsgfQotCSAgZWxzZQotCSAgeyAKLQkgICAgIGlmKCBOQ19HZXRTeXNQb3B1cFBvcyggd25kUHRyLCAmcmVjdCApICkKLQkgICAgICAgICBNRU5VX1Nob3dQb3B1cCggKmh3bmRPd25lciwgKmhtZW51LCAwLCByZWN0LmxlZnQsIHJlY3QuYm90dG9tLAotCQkgU1lTTUVUUklDU19DWFNJWkUsIFNZU01FVFJJQ1NfQ1lTSVpFICk7Ci0KLSAgICAgICAgICAgICBpZiggIUlzSWNvbmljKCAqaHduZE93bmVyICkgKQotICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIEhEQzMyIGhkYyA9ICBHZXREQ0V4MzIoICpod25kT3duZXIsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cpOwotICAgICAgICAgICAgICAgTkNfRHJhd1N5c0J1dHRvbiggKmh3bmRPd25lciwgaGRjLCBUUlVFICk7Ci0gICAgICAgICAgICAgICBSZWxlYXNlREMzMiggKmh3bmRPd25lciwgaGRjICk7Ci0gICAgICAgICAgICAgfQotCSAgfQotCX0KKyAgICAgICAgaWYoIHduZFB0ci0+d0lEbWVudSAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSApCisgICAgICAgIHsKKyAgICAgICAgICAgICpobWVudSA9IHduZFB0ci0+d0lEbWVudTsKKyAgICAgICAgICAgIGlkID0gU1lTTUVOVV9TRUxFQ1RFRDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsgCisgICAgICAgICAgICBpZiggTkNfR2V0U3lzUG9wdXBQb3MoIHduZFB0ciwgJnJlY3QgKSApCisgICAgICAgICAgICAgICAgTUVOVV9TaG93UG9wdXAoICpod25kT3duZXIsICpobWVudSwgMCwgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1lTTUVUUklDU19DWFNJWkUsIFNZU01FVFJJQ1NfQ1lTSVpFICk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKCAhSXNJY29uaWMoICpod25kT3duZXIgKSApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSERDMzIgaGRjID0gIEdldERDRXgzMiggKmh3bmRPd25lciwgMCwgRENYX0NBQ0hFIHwgRENYX1dJTkRPVyk7CisgICAgICAgICAgICAgICAgTkNfRHJhd1N5c0J1dHRvbiggKmh3bmRPd25lciwgaGRjLCBUUlVFICk7CisgICAgICAgICAgICAgICAgUmVsZWFzZURDMzIoICpod25kT3duZXIsIGhkYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogCiAgICAgTUVOVV9TZWxlY3RJdGVtKCAqaHduZE93bmVyLCAqaG1lbnUsIGlkLCBUUlVFICk7IAogICAgIHJldHVybiBsOwpAQCAtMTUzOCwxMSArMTU0NCwxMSBAQAogICogSGFuZGxlIGEgVktfTEVGVCBrZXkgZXZlbnQgaW4gYSBtZW51LgogICogaG1lbnVDdXJyZW50IGlzIHRoZSB0b3AtbW9zdCB2aXNpYmxlIHBvcHVwLgogICovCi1zdGF0aWMgdm9pZCBNRU5VX0tleUxlZnQoIEhXTkQqIGh3bmRPd25lciwgSE1FTlUxNiogaG1lbnUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMTYgKmhtZW51Q3VycmVudCApCitzdGF0aWMgdm9pZCBNRU5VX0tleUxlZnQoIEhXTkQzMiogaHduZE93bmVyLCBITUVOVTMyKiBobWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUzMiAqaG1lbnVDdXJyZW50ICkKIHsKICAgICBQT1BVUE1FTlUgKm1lbnU7Ci0gICAgSE1FTlUxNiBobWVudXRtcCwgaG1lbnVwcmV2OworICAgIEhNRU5VMzIgaG1lbnV0bXAsIGhtZW51cHJldjsKIAogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggKmhtZW51ICk7CiAgICAgaG1lbnVwcmV2ID0gaG1lbnV0bXAgPSAqaG1lbnU7CkBAIC0xNTc5LDExICsxNTg1LDExIEBACiAgKiBIYW5kbGUgYSBWS19SSUdIVCBrZXkgZXZlbnQgaW4gYSBtZW51LgogICogaG1lbnVDdXJyZW50IGlzIHRoZSB0b3AtbW9zdCB2aXNpYmxlIHBvcHVwLgogICovCi1zdGF0aWMgdm9pZCBNRU5VX0tleVJpZ2h0KCBIV05EKiBod25kT3duZXIsIEhNRU5VMTYqIGhtZW51LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgSE1FTlUxNiAqaG1lbnVDdXJyZW50ICkKK3N0YXRpYyB2b2lkIE1FTlVfS2V5UmlnaHQoIEhXTkQzMiogaHduZE93bmVyLCBITUVOVTMyKiBobWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhNRU5VMzIgKmhtZW51Q3VycmVudCApCiB7CiAgICAgUE9QVVBNRU5VICptZW51OwotICAgIEhNRU5VMTYgaG1lbnV0bXA7CisgICAgSE1FTlUzMiBobWVudXRtcDsKIAogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggKmhtZW51ICk7CiAKQEAgLTE2MzksMjAgKzE2NDUsMjIgQEAKICAqIElmICd4JyBhbmQgJ3knIGFyZSBub3QgMCwgd2Ugc2ltdWxhdGUgYSBidXR0b24tZG93biBldmVudCBhdCAoeCx5KQogICogYmVmb3JlIGJlZ2lubmluZyB0cmFja2luZy4gVGhpcyBpcyB0byBoZWxwIG1lbnUtYmFyIHRyYWNraW5nLgogICovCi1zdGF0aWMgQk9PTDMyIE1FTlVfVHJhY2tNZW51KCBITUVOVTE2IGhtZW51LCBVSU5UMzIgd0ZsYWdzLCBpbnQgeCwgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIV05EMTYgaHduZCwgY29uc3QgUkVDVDE2ICpscHJlY3QgKQorc3RhdGljIEJPT0wzMiBNRU5VX1RyYWNrTWVudSggSE1FTlUzMiBobWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhXTkQzMiBod25kLCBjb25zdCBSRUNUMzIgKmxwcmVjdCApCiB7CiAgICAgTVNHMTYgbXNnOwogICAgIFBPUFVQTUVOVSAqbWVudTsKLSAgICBITUVOVTE2IGhtZW51Q3VycmVudCA9IGhtZW51OwotICAgIEJPT0wgZkNsb3NlZCA9IEZBTFNFLCBmUmVtb3ZlOwotICAgIFVJTlQgcG9zOworICAgIEhNRU5VMzIgaG1lbnVDdXJyZW50ID0gaG1lbnU7CisgICAgQk9PTDMyIGZDbG9zZWQgPSBGQUxTRSwgZlJlbW92ZTsKKyAgICBVSU5UMzIgcG9zOworICAgIFBPSU5UMzIgcHQ7CiAKICAgICBmRW5kTWVudUNhbGxlZCA9IEZBTFNFOwogICAgIGlmICghKG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoeCAmJiB5KQogICAgIHsKLQlQT0lOVDE2IHB0ID0geyB4LCB5IH07CisJcHQueCA9IHg7CisgICAgICAgIHB0LnkgPSB5OwogCU1FTlVfQnV0dG9uRG93biggaHduZCwgaG1lbnUsICZobWVudUN1cnJlbnQsIHB0ICk7CiAgICAgfQogCkBAIC0xNjY5LDEzICsxNjc3LDE0IEBACiAJICAgIGJyZWFrOwogCiAgICAgICAgIFRyYW5zbGF0ZU1lc3NhZ2UoICZtc2cgKTsKKyAgICAgICAgQ09OVl9QT0lOVDE2VE8zMiggJm1zZy5wdCwgJnB0ICk7CiAKICAgICAgICAgZlJlbW92ZSA9IEZBTFNFOwogCWlmICgobXNnLm1lc3NhZ2UgPj0gV01fTU9VU0VGSVJTVCkgJiYgKG1zZy5tZXNzYWdlIDw9IFdNX01PVVNFTEFTVCkpCiAJewogCSAgICAgIC8qIEZpbmQgdGhlIHN1Yi1wb3B1cCBmb3IgdGhpcyBtb3VzZSBldmVudCAoaWYgYW55KSAqLwogCi0JICAgIEhNRU5VMTYgaHN1Ym1lbnUgPSBNRU5VX0ZpbmRNZW51QnlDb29yZHMoIGhtZW51LCBtc2cucHQgKTsKKwkgICAgSE1FTlUzMiBoc3VibWVudSA9IE1FTlVfRmluZE1lbnVCeUNvb3JkcyggaG1lbnUsIHB0ICk7CiAKIAkgICAgc3dpdGNoKG1zZy5tZXNzYWdlKQogCSAgICB7CkBAIC0xNjg5LDcgKzE2OTgsNyBAQAogCSAgICBjYXNlIFdNX0xCVVRUT05EQkxDTEs6CiAJICAgIGNhc2UgV01fTEJVVFRPTkRPV046CiAJCWZDbG9zZWQgPSAhTUVOVV9CdXR0b25Eb3duKCBod25kLCBoc3VibWVudSwKLQkJCQkJICAgICZobWVudUN1cnJlbnQsIG1zZy5wdCApOworCQkJCQkgICAgJmhtZW51Q3VycmVudCwgcHQgKTsKIAkJYnJlYWs7CiAJCQogCSAgICBjYXNlIFdNX1JCVVRUT05VUDoKQEAgLTE2OTgsOSArMTcwNyw5IEBACiAKIAkgICAgY2FzZSBXTV9MQlVUVE9OVVA6CiAJCSAgLyogSWYgb3V0c2lkZSBhbGwgbWVudXMgYnV0IGluc2lkZSBscHJlY3QsIGlnbm9yZSBpdCAqLwotCQlpZiAoIWhzdWJtZW51ICYmIGxwcmVjdCAmJiBQdEluUmVjdDE2KGxwcmVjdCwgbXNnLnB0KSkgYnJlYWs7CisJCWlmICghaHN1Ym1lbnUgJiYgbHByZWN0ICYmIFB0SW5SZWN0MzIobHByZWN0LCBwdCkpIGJyZWFrOwogCQlmQ2xvc2VkID0gIU1FTlVfQnV0dG9uVXAoIGh3bmQsIGhzdWJtZW51LAotCQkJCQkgICZobWVudUN1cnJlbnQsIG1zZy5wdCApOworCQkJCQkgICZobWVudUN1cnJlbnQsIHB0ICk7CiAgICAgICAgICAgICAgICAgZlJlbW92ZSA9IFRSVUU7ICAvKiBSZW1vdmUgZXZlbnQgZXZlbiBpZiBvdXRzaWRlIG1lbnUgKi8KIAkJYnJlYWs7CiAJCQpAQCAtMTcwOSw3ICsxNzE4LDcgQEAKIAkJICAgICgod0ZsYWdzICYgVFBNX1JJR0hUQlVUVE9OKSAmJiAobXNnLndQYXJhbSAmIE1LX1JCVVRUT04pKSkKIAkJewogCQkgICAgZkNsb3NlZCA9ICFNRU5VX01vdXNlTW92ZSggaHduZCwgaHN1Ym1lbnUsCi0JCQkJCSAgICAgICAmaG1lbnVDdXJyZW50LCBtc2cucHQgKTsKKwkJCQkJICAgICAgICZobWVudUN1cnJlbnQsIHB0ICk7CiAJCX0KIAkJYnJlYWs7CiAJICAgIH0KQEAgLTE3ODAsOCArMTc4OSw4IEBACiAJCSAgICAgIC8qIFdlIHdpbGwgZmluZCBhIGJldHRlciB3YXkgcmVhbCBzb29uLi4uICovCiAJCSAgICBpZiAoKG1zZy53UGFyYW0gPD0gMzIpIHx8IChtc2cud1BhcmFtID49IDEyNykpIGJyZWFrOwogCQkgICAgcG9zID0gTUVOVV9GaW5kSXRlbUJ5S2V5KCBod25kLCBobWVudUN1cnJlbnQsIG1zZy53UGFyYW0gKTsKLQkJICAgIGlmIChwb3MgPT0gKFVJTlQpLTIpIGZDbG9zZWQgPSBUUlVFOwotCQkgICAgZWxzZSBpZiAocG9zID09IChVSU5UKS0xKSBNZXNzYWdlQmVlcCgwKTsKKwkJICAgIGlmIChwb3MgPT0gKFVJTlQzMiktMikgZkNsb3NlZCA9IFRSVUU7CisJCSAgICBlbHNlIGlmIChwb3MgPT0gKFVJTlQzMiktMSkgTWVzc2FnZUJlZXAoMCk7CiAJCSAgICBlbHNlCiAJCSAgICB7CiAJCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCwgcG9zLCBUUlVFICk7CkBAIC0xODIzLDE1ICsxODMyLDE1IEBACiAgKi8KIHN0YXRpYyB2b2lkIE1FTlVfVHJhY2tTeXNQb3B1cCggV05EKiBwV25kICkKIHsKLSAgICBSRUNUMTYgICAgICByZWN0OwotICAgIEhNRU5VMTYgICAgIGhNZW51ID0gcFduZC0+aFN5c01lbnU7Ci0gICAgSERDMTYgICAgICAgaERDID0gMDsKKyAgICBSRUNUMzIgIHJlY3Q7CisgICAgSE1FTlUzMiBoTWVudSA9IHBXbmQtPmhTeXNNZW51OworICAgIEhEQzMyICAgaERDID0gMDsKIAogICAgIC8qIHRyYWNrIHRoZSBzeXN0ZW0gbWVudSBsaWtlIGEgbm9ybWFsIHBvcHVwIG1lbnUgKi8KIAotICAgIGlmKCBJc01lbnUoaE1lbnUpICkKKyAgICBpZihJc01lbnUzMihoTWVudSkpCiAgICAgewotCUhXTkQxNiBoV25kID0gcFduZC0+aHduZFNlbGY7CisJSFdORDMyIGhXbmQgPSBwV25kLT5od25kU2VsZjsKIAlpZiAoIShwV25kLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpKQogCXsKIAkgICAgaERDID0gR2V0V2luZG93REMzMiggaFduZCApOwpAQCAtMTg0MCw4ICsxODQ5LDggQEAKIAlOQ19HZXRTeXNQb3B1cFBvcyggcFduZCwgJnJlY3QgKTsKIAlNRU5VX0luaXRTeXNNZW51UG9wdXAoIGhNZW51LCBwV25kLT5kd1N0eWxlLAogCQkJCSAgICAgIHBXbmQtPmNsYXNzLT5zdHlsZSk7Ci0JVHJhY2tQb3B1cE1lbnUxNiggaE1lbnUsIFRQTV9MRUZUQUxJR04gfCBUUE1fTEVGVEJVVFRPTiwKLQkJCQkgcmVjdC5sZWZ0LCByZWN0LmJvdHRvbSwgMCwgaFduZCwgJnJlY3QgKTsKKwlUcmFja1BvcHVwTWVudTMyKCBoTWVudSwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmxlZnQsIHJlY3QuYm90dG9tLCAwLCBoV25kLCAmcmVjdCApOwogCWlmICghKHBXbmQtPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkpCiAJewogICAgICAgICAgICAgIE5DX0RyYXdTeXNCdXR0b24oIGhXbmQsIGhEQywgRkFMU0UgKTsKQEAgLTE4NTUsMTQgKzE4NjQsMTQgQEAKICAqCiAgKiBNZW51LWJhciB0cmFja2luZyB1cG9uIGEgbW91c2UgZXZlbnQuIENhbGxlZCBmcm9tIE5DX0hhbmRsZVN5c0NvbW1hbmQoKS4KICAqLwotdm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBXTkQqIHduZFB0ciwgSU5UMTYgaHQsIFBPSU5UMTYgcHQgKQordm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBXTkQqIHduZFB0ciwgSU5UMzIgaHQsIFBPSU5UMzIgcHQgKQogewotICAgIEJPT0wzMgliVHJhY2tTeXMgPSAoKGh0ID09IEhUU1lTTUVOVSAmJiAhd25kUHRyLT53SURtZW51KSB8fAotCQkgICAgICAgICAgICAgKHduZFB0ci0+ZHdTdHlsZSAmIChXU19NSU5JTUlaRSB8IFdTX0NISUxEKSkpOwotICAgIEhXTkQxNgloV25kID0gd25kUHRyLT5od25kU2VsZjsKLSAgICBITUVOVTE2CWhNZW51ID0gKGJUcmFja1N5cykgPyB3bmRQdHItPmhTeXNNZW51IDogd25kUHRyLT53SURtZW51OworICAgIEJPT0wzMiAgYlRyYWNrU3lzID0gKChodCA9PSBIVFNZU01FTlUgJiYgIXduZFB0ci0+d0lEbWVudSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAod25kUHRyLT5kd1N0eWxlICYgKFdTX01JTklNSVpFIHwgV1NfQ0hJTEQpKSk7CisgICAgSFdORDMyICBoV25kID0gd25kUHRyLT5od25kU2VsZjsKKyAgICBITUVOVTMyIGhNZW51ID0gKGJUcmFja1N5cykgPyB3bmRQdHItPmhTeXNNZW51IDogd25kUHRyLT53SURtZW51OwogCi0gICAgaWYoIElzTWVudShoTWVudSkgKQorICAgIGlmIChJc01lbnUzMihoTWVudSkpCiAgICAgewogCUhpZGVDYXJldCgwKTsKIAlTZW5kTWVzc2FnZTE2KCBoV25kLCBXTV9FTlRFUk1FTlVMT09QLCAwLCAwICk7CkBAIC0xODgzLDExICsxODkyLDExIEBACiAgKgogICogTWVudS1iYXIgdHJhY2tpbmcgdXBvbiBhIGtleWJvYXJkIGV2ZW50LiBDYWxsZWQgZnJvbSBOQ19IYW5kbGVTeXNDb21tYW5kKCkuCiAgKi8KLXZvaWQgTUVOVV9UcmFja0tiZE1lbnVCYXIoIFdORCogd25kUHRyLCBVSU5UMTYgd1BhcmFtLCBJTlQxNiB2a2V5KQordm9pZCBNRU5VX1RyYWNrS2JkTWVudUJhciggV05EKiB3bmRQdHIsIFVJTlQzMiB3UGFyYW0sIElOVDMyIHZrZXkpCiB7Ci0gICBJTlQxNiBodE1lbnU7Ci0gICBVSU5UMTYgdUl0ZW0gPSBOT19TRUxFQ1RFRF9JVEVNOwotICAgSE1FTlUxNiBoVHJhY2tNZW51OyAKKyAgIElOVDMyIGh0TWVudTsKKyAgIFVJTlQzMiB1SXRlbSA9IE5PX1NFTEVDVEVEX0lURU07CisgICBITUVOVTMyIGhUcmFja01lbnU7IAogCiAgICAgLyogZmluZCB3aW5kb3cgdGhhdCBoYXMgYSBtZW51ICovCiAgCkBAIC0xOTAwLDcgKzE5MDksNyBAQAogCSAgICAgICF3bmRQdHItPndJRG1lbnUpID8gSFRTWVNNRU5VIDogSFRNRU5VOwogICAgIGhUcmFja01lbnUgPSAoIGh0TWVudSA9PSBIVFNZU01FTlUgKSA/IHduZFB0ci0+aFN5c01lbnUgOiB3bmRQdHItPndJRG1lbnU7CiAKLSAgICBpZiggSXNNZW51KCBoVHJhY2tNZW51ICkgKQorICAgIGlmIChJc01lbnUzMiggaFRyYWNrTWVudSApKQogICAgIHsKICAgICAgICAgSGlkZUNhcmV0KDApOwogICAgICAgICBTZW5kTWVzc2FnZTE2KCB3bmRQdHItPmh3bmRTZWxmLCBXTV9FTlRFUk1FTlVMT09QLCAwLCAwICk7CkBAIC0xOTUzLDEzICsxOTYyLDExIEBACiBCT09MMTYgVHJhY2tQb3B1cE1lbnUxNiggSE1FTlUxNiBoTWVudSwgVUlOVDE2IHdGbGFncywgSU5UMTYgeCwgSU5UMTYgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQxNiBuUmVzZXJ2ZWQsIEhXTkQxNiBoV25kLCBjb25zdCBSRUNUMTYgKmxwUmVjdCApCiB7Ci0gICAgQk9PTCByZXQgPSBGQUxTRTsKLQotICAgIEhpZGVDYXJldCgwKTsKLSAgICBpZiAoTUVOVV9TaG93UG9wdXAoIGhXbmQsIGhNZW51LCAwLCB4LCB5LCAwLCAwICkpIAotCXJldCA9IE1FTlVfVHJhY2tNZW51KCBoTWVudSwgd0ZsYWdzLCAwLCAwLCBoV25kLCBscFJlY3QgKTsKLSAgICBTaG93Q2FyZXQoMCk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBSRUNUMzIgcjsKKyAgICBpZiAobHBSZWN0KQorICAgCSBDT05WX1JFQ1QxNlRPMzIoIGxwUmVjdCwgJnIgKTsKKyAgICByZXR1cm4gVHJhY2tQb3B1cE1lbnUzMiggaE1lbnUsIHdGbGFncywgeCwgeSwgblJlc2VydmVkLCBoV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFJlY3QgPyAmciA6IE5VTEwgKTsKIH0KIAogCkBAIC0xOTY5LDEwICsxOTc2LDEzIEBACiBCT09MMzIgVHJhY2tQb3B1cE1lbnUzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdGbGFncywgSU5UMzIgeCwgSU5UMzIgeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBuUmVzZXJ2ZWQsIEhXTkQzMiBoV25kLCBjb25zdCBSRUNUMzIgKmxwUmVjdCApCiB7Ci0gICAgUkVDVDE2IHI7Ci0gICAgaWYgKGxwUmVjdCkKLSAgIAkgQ09OVl9SRUNUMzJUTzE2KCBscFJlY3QsICZyICk7Ci0gICAgcmV0dXJuIFRyYWNrUG9wdXBNZW51MTYoaE1lbnUsd0ZsYWdzLHgseSxuUmVzZXJ2ZWQsaFduZCxscFJlY3Q/JnI6TlVMTCk7CisgICAgQk9PTDMyIHJldCA9IEZBTFNFOworCisgICAgSGlkZUNhcmV0KDApOworICAgIGlmIChNRU5VX1Nob3dQb3B1cCggaFduZCwgaE1lbnUsIDAsIHgsIHksIDAsIDAgKSkgCisJcmV0ID0gTUVOVV9UcmFja01lbnUoIGhNZW51LCB3RmxhZ3MsIDAsIDAsIGhXbmQsIGxwUmVjdCApOworICAgIFNob3dDYXJldCgwKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMTk4MSwyNSArMTk5MSwyMiBAQAogQk9PTDMyIFRyYWNrUG9wdXBNZW51RXgoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3RmxhZ3MsIElOVDMyIHgsIElOVDMyIHksCiAJCQkgSFdORDMyIGhXbmQsIExQVFBNUEFSQU1TIGxwVHBtICkKIHsKLSAgICBSRUNUMTYgcjsKLQogICAgIGZwcmludGYoIHN0ZGVyciwgIlRyYWNrUG9wdXBNZW51RXg6IG5vdCBmdWxseSBpbXBsZW1lbnRlZFxuIiApOwotCi0gICAgaWYgKGxwVHBtKQotICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZscFRwbS0+cmNFeGNsdWRlLCAmciApOwotICAgIHJldHVybiBUcmFja1BvcHVwTWVudTE2KGhNZW51LHdGbGFncyx4LHksMCxoV25kLGxwVHBtPyZyOk5VTEwpOworICAgIHJldHVybiBUcmFja1BvcHVwTWVudTMyKCBoTWVudSwgd0ZsYWdzLCB4LCB5LCAwLCBoV25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscFRwbSA/ICZscFRwbS0+cmNFeGNsdWRlIDogTlVMTCApOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQb3B1cE1lbnVXbmRQcm9jCiAgKi8KLUxSRVNVTFQgUG9wdXBNZW51V25kUHJvYyhIV05EIGh3bmQsVUlOVCBtZXNzYWdlLFdQQVJBTTE2IHdQYXJhbSxMUEFSQU0gbFBhcmFtKQorTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApCiB7ICAgIAogICAgIHN3aXRjaChtZXNzYWdlKQogICAgIHsKICAgICBjYXNlIFdNX0NSRUFURToKIAl7Ci0JICAgIENSRUFURVNUUlVDVDE2ICpjcyA9IChDUkVBVEVTVFJVQ1QxNiopUFRSX1NFR19UT19MSU4obFBhcmFtKTsKKwkgICAgQ1JFQVRFU1RSVUNUMzJBICpjcyA9IChDUkVBVEVTVFJVQ1QzMkEqKWxQYXJhbTsKIAkgICAgU2V0V2luZG93TG9uZzMyQSggaHduZCwgMCwgKExPTkcpY3MtPmxwQ3JlYXRlUGFyYW1zICk7CiAJICAgIHJldHVybiAwOwogCX0KQEAgLTIwMDksMTEgKzIwMTYsMTEgQEAKIAogICAgIGNhc2UgV01fUEFJTlQ6CiAJewotCSAgICBQQUlOVFNUUlVDVDE2IHBzOwotCSAgICBCZWdpblBhaW50MTYoIGh3bmQsICZwcyApOworCSAgICBQQUlOVFNUUlVDVDMyIHBzOworCSAgICBCZWdpblBhaW50MzIoIGh3bmQsICZwcyApOwogCSAgICBNRU5VX0RyYXdQb3B1cE1lbnUoIGh3bmQsIHBzLmhkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEhNRU5VMTYpR2V0V2luZG93TG9uZzMyQSggaHduZCwgMCApICk7Ci0JICAgIEVuZFBhaW50MTYoIGh3bmQsICZwcyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSE1FTlUzMilHZXRXaW5kb3dMb25nMzJBKCBod25kLCAwICkgKTsKKwkgICAgRW5kUGFpbnQzMiggaHduZCwgJnBzICk7CiAJICAgIHJldHVybiAwOwogCX0KIApAQCAtMjAzMiw3ICsyMDM5LDcgQEAKIAlpZiAod1BhcmFtKSBTZXRXaW5kb3dMb25nMzJBKCBod25kLCAwLCAoSE1FTlUxNil3UGFyYW0gKTsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLQlyZXR1cm4gRGVmV2luZG93UHJvYzE2KGh3bmQsIG1lc3NhZ2UsIHdQYXJhbSwgbFBhcmFtKTsKKwlyZXR1cm4gRGVmV2luZG93UHJvYzMyQSggaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0gKTsKICAgICB9CiAgICAgcmV0dXJuIDA7CiB9CkBAIC0yMDQzLDEwICsyMDUwLDExIEBACiAgKgogICogQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVudSBiYXIgaGVpZ2h0LiBVc2VkIGJ5IE5DX0hhbmRsZU5DQ2FsY1NpemUoKS4KICAqLwotVUlOVCBNRU5VX0dldE1lbnVCYXJIZWlnaHQoIEhXTkQgaHduZCwgVUlOVCBtZW51YmFyV2lkdGgsIGludCBvcmdYLCBpbnQgb3JnWSApCitVSU5UMzIgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EMzIgaHduZCwgVUlOVDMyIG1lbnViYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG9yZ1gsIElOVDMyIG9yZ1kgKQogewogICAgIEhEQzMyIGhkYzsKLSAgICBSRUNUMTYgcmVjdEJhcjsKKyAgICBSRUNUMzIgcmVjdEJhcjsKICAgICBXTkQgKnduZFB0cjsKICAgICBMUFBPUFVQTUVOVSBscHBvcDsKIApAQCAtMjA1NCw3ICsyMDYyLDcgQEAKICAgICBpZiAoIShscHBvcCA9IChMUFBPUFVQTUVOVSlVU0VSX0hFQVBfTElOX0FERFIoKEhNRU5VMTYpd25kUHRyLT53SURtZW51KSkpCiAgICAgICByZXR1cm4gMDsKICAgICBoZGMgPSBHZXREQ0V4MzIoIGh3bmQsIDAsIERDWF9DQUNIRSB8IERDWF9XSU5ET1cgKTsKLSAgICBTZXRSZWN0MTYoJnJlY3RCYXIsIG9yZ1gsIG9yZ1ksIG9yZ1grbWVudWJhcldpZHRoLCBvcmdZK1NZU01FVFJJQ1NfQ1lNRU5VKTsKKyAgICBTZXRSZWN0MzIoJnJlY3RCYXIsIG9yZ1gsIG9yZ1ksIG9yZ1grbWVudWJhcldpZHRoLCBvcmdZK1NZU01FVFJJQ1NfQ1lNRU5VKTsKICAgICBNRU5VX01lbnVCYXJDYWxjU2l6ZSggaGRjLCAmcmVjdEJhciwgbHBwb3AsIGh3bmQgKTsKICAgICBSZWxlYXNlREMzMiggaHduZCwgaGRjICk7CiAgICAgcmV0dXJuIGxwcG9wLT5IZWlnaHQ7CkBAIC0yMDc0LDEwICsyMDgyLDEwIEBACiAgICAgLyogRklYTUU6IFdvcmQgcGFzc2VzIHRoZSBpdGVtIGlkIGluICdwb3MnIGFuZCAwIG9yIDB4ZmZmZiBhcyBpZCAqLwogICAgIC8qIGZvciBNRl9ERUxFVEUuIFdlIHNob3VsZCBjaGVjayB0aGUgcGFyYW1ldGVycyBmb3IgYWxsIG90aGVycyAqLwogICAgIC8qIE1GXyogYWN0aW9ucyBhbHNvIChhbnlib2R5IGdvdCBhIGRvYyBvbiBDaGFuZ2VNZW51PykuICovCi0gICAgaWYgKGZsYWdzICYgTUZfREVMRVRFKSByZXR1cm4gRGVsZXRlTWVudSggaE1lbnUsIHBvcywgZmxhZ3MgJiB+TUZfREVMRVRFICk7Ci0gICAgaWYgKGZsYWdzICYgTUZfQ0hBTkdFKSByZXR1cm4gTW9kaWZ5TWVudTE2KCBoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9DSEFOR0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZGF0YSApOwotICAgIGlmIChmbGFncyAmIE1GX1JFTU9WRSkgcmV0dXJuIFJlbW92ZU1lbnUoIGhNZW51LAorICAgIGlmIChmbGFncyAmIE1GX0RFTEVURSkgcmV0dXJuIERlbGV0ZU1lbnUxNihoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9ERUxFVEUpOworICAgIGlmIChmbGFncyAmIE1GX0NIQU5HRSkgcmV0dXJuIE1vZGlmeU1lbnUxNihoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9DSEFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7CisgICAgaWYgKGZsYWdzICYgTUZfUkVNT1ZFKSByZXR1cm4gUmVtb3ZlTWVudTE2KGhNZW51LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgTUZfQllQT1NJVElPTiA/IHBvcyA6IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgfk1GX1JFTU9WRSApOwogICAgIC8qIERlZmF1bHQ6IE1GX0lOU0VSVCAqLwpAQCAtMjA5NSwxMCArMjEwMywxMCBAQAogICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgKERXT1JEKWRhdGEsIGlkLCBmbGFncyApOwogICAgIGlmIChmbGFncyAmIE1GX0FQUEVORCkgcmV0dXJuIEFwcGVuZE1lbnUzMkEoIGhNZW51LCBmbGFncyAmIH5NRl9BUFBFTkQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsIGRhdGEgKTsKLSAgICBpZiAoZmxhZ3MgJiBNRl9ERUxFVEUpIHJldHVybiBEZWxldGVNZW51KCBoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9ERUxFVEUgKTsKKyAgICBpZiAoZmxhZ3MgJiBNRl9ERUxFVEUpIHJldHVybiBEZWxldGVNZW51MzIoaE1lbnUsIHBvcywgZmxhZ3MgJiB+TUZfREVMRVRFKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9DSEFOR0UpIHJldHVybiBNb2RpZnlNZW51MzJBKGhNZW51LCBwb3MsIGZsYWdzICYgfk1GX0NIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7Ci0gICAgaWYgKGZsYWdzICYgTUZfUkVNT1ZFKSByZXR1cm4gUmVtb3ZlTWVudSggaE1lbnUsCisgICAgaWYgKGZsYWdzICYgTUZfUkVNT1ZFKSByZXR1cm4gUmVtb3ZlTWVudTMyKCBoTWVudSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIE1GX0JZUE9TSVRJT04gPyBwb3MgOiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIH5NRl9SRU1PVkUgKTsKICAgICAvKiBEZWZhdWx0OiBNRl9JTlNFUlQgKi8KQEAgLTIxMTYsMTAgKzIxMjQsMTAgQEAKICAgICAgICAgICAgICAgICAgIGhNZW51LCBwb3MsIChEV09SRClkYXRhLCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoZmxhZ3MgJiBNRl9BUFBFTkQpIHJldHVybiBBcHBlbmRNZW51MzJXKCBoTWVudSwgZmxhZ3MgJiB+TUZfQVBQRU5ELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLCBkYXRhICk7Ci0gICAgaWYgKGZsYWdzICYgTUZfREVMRVRFKSByZXR1cm4gRGVsZXRlTWVudSggaE1lbnUsIHBvcywgZmxhZ3MgJiB+TUZfREVMRVRFICk7CisgICAgaWYgKGZsYWdzICYgTUZfREVMRVRFKSByZXR1cm4gRGVsZXRlTWVudTMyKGhNZW51LCBwb3MsIGZsYWdzICYgfk1GX0RFTEVURSk7CiAgICAgaWYgKGZsYWdzICYgTUZfQ0hBTkdFKSByZXR1cm4gTW9kaWZ5TWVudTMyVyhoTWVudSwgcG9zLCBmbGFncyAmIH5NRl9DSEFOR0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwgZGF0YSApOwotICAgIGlmIChmbGFncyAmIE1GX1JFTU9WRSkgcmV0dXJuIFJlbW92ZU1lbnUoIGhNZW51LAorICAgIGlmIChmbGFncyAmIE1GX1JFTU9WRSkgcmV0dXJuIFJlbW92ZU1lbnUzMiggaE1lbnUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBNRl9CWVBPU0lUSU9OID8gcG9zIDogaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiB+TUZfUkVNT1ZFICk7CiAgICAgLyogRGVmYXVsdDogTUZfSU5TRVJUICovCkBAIC0yMTI4LDEyICsyMTM2LDIxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgQ2hlY2tNZW51SXRlbSAgICAoVVNFUi4xNTQpCisgKiAgICAgICAgIENoZWNrTWVudUl0ZW0xNiAgICAoVVNFUi4xNTQpCiAgKi8KLUlOVCBDaGVja01lbnVJdGVtKCBITUVOVTE2IGhNZW51LCBVSU5UIGlkLCBVSU5UIGZsYWdzICkKK0JPT0wxNiBDaGVja01lbnVJdGVtMTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiBpZCwgVUlOVDE2IGZsYWdzICkKK3sKKyAgICByZXR1cm4gKEJPT0wxNilDaGVja01lbnVJdGVtMzIoIGhNZW51LCBpZCwgZmxhZ3MgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBDaGVja01lbnVJdGVtMzIgICAgKFVTRVIzMi40NSkKKyAqLworRFdPUkQgQ2hlY2tNZW51SXRlbTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgaWQsIFVJTlQzMiBmbGFncyApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07Ci0gICAgSU5UIHJldDsKKyAgICBEV09SRCByZXQ7CiAKICAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiQ2hlY2tNZW51SXRlbTogJTA0eCAlMDR4ICUwNHhcbiIsIGhNZW51LCBpZCwgZmxhZ3MgKTsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmaWQsIGZsYWdzICkpKSByZXR1cm4gLTE7CkBAIC0yMTQ1LDkgKzIxNjIsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlFbmFibGVNZW51SXRlbQkJW1VTRVIuMTU1XQorICogICAgICAgICBFbmFibGVNZW51SXRlbTE2ICAgIChVU0VSLjE1NSkKICAqLwotQk9PTCBFbmFibGVNZW51SXRlbShITUVOVTE2IGhNZW51LCBVSU5UIHdJdGVtSUQsIFVJTlQgd0ZsYWdzKQorQk9PTDE2IEVuYWJsZU1lbnVJdGVtMTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiB3SXRlbUlELCBVSU5UMTYgd0ZsYWdzICkKK3sKKyAgICByZXR1cm4gRW5hYmxlTWVudUl0ZW0zMiggaE1lbnUsIHdJdGVtSUQsIHdGbGFncyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEVuYWJsZU1lbnVJdGVtMzIgICAgKFVTRVIzMi4xNjkpCisgKi8KK0JPT0wzMiBFbmFibGVNZW51SXRlbTMyKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0l0ZW1JRCwgVUlOVDMyIHdGbGFncyApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiRW5hYmxlTWVudUl0ZW0gKCUwNHgsICUwNFgsICUwNFgpICFcbiIsIApAQCAtMjE3MiwyOSArMjE5OCw2OSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgIEdldE1lbnVTdHJpbmcgICAgKFVTRVIuMTYxKQorICogICAgICAgICBHZXRNZW51U3RyaW5nMTYgICAgKFVTRVIuMTYxKQogICovCi1pbnQgR2V0TWVudVN0cmluZyggSE1FTlUxNiBoTWVudSwgVUlOVCB3SXRlbUlELAotICAgICAgICAgICAgICAgICAgIExQU1RSIHN0ciwgc2hvcnQgbk1heFNpeiwgVUlOVCB3RmxhZ3MgKQorSU5UMTYgR2V0TWVudVN0cmluZzE2KCBITUVOVTE2IGhNZW51LCBVSU5UMTYgd0l0ZW1JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgc3RyLCBJTlQxNiBuTWF4U2l6LCBVSU5UMTYgd0ZsYWdzICkKK3sKKyAgICByZXR1cm4gR2V0TWVudVN0cmluZzMyQSggaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0TWVudVN0cmluZzMyQSAgICAoVVNFUjMyLjI2NykKKyAqLworSU5UMzIgR2V0TWVudVN0cmluZzMyQSggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdJdGVtSUQsCisgICAgICAgICAgICAgICAgICAgICAgICBMUFNUUiBzdHIsIElOVDMyIG5NYXhTaXosIFVJTlQzMiB3RmxhZ3MgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogCi0gICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJHZXRNZW51U3RyaW5nOiBtZW51PSUwNHggaXRlbT0lMDR4IHB0cj0lcCBsZW49JWQgZmxhZ3M9JTA0eFxuIiwKKyAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwgIkdldE1lbnVTdHJpbmczMkE6IG1lbnU9JTA0eCBpdGVtPSUwNHggcHRyPSVwIGxlbj0lZCBmbGFncz0lMDR4XG4iLAogICAgICAgICAgICAgICAgICBoTWVudSwgd0l0ZW1JRCwgc3RyLCBuTWF4U2l6LCB3RmxhZ3MgKTsKICAgICBpZiAoIXN0ciB8fCAhbk1heFNpeikgcmV0dXJuIDA7CiAgICAgc3RyWzBdID0gJ1wwJzsKICAgICBpZiAoIShpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0ZsYWdzICkpKSByZXR1cm4gMDsKICAgICBpZiAoIUlTX1NUUklOR19JVEVNKGl0ZW0tPml0ZW1fZmxhZ3MpKSByZXR1cm4gMDsKICAgICBsc3RyY3B5bjMyQSggc3RyLCBpdGVtLT50ZXh0LCBuTWF4U2l6ICk7Ci0gICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJHZXRNZW51U3RyaW5nOiByZXR1cm5pbmcgJyVzJ1xuIiwgc3RyICk7CisgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJHZXRNZW51U3RyaW5nMzJBOiByZXR1cm5pbmcgJyVzJ1xuIiwgc3RyICk7CiAgICAgcmV0dXJuIHN0cmxlbihzdHIpOwogfQogCiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUhpbGl0ZU1lbnVJdGVtCQlbVVNFUi4xNjJdCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRNZW51U3RyaW5nMzJXICAgIChVU0VSMzIuMjY4KQogICovCi1CT09MIEhpbGl0ZU1lbnVJdGVtKEhXTkQgaFduZCwgSE1FTlUxNiBoTWVudSwgVUlOVCB3SXRlbUlELCBVSU5UIHdIaWxpdGUpCitJTlQzMiBHZXRNZW51U3RyaW5nMzJXKCBITUVOVTMyIGhNZW51LCBVSU5UMzIgd0l0ZW1JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExQV1NUUiBzdHIsIElOVDMyIG5NYXhTaXosIFVJTlQzMiB3RmxhZ3MgKQoreworICAgIE1FTlVJVEVNICppdGVtOworCisgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJHZXRNZW51U3RyaW5nMzJXOiBtZW51PSUwNHggaXRlbT0lMDR4IHB0cj0lcCBsZW49JWQgZmxhZ3M9JTA0eFxuIiwKKyAgICAgICAgICAgICAgICAgaE1lbnUsIHdJdGVtSUQsIHN0ciwgbk1heFNpeiwgd0ZsYWdzICk7CisgICAgaWYgKCFzdHIgfHwgIW5NYXhTaXopIHJldHVybiAwOworICAgIHN0clswXSA9ICdcMCc7CisgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJndJdGVtSUQsIHdGbGFncyApKSkgcmV0dXJuIDA7CisgICAgaWYgKCFJU19TVFJJTkdfSVRFTShpdGVtLT5pdGVtX2ZsYWdzKSkgcmV0dXJuIDA7CisgICAgbHN0cmNweW5BdG9XKCBzdHIsIGl0ZW0tPnRleHQsIG5NYXhTaXogKTsKKyAgICByZXR1cm4gbHN0cmxlbjMyVyhzdHIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEhpbGl0ZU1lbnVJdGVtMTYgICAgKFVTRVIuMTYyKQorICovCitCT09MMTYgSGlsaXRlTWVudUl0ZW0xNiggSFdORDE2IGhXbmQsIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiB3SXRlbUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiB3SGlsaXRlICkKK3sKKyAgICByZXR1cm4gSGlsaXRlTWVudUl0ZW0zMiggaFduZCwgaE1lbnUsIHdJdGVtSUQsIHdIaWxpdGUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBIaWxpdGVNZW51SXRlbTMyICAgIChVU0VSMzIuMzE3KQorICovCitCT09MMzIgSGlsaXRlTWVudUl0ZW0zMiggSFdORDMyIGhXbmQsIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiB3SXRlbUlELAorICAgICAgICAgICAgICAgICAgICAgICAgIFVJTlQzMiB3SGlsaXRlICkKIHsKICAgICBMUFBPUFVQTUVOVSBtZW51OwogICAgIGRwcmludGZfbWVudShzdGRkZWIsIkhpbGl0ZU1lbnVJdGVtKCUwNHgsICUwNHgsICUwNHgsICUwNHgpO1xuIiwgCkBAIC0yMjA5LDkgKzIyNzUsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlHZXRNZW51U3RhdGUJCVtVU0VSLjI1MF0KKyAqICAgICAgICAgR2V0TWVudVN0YXRlMTYgICAgKFVTRVIuMjUwKQogICovCi1VSU5UIEdldE1lbnVTdGF0ZShITUVOVTE2IGhNZW51LCBVSU5UIHdJdGVtSUQsIFVJTlQgd0ZsYWdzKQorVUlOVDE2IEdldE1lbnVTdGF0ZTE2KCBITUVOVTE2IGhNZW51LCBVSU5UMTYgd0l0ZW1JRCwgVUlOVDE2IHdGbGFncyApCit7CisgICAgcmV0dXJuIEdldE1lbnVTdGF0ZTMyKCBoTWVudSwgd0l0ZW1JRCwgd0ZsYWdzICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0TWVudVN0YXRlMzIgICAgKFVTRVIzMi4yNjYpCisgKi8KK1VJTlQzMiBHZXRNZW51U3RhdGUzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIHdJdGVtSUQsIFVJTlQzMiB3RmxhZ3MgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogICAgIGRwcmludGZfbWVudShzdGRkZWIsIkdldE1lbnVTdGF0ZSglMDR4LCAlMDR4LCAlMDR4KTtcbiIsIApAQCAtMjIyOCwyOCArMjMwMyw1MiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldE1lbnVJdGVtQ291bnQJCVtVU0VSLjI2M10KKyAqICAgICAgICAgR2V0TWVudUl0ZW1Db3VudDE2ICAgIChVU0VSLjI2MykKICAqLwotSU5UIEdldE1lbnVJdGVtQ291bnQoSE1FTlUxNiBoTWVudSkKK0lOVDE2IEdldE1lbnVJdGVtQ291bnQxNiggSE1FTlUxNiBoTWVudSApCiB7Ci0JTFBQT1BVUE1FTlUJbWVudTsKLQlkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRNZW51SXRlbUNvdW50KCUwNHgpO1xuIiwgaE1lbnUpOwotCW1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7Ci0JaWYgKG1lbnUgPT0gTlVMTCB8fCBtZW51LT53TWFnaWMgIT0gTUVOVV9NQUdJQykgcmV0dXJuIChVSU5UKS0xOwotCWRwcmludGZfbWVudShzdGRkZWIsIkdldE1lbnVJdGVtQ291bnQoJTA0eCkgcmV0dXJuICVkIFxuIiwgCi0JCSAgICAgaE1lbnUsIG1lbnUtPm5JdGVtcyk7Ci0JcmV0dXJuIG1lbnUtPm5JdGVtczsKKyAgICBMUFBPUFVQTUVOVQltZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOworICAgIGlmICghbWVudSB8fCAobWVudS0+d01hZ2ljICE9IE1FTlVfTUFHSUMpKSByZXR1cm4gLTE7CisgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsIkdldE1lbnVJdGVtQ291bnQxNiglMDR4KSByZXR1cm5pbmcgJWRcbiIsIAorICAgICAgICAgICAgICAgICAgaE1lbnUsIG1lbnUtPm5JdGVtcyApOworICAgIHJldHVybiBtZW51LT5uSXRlbXM7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJR2V0TWVudUl0ZW1JRAkJCVtVU0VSLjI2NF0KKyAqICAgICAgICAgR2V0TWVudUl0ZW1Db3VudDMyICAgIChVU0VSMzIuMjYxKQogICovCi1VSU5UIEdldE1lbnVJdGVtSUQoSE1FTlUxNiBoTWVudSwgaW50IG5Qb3MpCitJTlQzMiBHZXRNZW51SXRlbUNvdW50MzIoIEhNRU5VMzIgaE1lbnUgKQoreworICAgIExQUE9QVVBNRU5VCW1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CisgICAgaWYgKCFtZW51IHx8IChtZW51LT53TWFnaWMgIT0gTUVOVV9NQUdJQykpIHJldHVybiAtMTsKKyAgICBkcHJpbnRmX21lbnUoIHN0ZGRlYiwiR2V0TWVudUl0ZW1Db3VudDMyKCUwNHgpIHJldHVybmluZyAlZFxuIiwgCisgICAgICAgICAgICAgICAgICBoTWVudSwgbWVudS0+bkl0ZW1zICk7CisgICAgcmV0dXJuIG1lbnUtPm5JdGVtczsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRNZW51SXRlbUlEMTYgICAgKFVTRVIuMjY0KQorICovCitVSU5UMTYgR2V0TWVudUl0ZW1JRDE2KCBITUVOVTE2IGhNZW51LCBJTlQxNiBuUG9zICkKIHsKICAgICBMUFBPUFVQTUVOVQltZW51OwogCi0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiR2V0TWVudUl0ZW1JRCglMDR4LCAlZCk7XG4iLCBoTWVudSwgblBvcyk7CisgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiAtMTsKKyAgICBpZiAoKG5Qb3MgPCAwKSB8fCAoblBvcyA+PSBtZW51LT5uSXRlbXMpKSByZXR1cm4gLTE7CisgICAgaWYgKG1lbnUtPml0ZW1zW25Qb3NdLml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgcmV0dXJuIC0xOworICAgIHJldHVybiBtZW51LT5pdGVtc1tuUG9zXS5pdGVtX2lkOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldE1lbnVJdGVtSUQzMiAgICAoVVNFUjMyLjI2MikKKyAqLworVUlOVDMyIEdldE1lbnVJdGVtSUQzMiggSE1FTlUzMiBoTWVudSwgSU5UMzIgblBvcyApCit7CisgICAgTFBQT1BVUE1FTlUJbWVudTsKKwogICAgIGlmICghKG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKSByZXR1cm4gLTE7CiAgICAgaWYgKChuUG9zIDwgMCkgfHwgKG5Qb3MgPj0gbWVudS0+bkl0ZW1zKSkgcmV0dXJuIC0xOwogICAgIGlmIChtZW51LT5pdGVtc1tuUG9zXS5pdGVtX2ZsYWdzICYgTUZfUE9QVVApIHJldHVybiAtMTsKQEAgLTIyNjMsMTAgKzIzNjIsMTIgQEAKIEJPT0wxNiBJbnNlcnRNZW51MTYoIEhNRU5VMTYgaE1lbnUsIFVJTlQxNiBwb3MsIFVJTlQxNiBmbGFncywKICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBpZCwgU0VHUFRSIGRhdGEgKQogeworICAgIFVJTlQzMiBwb3MzMiA9IChVSU5UMzIpcG9zOworICAgIGlmICgocG9zID09IChVSU5UMTYpLTEpICYmIChmbGFncyAmIE1GX0JZUE9TSVRJT04pKSBwb3MzMiA9IChVSU5UMzIpLTE7CiAgICAgaWYgKElTX1NUUklOR19JVEVNKGZsYWdzKSAmJiBkYXRhKQotICAgICAgICByZXR1cm4gSW5zZXJ0TWVudTMyQSggaE1lbnUsIChJTlQzMikoSU5UMTYpcG9zLCBmbGFncywgaWQsCisgICAgICAgIHJldHVybiBJbnNlcnRNZW51MzJBKCBoTWVudSwgcG9zMzIsIGZsYWdzLCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUilQVFJfU0VHX1RPX0xJTihkYXRhKSApOwotICAgIHJldHVybiBJbnNlcnRNZW51MzJBKCBoTWVudSwgKElOVDMyKShJTlQxNilwb3MsIGZsYWdzLCBpZCwgKExQU1RSKWRhdGEgKTsKKyAgICByZXR1cm4gSW5zZXJ0TWVudTMyQSggaE1lbnUsIHBvczMyLCBmbGFncywgaWQsIChMUFNUUilkYXRhICk7CiB9CiAKIApAQCAtMjI4OCw3ICsyMzg5LDcgQEAKIAogICAgIGlmICghKE1FTlVfU2V0SXRlbURhdGEoIGl0ZW0sIGZsYWdzLCBpZCwgc3RyICkpKQogICAgIHsKLSAgICAgICAgUmVtb3ZlTWVudSggaE1lbnUsIHBvcywgZmxhZ3MgKTsKKyAgICAgICAgUmVtb3ZlTWVudTMyKCBoTWVudSwgcG9zLCBmbGFncyApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCkBAIC0yMzQ4LDkgKzI0NDksMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlSZW1vdmVNZW51CQlbVVNFUi40MTJdCisgKiAgICAgICAgIFJlbW92ZU1lbnUxNiAgICAoVVNFUi40MTIpCiAgKi8KLUJPT0wgUmVtb3ZlTWVudShITUVOVTE2IGhNZW51LCBVSU5UIG5Qb3MsIFVJTlQgd0ZsYWdzKQorQk9PTDE2IFJlbW92ZU1lbnUxNiggSE1FTlUxNiBoTWVudSwgVUlOVDE2IG5Qb3MsIFVJTlQxNiB3RmxhZ3MgKQoreworICAgIHJldHVybiBSZW1vdmVNZW51MzIoIGhNZW51LCBuUG9zLCB3RmxhZ3MgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBSZW1vdmVNZW51MzIgICAgKFVTRVIzMi40NDApCisgKi8KK0JPT0wzMiBSZW1vdmVNZW51MzIoIEhNRU5VMzIgaE1lbnUsIFVJTlQzMiBuUG9zLCBVSU5UMzIgd0ZsYWdzICkKIHsKICAgICBMUFBPUFVQTUVOVQltZW51OwogICAgIE1FTlVJVEVNICppdGVtOwpAQCAtMjM4NCwxNSArMjQ5NCwyNCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCURlbGV0ZU1lbnUJCVtVU0VSLjQxM10KKyAqICAgICAgICAgRGVsZXRlTWVudTE2ICAgIChVU0VSLjQxMykKICAqLwotQk9PTCBEZWxldGVNZW51KEhNRU5VMTYgaE1lbnUsIFVJTlQgblBvcywgVUlOVCB3RmxhZ3MpCitCT09MMTYgRGVsZXRlTWVudTE2KCBITUVOVTE2IGhNZW51LCBVSU5UMTYgblBvcywgVUlOVDE2IHdGbGFncyApCit7CisgICAgcmV0dXJuIERlbGV0ZU1lbnUzMiggaE1lbnUsIG5Qb3MsIHdGbGFncyApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIERlbGV0ZU1lbnUzMiAgICAoVVNFUjMyLjEyOCkKKyAqLworQk9PTDMyIERlbGV0ZU1lbnUzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIG5Qb3MsIFVJTlQzMiB3RmxhZ3MgKQogewogICAgIE1FTlVJVEVNICppdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmblBvcywgd0ZsYWdzICk7CiAgICAgaWYgKCFpdGVtKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkgRGVzdHJveU1lbnUoIChITUVOVTE2KWl0ZW0tPml0ZW1faWQgKTsKKyAgICBpZiAoaXRlbS0+aXRlbV9mbGFncyAmIE1GX1BPUFVQKSBEZXN0cm95TWVudTMyKCAoSE1FTlUzMilpdGVtLT5pdGVtX2lkICk7CiAgICAgICAvKiBuUG9zIGlzIG5vdyB0aGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gKi8KLSAgICBSZW1vdmVNZW51KCBoTWVudSwgblBvcywgd0ZsYWdzIHwgTUZfQllQT1NJVElPTiApOworICAgIFJlbW92ZU1lbnUzMiggaE1lbnUsIG5Qb3MsIHdGbGFncyB8IE1GX0JZUE9TSVRJT04gKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMjQwNCw5ICsyNTIzLDkgQEAKICAgICAgICAgICAgICAgICAgICAgIFVJTlQxNiBpZCwgU0VHUFRSIGRhdGEgKQogewogICAgIGlmIChJU19TVFJJTkdfSVRFTShmbGFncykpCi0gICAgICAgIHJldHVybiBNb2RpZnlNZW51MzJBKCBoTWVudSwgKElOVDMyKShJTlQxNilwb3MsIGZsYWdzLCBpZCwKKyAgICAgICAgcmV0dXJuIE1vZGlmeU1lbnUzMkEoIGhNZW51LCBwb3MsIGZsYWdzLCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFNUUilQVFJfU0VHX1RPX0xJTihkYXRhKSApOwotICAgIHJldHVybiBNb2RpZnlNZW51MzJBKCBoTWVudSwgKElOVDMyKShJTlQxNilwb3MsIGZsYWdzLCBpZCwgKExQU1RSKWRhdGEgKTsKKyAgICByZXR1cm4gTW9kaWZ5TWVudTMyQSggaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCAoTFBTVFIpZGF0YSApOwogfQogCiAKQEAgLTI0MTcsOCArMjUzNiw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGlkLCBMUENTVFIgc3RyICkKIHsKICAgICBNRU5VSVRFTSAqaXRlbTsKLSAgICBITUVOVTE2IGhNZW51MTYgPSBoTWVudTsKLSAgICBVSU5UMTYgcG9zMTYgPSBwb3M7CiAKICAgICBpZiAoSVNfU1RSSU5HX0lURU0oZmxhZ3MpKQogICAgIHsKQEAgLTI0MzIsNyArMjU0OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgaE1lbnUsIHBvcywgZmxhZ3MsIGlkLCAoRFdPUkQpc3RyICk7CiAgICAgfQogCi0gICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudTE2LCAmcG9zMTYsIGZsYWdzICkpKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCEoaXRlbSA9IE1FTlVfRmluZEl0ZW0oICZoTWVudSwgJnBvcywgZmxhZ3MgKSkpIHJldHVybiBGQUxTRTsKICAgICByZXR1cm4gTUVOVV9TZXRJdGVtRGF0YSggaXRlbSwgZmxhZ3MsIGlkLCBzdHIgKTsKIH0KIApAQCAtMjQ1NywxNCArMjU3NCwyMyBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUNyZWF0ZVBvcHVwTWVudQkJW1VTRVIuNDE1XQorICogICAgICAgICBDcmVhdGVQb3B1cE1lbnUxNiAgICAoVVNFUi40MTUpCiAgKi8KLUhNRU5VMTYgQ3JlYXRlUG9wdXBNZW51KCkKK0hNRU5VMTYgQ3JlYXRlUG9wdXBNZW51MTYodm9pZCkKIHsKLSAgICBITUVOVTE2IGhtZW51OworICAgIHJldHVybiBDcmVhdGVQb3B1cE1lbnUzMigpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIENyZWF0ZVBvcHVwTWVudTMyICAgIChVU0VSMzIuODEpCisgKi8KK0hNRU5VMzIgQ3JlYXRlUG9wdXBNZW51MzIodm9pZCkKK3sKKyAgICBITUVOVTMyIGhtZW51OwogICAgIFBPUFVQTUVOVSAqbWVudTsKIAotICAgIGlmICghKGhtZW51ID0gQ3JlYXRlTWVudSgpKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoaG1lbnUgPSBDcmVhdGVNZW51MzIoKSkpIHJldHVybiAwOwogICAgIG1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaG1lbnUgKTsKICAgICBtZW51LT53RmxhZ3MgfD0gTUZfUE9QVVA7CiAgICAgcmV0dXJuIGhtZW51OwpAQCAtMjQ3MiwxOSArMjU5OCwyOSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zCVtVU0VSLjQxN10KKyAqICAgICAgICAgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMgICAgKFVTRVIuNDE3KSAoVVNFUjMyLjI1NykKICAqLwotRFdPUkQgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKQorRFdPUkQgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnModm9pZCkKIHsKICAgICByZXR1cm4gTUFLRUxPTkcoIGNoZWNrX2JpdG1hcF93aWR0aCwgY2hlY2tfYml0bWFwX2hlaWdodCApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCVNldE1lbnVJdGVtQml0bWFwcwlbVVNFUi40MThdCisgKiAgICAgICAgIFNldE1lbnVJdGVtQml0bWFwczE2ICAgIChVU0VSLjQxOCkKICAqLwotQk9PTCBTZXRNZW51SXRlbUJpdG1hcHMoSE1FTlUxNiBoTWVudSwgVUlOVCBuUG9zLCBVSU5UIHdGbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAxNiBoTmV3VW5DaGVjaywgSEJJVE1BUDE2IGhOZXdDaGVjaykKK0JPT0wxNiBTZXRNZW51SXRlbUJpdG1hcHMxNiggSE1FTlUxNiBoTWVudSwgVUlOVDE2IG5Qb3MsIFVJTlQxNiB3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAxNiBoTmV3VW5DaGVjaywgSEJJVE1BUDE2IGhOZXdDaGVjayApCit7CisgICAgcmV0dXJuIFNldE1lbnVJdGVtQml0bWFwczMyKCBoTWVudSwgblBvcywgd0ZsYWdzLCBoTmV3VW5DaGVjaywgaE5ld0NoZWNrICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgU2V0TWVudUl0ZW1CaXRtYXBzMzIgICAgKFVTRVIzMi40ODkpCisgKi8KK0JPT0wzMiBTZXRNZW51SXRlbUJpdG1hcHMzMiggSE1FTlUzMiBoTWVudSwgVUlOVDMyIG5Qb3MsIFVJTlQzMiB3RmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhCSVRNQVAzMiBoTmV3VW5DaGVjaywgSEJJVE1BUDMyIGhOZXdDaGVjayApCiB7CiAgICAgTUVOVUlURU0gKml0ZW07CiAgICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiU2V0TWVudUl0ZW1CaXRtYXBzKCUwNHgsICUwNHgsICUwNHgsICUwNHgsICUwNHgpXG4iLApAQCAtMjUwOSwxNSArMjY0NSwyMiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUNyZWF0ZU1lbnUJCVtVU0VSLjE1MV0KKyAqICAgICAgICAgQ3JlYXRlTWVudTE2ICAgIChVU0VSLjE1MSkKICAqLwotSE1FTlUxNiBDcmVhdGVNZW51KCkKK0hNRU5VMTYgQ3JlYXRlTWVudTE2KHZvaWQpCiB7Ci0gICAgSE1FTlUxNiBoTWVudTsKKyAgICByZXR1cm4gQ3JlYXRlTWVudTMyKCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgQ3JlYXRlTWVudTMyICAgIChVU0VSMzIuODApCisgKi8KK0hNRU5VMzIgQ3JlYXRlTWVudTMyKHZvaWQpCit7CisgICAgSE1FTlUzMiBoTWVudTsKICAgICBMUFBPUFVQTUVOVSBtZW51OwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkNyZWF0ZU1lbnUgIVxuIik7Ci0gICAgaWYgKCEoaE1lbnUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihQT1BVUE1FTlUpICkpKQotCXJldHVybiAwOworICAgIGlmICghKGhNZW51ID0gVVNFUl9IRUFQX0FMTE9DKCBzaXplb2YoUE9QVVBNRU5VKSApKSkgcmV0dXJuIDA7CiAgICAgbWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KTsKICAgICBtZW51LT53RmxhZ3MgPSAwOwogICAgIG1lbnUtPndNYWdpYyA9IE1FTlVfTUFHSUM7CkBAIC0yNTI4LDE4ICsyNjcxLDI3IEBACiAgICAgbWVudS0+aFduZCAgID0gMDsKICAgICBtZW51LT5pdGVtcyAgPSBOVUxMOwogICAgIG1lbnUtPkZvY3VzZWRJdGVtID0gTk9fU0VMRUNURURfSVRFTTsKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJDcmVhdGVNZW51IC8vIHJldHVybiAlMDR4XG4iLCBoTWVudSk7CisgICAgZHByaW50Zl9tZW51KCBzdGRkZWIsICJDcmVhdGVNZW51OiByZXR1cm4gJTA0eFxuIiwgaE1lbnUgKTsKICAgICByZXR1cm4gaE1lbnU7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJRGVzdHJveU1lbnUJCVtVU0VSLjE1Ml0KKyAqICAgICAgICAgRGVzdHJveU1lbnUxNiAgICAoVVNFUi4xNTIpCiAgKi8KLUJPT0wgRGVzdHJveU1lbnUoSE1FTlUxNiBoTWVudSkKK0JPT0wxNiBEZXN0cm95TWVudTE2KCBITUVOVTE2IGhNZW51ICkKK3sKKyAgICByZXR1cm4gRGVzdHJveU1lbnUzMiggaE1lbnUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBEZXN0cm95TWVudTMyICAgIChVU0VSMzIuMTMzKQorICovCitCT09MMzIgRGVzdHJveU1lbnUzMiggSE1FTlUzMiBoTWVudSApCiB7CiAgICAgTFBQT1BVUE1FTlUgbHBwb3A7Ci0gICAgZHByaW50Zl9tZW51KHN0ZGRlYiwiRGVzdHJveU1lbnUgKCUwNHgpICFcbiIsIGhNZW51KTsKKyAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJEZXN0cm95TWVudSglMDR4KVxuIiwgaE1lbnUpOwogCiAgICAgaWYgKGhNZW51ID09IDApIHJldHVybiBGQUxTRTsKICAgICAvKiBTaWxlbnRseSBpZ25vcmUgYXR0ZW1wdHMgdG8gZGVzdHJveSBkZWZhdWx0IHN5c3RlbSBtZW51ICovCkBAIC0yNTQ3LDcgKzI2OTksOSBAQAogICAgIGxwcG9wID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwogICAgIGlmICghbHBwb3AgfHwgKGxwcG9wLT53TWFnaWMgIT0gTUVOVV9NQUdJQykpIHJldHVybiBGQUxTRTsKICAgICBscHBvcC0+d01hZ2ljID0gMDsgIC8qIE1hcmsgaXQgYXMgZGVzdHJveWVkICovCi0gICAgaWYgKChscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICYmIGxwcG9wLT5oV25kICYmICghcFRvcFBXbmQgfHwgKGxwcG9wLT5oV25kICE9IHBUb3BQV25kLT5od25kU2VsZikpKQorICAgIGlmICgobHBwb3AtPndGbGFncyAmIE1GX1BPUFVQKSAmJgorICAgICAgICBscHBvcC0+aFduZCAmJgorICAgICAgICAoIXBUb3BQV25kIHx8IChscHBvcC0+aFduZCAhPSBwVG9wUFduZC0+aHduZFNlbGYpKSkKICAgICAgICAgRGVzdHJveVdpbmRvdyggbHBwb3AtPmhXbmQgKTsKIAogICAgIGlmIChscHBvcC0+aXRlbXMpCkBAIC0yNTU3LDIxICsyNzExLDMwIEBACiAgICAgICAgIGZvciAoaSA9IGxwcG9wLT5uSXRlbXM7IGkgPiAwOyBpLS0sIGl0ZW0rKykKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGl0ZW0tPml0ZW1fZmxhZ3MgJiBNRl9QT1BVUCkKLSAgICAgICAgICAgICAgICBEZXN0cm95TWVudSggKEhNRU5VMTYpaXRlbS0+aXRlbV9pZCApOworICAgICAgICAgICAgICAgIERlc3Ryb3lNZW51MzIoIChITUVOVTMyKWl0ZW0tPml0ZW1faWQgKTsKIAkgICAgaWYgKElTX1NUUklOR19JVEVNKGl0ZW0tPml0ZW1fZmxhZ3MpICYmIGl0ZW0tPnRleHQpCiAgICAgICAgICAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIGl0ZW0tPnRleHQgKTsKICAgICAgICAgfQogICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgbHBwb3AtPml0ZW1zICk7CiAgICAgfQogICAgIFVTRVJfSEVBUF9GUkVFKCBoTWVudSApOwotICAgIGRwcmludGZfbWVudShzdGRkZWIsIkRlc3Ryb3lNZW51ICglMDR4KSAvLyBFbmQgIVxuIiwgaE1lbnUpOwogICAgIHJldHVybiBUUlVFOwogfQogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldFN5c3RlbU1lbnUJCVtVU0VSLjE1Nl0KKyAqICAgICAgICAgR2V0U3lzdGVtTWVudTE2ICAgIChVU0VSLjE1NikKICAqLwotSE1FTlUxNiBHZXRTeXN0ZW1NZW51KEhXTkQgaFduZCwgQk9PTCBiUmV2ZXJ0KQorSE1FTlUxNiBHZXRTeXN0ZW1NZW51MTYoIEhXTkQxNiBoV25kLCBCT09MMTYgYlJldmVydCApCit7CisgICAgcmV0dXJuIEdldFN5c3RlbU1lbnUzMiggaFduZCwgYlJldmVydCApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIEdldFN5c3RlbU1lbnUzMiAgICAoVVNFUjMyLjI5MCkKKyAqLworSE1FTlUzMiBHZXRTeXN0ZW1NZW51MzIoIEhXTkQzMiBoV25kLCBCT09MMzIgYlJldmVydCApCiB7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaFduZCApOwogICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKQEAgLTI1ODIsMTEzICsyNzQ1LDE0OCBAQAogICAgICAgICByZXR1cm4gd25kUHRyLT5oU3lzTWVudTsKICAgICB9CiAgICAgaWYgKCFiUmV2ZXJ0KSByZXR1cm4gd25kUHRyLT5oU3lzTWVudTsKLSAgICBpZiAod25kUHRyLT5oU3lzTWVudSkgRGVzdHJveU1lbnUod25kUHRyLT5oU3lzTWVudSk7CisgICAgaWYgKHduZFB0ci0+aFN5c01lbnUpIERlc3Ryb3lNZW51MzIod25kUHRyLT5oU3lzTWVudSk7CiAgICAgd25kUHRyLT5oU3lzTWVudSA9IE1FTlVfQ29weVN5c01lbnUoKTsKICAgICByZXR1cm4gd25kUHRyLT5oU3lzTWVudTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICBTZXRTeXN0ZW1NZW51ICAgIChVU0VSLjI4MCkKKyAqICAgICAgICAgU2V0U3lzdGVtTWVudTE2ICAgIChVU0VSLjI4MCkKICAqLwotQk9PTCBTZXRTeXN0ZW1NZW51KCBIV05EIGh3bmQsIEhNRU5VMTYgaE1lbnUgKQorQk9PTDE2IFNldFN5c3RlbU1lbnUxNiggSFdORDE2IGh3bmQsIEhNRU5VMTYgaE1lbnUgKQoreworICAgIHJldHVybiBTZXRTeXN0ZW1NZW51MzIoIGh3bmQsIGhNZW51ICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgU2V0U3lzdGVtTWVudTMyICAgIChVU0VSMzIuNTA3KQorICovCitCT09MMzIgU2V0U3lzdGVtTWVudTMyKCBIV05EMzIgaHduZCwgSE1FTlUzMiBoTWVudSApCiB7CiAgICAgV05EICp3bmRQdHI7CiAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAod25kUHRyLT5oU3lzTWVudSAmJiAod25kUHRyLT5oU3lzTWVudSAhPSBNRU5VX0RlZlN5c01lbnUpKQotICAgICAgICBEZXN0cm95TWVudSggd25kUHRyLT5oU3lzTWVudSApOworICAgICAgICBEZXN0cm95TWVudTMyKCB3bmRQdHItPmhTeXNNZW51ICk7CiAgICAgd25kUHRyLT5oU3lzTWVudSA9IGhNZW51OwogICAgIHJldHVybiBUUlVFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCUdldE1lbnUJCVtVU0VSLjE1N10KKyAqICAgICAgICAgR2V0TWVudTE2ICAgIChVU0VSLjE1NykKICAqLwotSE1FTlUxNiBHZXRNZW51KEhXTkQgaFduZCkgCi17IAotCVdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwotCWlmICh3bmRQdHIgPT0gTlVMTCkgcmV0dXJuIDA7Ci0JcmV0dXJuIChITUVOVTE2KXduZFB0ci0+d0lEbWVudTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogCQkJU2V0TWVudSAJW1VTRVIuMTU4XQotICovCi1CT09MIFNldE1lbnUoSFdORCBoV25kLCBITUVOVTE2IGhNZW51KQorSE1FTlUxNiBHZXRNZW51MTYoIEhXTkQxNiBoV25kICkgCiB7Ci0JTFBQT1BVUE1FTlUgbHBtZW51OwotCVdORCAqIHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwotCWlmICh3bmRQdHIgPT0gTlVMTCkgewotCQlmcHJpbnRmKHN0ZGVyciwiU2V0TWVudSglMDR4LCAlMDR4KSAvLyBCYWQgd2luZG93IGhhbmRsZSAhXG4iLAotCQkJaFduZCwgaE1lbnUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQlkcHJpbnRmX21lbnUoc3RkZGViLCJTZXRNZW51KCUwNHgsICUwNHgpO1xuIiwgaFduZCwgaE1lbnUpOwotCWlmIChHZXRDYXB0dXJlMzIoKSA9PSBoV25kKSBSZWxlYXNlQ2FwdHVyZSgpOwotCXduZFB0ci0+d0lEbWVudSA9IChVSU5UKWhNZW51OwotCWlmIChoTWVudSAhPSAwKQotCXsKLQkgICAgbHBtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoaE1lbnUpOwotCSAgICBpZiAobHBtZW51ID09IE5VTEwpIHsKLQkJZnByaW50ZihzdGRlcnIsIlNldE1lbnUoJTA0eCwgJTA0eCkgLy8gQmFkIG1lbnUgaGFuZGxlICFcbiIsIAotCQkJaFduZCwgaE1lbnUpOwotCQlyZXR1cm4gRkFMU0U7Ci0JCX0KLQkgICAgbHBtZW51LT5oV25kID0gaFduZDsKLQkgICAgbHBtZW51LT53RmxhZ3MgJj0gfk1GX1BPUFVQOyAgLyogQ2FuJ3QgYmUgYSBwb3B1cCAqLwotCSAgICBscG1lbnUtPkhlaWdodCA9IDA7ICAvKiBNYWtlIHN1cmUgd2UgcmVjYWxjdWxhdGUgdGhlIHNpemUgKi8KLQl9Ci0gICAgICAgIGlmIChJc1dpbmRvd1Zpc2libGUoaFduZCkpCi0gICAgICAgICAgICBTZXRXaW5kb3dQb3MoIGhXbmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEICk7Ci0JcmV0dXJuIFRSVUU7CisgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisgICAgaWYgKHduZFB0cikgcmV0dXJuIChITUVOVTE2KXduZFB0ci0+d0lEbWVudTsKKyAgICByZXR1cm4gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBHZXRNZW51MzIgICAgKFVTRVIzMi4yNTYpCisgKi8KK0hNRU5VMzIgR2V0TWVudTMyKCBIV05EMzIgaFduZCApIAoreyAKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBpZiAod25kUHRyKSByZXR1cm4gKEhNRU5VMzIpd25kUHRyLT53SURtZW51OworICAgIHJldHVybiAwOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFNldE1lbnUxNiAgICAoVVNFUi4xNTgpCisgKi8KK0JPT0wxNiBTZXRNZW51MTYoIEhXTkQxNiBoV25kLCBITUVOVTE2IGhNZW51ICkKK3sKKyAgICByZXR1cm4gU2V0TWVudTMyKCBoV25kLCBoTWVudSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgIFNldE1lbnUzMiAgICAoVVNFUjMyLjQ4NikKKyAqLworQk9PTDMyIFNldE1lbnUzMiggSFdORDMyIGhXbmQsIEhNRU5VMzIgaE1lbnUgKQoreworICAgIExQUE9QVVBNRU5VIGxwbWVudTsKKyAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuIEZBTFNFOworICAgIGRwcmludGZfbWVudShzdGRkZWIsIlNldE1lbnUoJTA0eCwgJTA0eCk7XG4iLCBoV25kLCBoTWVudSk7CisgICAgaWYgKEdldENhcHR1cmUzMigpID09IGhXbmQpIFJlbGVhc2VDYXB0dXJlKCk7CisgICAgd25kUHRyLT53SURtZW51ID0gKFVJTlQzMiloTWVudTsKKyAgICBpZiAoaE1lbnUgIT0gMCkKKyAgICB7CisgICAgICAgIGlmICghKGxwbWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKGhNZW51KSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgbHBtZW51LT5oV25kID0gaFduZDsKKyAgICAgICAgbHBtZW51LT53RmxhZ3MgJj0gfk1GX1BPUFVQOyAgLyogQ2FuJ3QgYmUgYSBwb3B1cCAqLworICAgICAgICBscG1lbnUtPkhlaWdodCA9IDA7ICAvKiBNYWtlIHN1cmUgd2UgcmVjYWxjdWxhdGUgdGhlIHNpemUgKi8KKyAgICB9CisgICAgaWYgKElzV2luZG93VmlzaWJsZShoV25kKSkKKyAgICAgICAgU2V0V2luZG93UG9zKCBoV25kLCAwLCAwLCAwLCAwLCAwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8CisgICAgICAgICAgICAgICAgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgfCBTV1BfRlJBTUVDSEFOR0VEICk7CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQlHZXRTdWJNZW51CQlbVVNFUi4xNTldCisgKiAgICAgICAgIEdldFN1Yk1lbnUxNiAgICAoVVNFUi4xNTkpCiAgKi8KLUhNRU5VMTYgR2V0U3ViTWVudShITUVOVTE2IGhNZW51LCBzaG9ydCBuUG9zKQorSE1FTlUxNiBHZXRTdWJNZW51MTYoIEhNRU5VMTYgaE1lbnUsIElOVDE2IG5Qb3MgKQoreworICAgIHJldHVybiBHZXRTdWJNZW51MzIoIGhNZW51LCBuUG9zICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgR2V0U3ViTWVudTMyICAgIChVU0VSMzIuMjg3KQorICovCitITUVOVTMyIEdldFN1Yk1lbnUzMiggSE1FTlUzMiBoTWVudSwgSU5UMzIgblBvcyApCiB7CiAgICAgTFBQT1BVUE1FTlUgbHBwb3A7CiAKLSAgICBkcHJpbnRmX21lbnUoc3RkZGViLCJHZXRTdWJNZW51ICglMDR4LCAlMDRYKSAhXG4iLCBoTWVudSwgblBvcyk7CiAgICAgaWYgKCEobHBwb3AgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKSByZXR1cm4gMDsKLSAgICBpZiAoKFVJTlQpblBvcyA+PSBscHBvcC0+bkl0ZW1zKSByZXR1cm4gMDsKKyAgICBpZiAoKFVJTlQzMiluUG9zID49IGxwcG9wLT5uSXRlbXMpIHJldHVybiAwOwogICAgIGlmICghKGxwcG9wLT5pdGVtc1tuUG9zXS5pdGVtX2ZsYWdzICYgTUZfUE9QVVApKSByZXR1cm4gMDsKLSAgICByZXR1cm4gKEhNRU5VMTYpbHBwb3AtPml0ZW1zW25Qb3NdLml0ZW1faWQ7CisgICAgcmV0dXJuIChITUVOVTMyKWxwcG9wLT5pdGVtc1tuUG9zXS5pdGVtX2lkOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCURyYXdNZW51QmFyCQlbVVNFUi4xNjBdCisgKiAgICAgICAgIERyYXdNZW51QmFyMTYgICAgKFVTRVIuMTYwKQogICovCi12b2lkIERyYXdNZW51QmFyKEhXTkQgaFduZCkKK3ZvaWQgRHJhd01lbnVCYXIxNiggSFdORDE2IGhXbmQgKQogewotCVdORAkJKnduZFB0cjsKLQlMUFBPUFVQTUVOVSBscHBvcDsKLQlkcHJpbnRmX21lbnUoc3RkZGViLCJEcmF3TWVudUJhciAoJTA0eClcbiIsIGhXbmQpOwotCXduZFB0ciA9IFdJTl9GaW5kV25kUHRyKGhXbmQpOwotCWlmICh3bmRQdHIgIT0gTlVMTCAmJiAod25kUHRyLT5kd1N0eWxlICYgV1NfQ0hJTEQpID09IDAgJiYgCi0JCXduZFB0ci0+d0lEbWVudSAhPSAwKSB7Ci0JCWRwcmludGZfbWVudShzdGRkZWIsIkRyYXdNZW51QmFyIHdJRG1lbnU9JTA0WCBcbiIsIAotCQkJICAgICB3bmRQdHItPndJRG1lbnUpOwotCQlscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKChITUVOVTE2KXduZFB0ci0+d0lEbWVudSk7Ci0JCWlmIChscHBvcCA9PSBOVUxMKSByZXR1cm47CisgICAgRHJhd01lbnVCYXIzMiggaFduZCApOworfQogCi0JCWxwcG9wLT5IZWlnaHQgPSAwOyAvKiBNYWtlIHN1cmUgd2UgY2FsbCBNRU5VX01lbnVCYXJDYWxjU2l6ZSAqLwotCQlTZXRXaW5kb3dQb3MoIGhXbmQsIDAsIDAsIDAsIDAsIDAsIFNXUF9OT1NJWkUgfCBTV1BfTk9NT1ZFIHwKLQkJCSAgICBTV1BfTk9BQ1RJVkFURSB8IFNXUF9OT1pPUkRFUiB8IFNXUF9GUkFNRUNIQU5HRUQgKTsKLQkgICAgfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICBEcmF3TWVudUJhcjMyICAgIChVU0VSMzIuMTYwKQorICovCitCT09MMzIgRHJhd01lbnVCYXIzMiggSFdORDMyIGhXbmQgKQoreworICAgIExQUE9QVVBNRU5VIGxwcG9wOworICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaFduZCk7CisgICAgaWYgKHduZFB0ciAmJiAhKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKSAmJiB3bmRQdHItPndJRG1lbnUpCisgICAgeworICAgICAgICBscHBvcCA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKChITUVOVTE2KXduZFB0ci0+d0lEbWVudSk7CisgICAgICAgIGlmIChscHBvcCA9PSBOVUxMKSByZXR1cm4gRkFMU0U7CisKKyAgICAgICAgbHBwb3AtPkhlaWdodCA9IDA7IC8qIE1ha2Ugc3VyZSB3ZSBjYWxsIE1FTlVfTWVudUJhckNhbGNTaXplICovCisgICAgICAgIFNldFdpbmRvd1BvcyggaFduZCwgMCwgMCwgMCwgMCwgMCwgU1dQX05PU0laRSB8IFNXUF9OT01PVkUgfAorICAgICAgICAgICAgICAgICAgICAgIFNXUF9OT0FDVElWQVRFIHwgU1dQX05PWk9SREVSIHwgU1dQX0ZSQU1FQ0hBTkdFRCApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEVuZE1lbnUgICAoVVNFUi4xODcpCisgKiAgICAgICAgICAgRW5kTWVudSAgIChVU0VSLjE4NykgKFVTRVIzMi4xNzQpCiAgKi8KIHZvaWQgRW5kTWVudSh2b2lkKQogewpAQCAtMjcwMCwxNSArMjg5OCwxNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTG9va3VwTWVudUhhbmRsZSAgIChVU0VSLjIxNykKICAqLwotSE1FTlUxNiBMb29rdXBNZW51SGFuZGxlKCBITUVOVTE2IGhtZW51LCBJTlQgaWQgKQorSE1FTlUxNiBMb29rdXBNZW51SGFuZGxlKCBITUVOVTE2IGhtZW51LCBJTlQxNiBpZCApCiB7Ci0gICAgaWYgKCFNRU5VX0ZpbmRJdGVtKCAmaG1lbnUsICZpZCwgTUZfQllDT01NQU5EICkpIHJldHVybiAwOwotICAgIGVsc2UgcmV0dXJuIGhtZW51OworICAgIEhNRU5VMzIgaG1lbnUzMiA9IGhtZW51OworICAgIElOVDMyIGlkMzIgPSBpZDsKKyAgICBpZiAoIU1FTlVfRmluZEl0ZW0oICZobWVudTMyLCAmaWQzMiwgTUZfQllDT01NQU5EICkpIHJldHVybiAwOworICAgIGVsc2UgcmV0dXJuIGhtZW51MzI7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCSAgICBMb2FkTWVudSAgICAoVVNFUi4xNTApCisgKgkgICAgTG9hZE1lbnUxNiAgICAoVVNFUi4xNTApCiAgKi8KIEhNRU5VMTYgTG9hZE1lbnUxNiggSElOU1RBTkNFMTYgaW5zdGFuY2UsIFNFR1BUUiBuYW1lICkKIHsKQEAgLTI3ODEsMTAgKzI5ODEsMTAgQEAKICAgICB9CiAgICAgb2Zmc2V0ID0gR0VUX1dPUkQocCk7CiAgICAgcCArPSBzaXplb2YoV09SRCkgKyBvZmZzZXQ7Ci0gICAgaWYgKCEoaE1lbnUgPSBDcmVhdGVNZW51KCkpKSByZXR1cm4gMDsKKyAgICBpZiAoIShoTWVudSA9IENyZWF0ZU1lbnUzMigpKSkgcmV0dXJuIDA7CiAgICAgaWYgKCFNRU5VX1BhcnNlUmVzb3VyY2UoIHAsIGhNZW51LCBGQUxTRSApKQogICAgIHsKLSAgICAgICAgRGVzdHJveU1lbnUoIGhNZW51ICk7CisgICAgICAgIERlc3Ryb3lNZW51MzIoIGhNZW51ICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gaE1lbnU7CkBAIC0yODExLDEwICszMDExLDEwIEBACiAgICAgfQogICAgIG9mZnNldCA9IEdFVF9XT1JEKHApOwogICAgIHAgKz0gc2l6ZW9mKFdPUkQpICsgb2Zmc2V0OwotICAgIGlmICghKGhNZW51ID0gQ3JlYXRlTWVudSgpKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoaE1lbnUgPSBDcmVhdGVNZW51MzIoKSkpIHJldHVybiAwOwogICAgIGlmICghTUVOVV9QYXJzZVJlc291cmNlKCBwLCBoTWVudSwgVFJVRSApKQogICAgIHsKLSAgICAgICAgRGVzdHJveU1lbnUoIGhNZW51ICk7CisgICAgICAgIERlc3Ryb3lNZW51MzIoIGhNZW51ICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KICAgICByZXR1cm4gaE1lbnU7CkBAIC0yODMyLDkgKzMwMzIsMjAgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCUlzTWVudSAgICAoVVNFUi4zNTgpCisgKgkJSXNNZW51MTYgICAgKFVTRVIuMzU4KQogICovCi1CT09MIElzTWVudSggSE1FTlUxNiBobWVudSApCitCT09MMTYgSXNNZW51MTYoIEhNRU5VMTYgaG1lbnUgKQoreworICAgIExQUE9QVVBNRU5VIG1lbnU7CisgICAgaWYgKCEobWVudSA9IChMUFBPUFVQTUVOVSkgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApKSkgcmV0dXJuIEZBTFNFOworICAgIHJldHVybiAobWVudS0+d01hZ2ljID09IE1FTlVfTUFHSUMpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJSXNNZW51MzIgICAgKFVTRVIzMi4zNDUpCisgKi8KK0JPT0wzMiBJc01lbnUzMiggSE1FTlUzMiBobWVudSApCiB7CiAgICAgTFBQT1BVUE1FTlUgbWVudTsKICAgICBpZiAoIShtZW51ID0gKExQUE9QVVBNRU5VKSBVU0VSX0hFQVBfTElOX0FERFIoIGhtZW51ICkpKSByZXR1cm4gRkFMU0U7CmRpZmYgLS1naXQgYS9jb250cm9scy9vbGRsYm94LmMgYi9jb250cm9scy9vbGRsYm94LmMKaW5kZXggNGMyNTZjOS4uMWVlZjMzYyAxMDA2NDQKLS0tIGEvY29udHJvbHMvb2xkbGJveC5jCisrKyBiL2NvbnRyb2xzL29sZGxib3guYwpAQCAtMjMsMTAgKzIzLDcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJsaXN0Ym94LmgiCi0jaW5jbHVkZSAiZG9zX2ZzLmgiCi0jaW5jbHVkZSAiZHJpdmUuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpAQCAtNjk4LDgxICs2OTUsNiBAQAogCiBMT05HIExpc3RCb3hEaXJlY3RvcnkoTFBIRUFETElTVCBscGhsLCBVSU5UIGF0dHJpYiwgTFBDU1RSIGZpbGVzcGVjKQogewotI2lmIDAKLSAgICBjaGFyIAltYXNrWzEzXTsKLSAgICBjaGFyKgl0ZW1wID0gTlVMTDsKLSAgICBjb25zdCBjaGFyKglwdHI7Ci0gICAgaW50IAlza2lwLCBjb3VudDsKLSAgICBMT05HIAlyZXQ7Ci0gICAgRE9TX0RJUkVOVCAJZW50cnk7Ci0gICAgY2hhciAqcGF0aCwgKnA7Ci0KLSAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCAiTGlzdEJveERpcmVjdG9yeTogJyVzJyAlMDR4XG4iLCBmaWxlc3BlYywgYXR0cmliKTsKLSAgICBpZiAoIWZpbGVzcGVjKSByZXR1cm4gTEJfRVJSOwotICAgIGlmICghKHB0ciA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggZmlsZXNwZWMsIEZBTFNFICkpKSByZXR1cm4gTEJfRVJSOwotICAgIHBhdGggPSB4c3RyZHVwKHB0cik7Ci0gICAgcCA9IHN0cnJjaHIoIHBhdGgsICcvJyApOwotICAgICpwKysgPSAnXDAnOwotICAgIGlmICghKHB0ciA9IERPU0ZTX1RvRG9zRkNCRm9ybWF0KCBwICkpIHx8IAotICAgICAgICAhKHRlbXAgPSBTRUdQVFJfQUxMT0MoIHNpemVvZihjaGFyKSAqIDE2ICkpICkKLSAgICB7Ci0gICAgICAgIGZyZWUoIHBhdGggKTsKLSAgICAgICAgcmV0dXJuIExCX0VSUjsKLSAgICB9Ci0KLSAgICBzdHJjcHkoIG1hc2ssIHB0ciApOwotCi0gICAgZHByaW50Zl9saXN0Ym94KHN0ZGRlYiwgIkxpc3RCb3hEaXJlY3Rvcnk6IHBhdGg9JXMgbWFzaz0lc1xuIiwgcGF0aCwgbWFzayk7Ci0KLSAgICBza2lwID0gcmV0ID0gMDsKLSAgICBhdHRyaWIgJj0gfkZBX0xBQkVMOwotICAgIHdoaWxlICgoY291bnQgPSBET1NGU19GaW5kTmV4dCggcGF0aCwgbWFzaywgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYiwgc2tpcCwgJmVudHJ5ICkpID4gMCkKLSAgICB7Ci0gICAgICAgIHNraXAgKz0gY291bnQ7Ci0gICAgICAgIGlmIChlbnRyeS5hdHRyICYgRkFfRElSRUNUT1JZKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGF0dHJpYiAmIERETF9ESVJFQ1RPUlkpICYmIHN0cmNtcChlbnRyeS5uYW1lLCAiLiAgICAgICAgICAiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzcHJpbnRmKHRlbXAsICJbJXNdIiwgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIGVudHJ5Lm5hbWUgKSApOwotICAgICAgICAgICAgICAgIEFuc2lMb3dlciggdGVtcCApOwotICAgICAgICAgICAgICAgIGlmICgocmV0ID0gTGlzdEJveEFkZFN0cmluZyhscGhsLCBTRUdQVFJfR0VUKHRlbXApKSkgPT0gTEJfRVJSKSBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlICAvKiBub3QgYSBkaXJlY3RvcnkgKi8KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCEoYXR0cmliICYgRERMX0VYQ0xVU0lWRSkgfHwKLSAgICAgICAgICAgICAgICAoKGF0dHJpYiAmIChGQV9SRE9OTFl8RkFfSElEREVOfEZBX1NZU1RFTXxGQV9BUkNISVZFKSkgPT0KLSAgICAgICAgICAgICAgICAgKGVudHJ5LmF0dHIgJiAoRkFfUkRPTkxZfEZBX0hJRERFTnxGQV9TWVNURU18RkFfQVJDSElWRSkpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdHJjcHkoIHRlbXAsIERPU0ZTX1RvRG9zRFRBRm9ybWF0KCBlbnRyeS5uYW1lICkgKTsKLSAgICAgICAgICAgICAgICBBbnNpTG93ZXIoIHRlbXAgKTsKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBkcHJpbnRmX2xpc3Rib3goc3RkZGViLCJcdG4gLSAlaSwgZmlsZSAnJXMnXG4iLCBjb3VudCwgdGVtcCk7IAotICAgIH0KLSAgICBpZiAoYXR0cmliICYgRERMX0RSSVZFUykKLSAgICB7Ci0gICAgICAgIGludCB4OwotCURXT1JEIG9sZHN0eWxlID0gbHBobC0+ZHdTdHlsZTsKLQkgICAgCi0JbHBobC0+ZHdTdHlsZSAmPSB+TEJTX1NPUlQ7Ci0gICAgICAgIHN0cmNweSggdGVtcCwgIlstYS1dIiApOwotICAgICAgICBmb3IgKHggPSAwOyB4IDwgTUFYX0RPU19EUklWRVM7IHgrKywgdGVtcFsyXSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoRFJJVkVfSXNWYWxpZCh4KSkKLSAgICAgICAgICAgICAgICBpZiAoKHJldCA9IExpc3RCb3hBZGRTdHJpbmcobHBobCwgU0VHUFRSX0dFVCh0ZW1wKSkpID09IExCX0VSUikgYnJlYWs7Ci0gICAgICAgIH0KLQlscGhsLT5kd1N0eWxlID0gb2xkc3R5bGU7Ci0gICAgfQotCi0gICAgZnJlZSggcGF0aCApOwotICAgIFNFR1BUUl9GUkVFKCB0ZW1wICk7Ci0KLSAgICByZXR1cm4gcmV0OwotI2VuZGlmCiAgICAgcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL3dpZGdldHMuYyBiL2NvbnRyb2xzL3dpZGdldHMuYwppbmRleCBhODg0NzU3Li4wZDVlMjE5IDEwMDY0NAotLS0gYS9jb250cm9scy93aWRnZXRzLmMKKysrIGIvY29udHJvbHMvd2lkZ2V0cy5jCkBAIC0xOCw4ICsxOCwxMiBAQAogCiAvKiBXaW5kb3cgcHJvY2VkdXJlcyAqLwogCitleHRlcm4gTFJFU1VMVCBFZGl0V25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CiBleHRlcm4gTFJFU1VMVCBMaXN0Qm94V25kUHJvYyggSFdORDMyIGh3bmQsIFVJTlQzMiBtc2csIFdQQVJBTTMyIHdQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUEFSQU0gbFBhcmFtICk7CitleHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1zZywgV1BBUkFNMzIgd1BhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBBUkFNIGxQYXJhbSApOwogCiAvKiBXaW4xNiBjbGFzcyBpbmZvICovCiAKQEAgLTQyLDEyICs0Niw2IEBACiAgICAgICA4LCAwLCAiQ29tYm9Cb3hXbmRQcm9jIiwgIkNvbWJvQm94IiB9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIHwgQ1NfU0FWRUJJVFMsCiAgICAgICA4LCAwLCAiQ29tYm9MQm94V25kUHJvYyIsICJDb21ib0xCb3giIH0sCi0gICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX1BBUkVOVERDIHwgQ1NfREJMQ0xLUywKLSAgICAgIHNpemVvZihEV09SRCksIDAsICJFZGl0V25kUHJvYyIsICJFZGl0IiB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywKLSAgICAgIHNpemVvZihITUVOVTMyKSwgMCwgIlBvcHVwTWVudVduZFByb2MiLCBQT1BVUE1FTlVfQ0xBU1NfTkFNRSB9LAotICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywKLSAgICAgIERMR1dJTkRPV0VYVFJBLCAwLCAiRGVmRGxnUHJvYyIsIERJQUxPR19DTEFTU19OQU1FIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUywgc2l6ZW9mKE1ESUNMSUVOVElORk8pLAogICAgICAgU1RPQ0tfTFRHUkFZX0JSVVNILCAiTURJQ2xpZW50V25kUHJvYyIsICJNRElDbGllbnQiIH0KIH07CkBAIC02MiwxMSArNjAsMTcgQEAKICAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfREJMQ0xLUyB8IENTX1ZSRURSQVcgfCBDU19IUkVEUkFXIHwgQ1NfUEFSRU5UREMsCiAgICAgICBCdXR0b25XbmRQcm9jLCAwLCBzaXplb2YoQlVUVE9OSU5GTyksIDAsIDAsIDAsIDAsIDAsICJCdXR0b24iIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgLyp8IENTX1BBUkVOVERDKi8sCisgICAgICBFZGl0V25kUHJvYywgMCwgc2l6ZW9mKHZvaWQgKiksIDAsIDAsIDAsIDAsIDAsICJFZGl0IiB9LAorICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19EQkxDTEtTIC8qfCBDU19QQVJFTlREQyovLAogICAgICAgTGlzdEJveFduZFByb2MsIDAsIHNpemVvZih2b2lkICopLCAwLCAwLCAwLCAwLCAwLCAiTGlzdEJveCIgfSwKKyAgICB7IENTX0dMT0JBTENMQVNTIHwgQ1NfU0FWRUJJVFMsIFBvcHVwTWVudVduZFByb2MsCisgICAgICAwLCBzaXplb2YoSE1FTlUzMiksIDAsIDAsIDAsIDAsIDAsIFBPUFVQTUVOVV9DTEFTU19OQU1FIH0sCiAgICAgeyBDU19HTE9CQUxDTEFTUyB8IENTX0RCTENMS1MgfCBDU19WUkVEUkFXIHwgQ1NfSFJFRFJBVyB8IENTX1BBUkVOVERDLAogICAgICAgU2Nyb2xsQmFyV25kUHJvYywgMCwgc2l6ZW9mKFNDUk9MTEJBUl9JTkZPKSwgMCwgMCwgMCwgMCwgMCwgIlNjcm9sbEJhciJ9LAogICAgIHsgQ1NfR0xPQkFMQ0xBU1MsIERlc2t0b3BXbmRQcm9jLCAwLCBzaXplb2YoREVTS1RPUElORk8pLAotICAgICAgMCwgMCwgMCwgMCwgMCwgREVTS1RPUF9DTEFTU19OQU1FIH0KKyAgICAgIDAsIDAsIDAsIDAsIDAsIERFU0tUT1BfQ0xBU1NfTkFNRSB9LAorICAgIHsgQ1NfR0xPQkFMQ0xBU1MgfCBDU19TQVZFQklUUywgRGVmRGxnUHJvYzMyQSwgMCwgRExHV0lORE9XRVhUUkEsCisgICAgICAwLCAwLCAwLCAwLCAwLCBESUFMT0dfQ0xBU1NfTkFNRSB9CiB9OwogCiAjZGVmaW5lIE5CX0JVSUxUSU5fQ0xBU1NFUzMyIFwKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL01ha2VmaWxlLmluIGIvZGVidWdnZXIvTWFrZWZpbGUuaW4KaW5kZXggNmEzNjM0Yy4uM2Y1ZDQ5ZCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvTWFrZWZpbGUuaW4KKysrIGIvZGVidWdnZXIvTWFrZWZpbGUuaW4KQEAgLTgsMTQgKzgsMTggQEAKIENfU1JDUyA9IFwKIAlicmVhay5jIFwKIAlkYl9kaXNhc20uYyBcCisJZGlzcGxheS5jIFwKIAllZGl0bGluZS5jIFwKKwlleHByLmMgXAogCWhhc2guYyBcCiAJaW5mby5jIFwKIAltZW1vcnkuYyBcCiAJbXNjLmMJXAogCXJlZ2lzdGVycy5jIFwKKwlzb3VyY2UuYyBcCiAJc3RhYnMuYwlcCi0Jc3RhY2suYworCXN0YWNrLmMgXAorCXR5cGVzLmMKIAogR0VOX0NfU1JDUyA9IFwKIAl5LnRhYi5jIFwKQEAgLTIzLDYgKzI3LDEyIEBACiAKIGFsbDogJChNT0RVTEUpLm8KIAorIworIyBUaGlzIGlzIGEgc3BlY2lhbCB0ZXN0IHByb2dyYW0gdGhhdCBoZWxwcyBkZWJ1ZyB0aGUgaW50ZXJuYWwgZGVidWdnZXIuCisjCitkZWJ1ZzogJChNT0RVTEUpLm8gZGJnbWFpbi5vIC4uL21pc2MveG1hbGxvYy5vCisJJChDQykgLW8gZGVidWcgJChNT0RVTEUpLm8gZGJnbWFpbi5vIC4uL21pc2MveG1hbGxvYy5vCisKIEBNQUtFX1JVTEVTQAogCiB5LnRhYi5jIHkudGFiLmg6IGRiZy55CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9SRUFETUUgYi9kZWJ1Z2dlci9SRUFETUUKaW5kZXggNTcxNTMzOS4uMDJjYWQ5YiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvUkVBRE1FCisrKyBiL2RlYnVnZ2VyL1JFQURNRQpAQCAtMSwxNyArMSw0MjMgQEAKLQogCVRoaXMgaXMgdGhlIGNvcmUgb2YgdGhlIFdpbmUgZGVidWdnZXIuICBNYW55IHBpZWNlcyBoYXZlIGJlZW4KLXNoYW1lbGVzc2x5IHN0b2xlbiAtIHRoZSByZXZlcnNlIGFzc2VtYmVyIHdhcyBzdG9sZW4gZnJvbSBnZGIgbW9yZSBvcgorc2hhbWVsZXNzbHkgc3RvbGVuIC0gdGhlIHJldmVyc2UgYXNzZW1iZXIgd2FzIHN0b2xlbiBmcm9tIE1hY2ggbW9yZSBvcgogbGVzcyBpbnRhY3QuICBJdCB0dXJucyBvdXQgdGhhdCB0aGVyZSBhcmUgdHdvIHZhcmlhYmxlcyB0aGF0IGFyZSBzZXQKIGRpZmZlcmVudGx5IGlmIHlvdSBhcmUgcmV2ZXJzZSBhc3NlbWJsaW5nIDE2IGJpdCBjb2RlLCBhbmQgb24gdGhlCi13aG9sZSBpdCBzZWVtcyB0byB3b3JrLiAgVGhlcmUgbWF5IGJlIGJ1Z3MgZm9yIGFsbCBJIGtub3cuCit3aG9sZSBpdCBzZWVtcyB0byB3b3JrLgogCi0JQXMgZmFyIGFzIG5vbi1saW51eCBzeXN0ZW1zIGFyZSBjb25jZXJuZWQsIEkgc2ltcGx5IHJpcHBlZCBvZmYKLXRoZSBsaW51eCBjb25maWd1cmF0aW9uIGZpbGVzIGZyb20gZ2RiLiAgT3RoZXIgc3lzdGVtcyBtYXkgYmUgY2xvc2UKLWVub3VnaCBmb3IgdGhlc2UgdG8gd29yayBwcm9wZXJseSwgYnV0IHNvbWUgdHdlYWtpbmcgbWF5IGJlIHJlcXVpcmVkLgorTkVXUzoKIAotCUkgYXBvbG9naXplIGZvciB0aGUgbm9uLXBvcnRhYmlsaXR5IG9mIHRoaXMsIGJ1dCBJIHdyb3RlIHRoZQotd2hvbGUgdGhpbmcgaW4gYWJvdXQgNCBob3VycywgbW9zdCBvZiB0aGUgdGltZSBzcGVudCBkZWJ1Z2dpbmcgYQotc3R1cGlkIG1pc3Rha2UgaW4gdGhlIHBhcnNlci4KKwlUaGUgaW50ZXJuYWwgZGVidWdnZXIgaGFzICp0b25zKiBtb3JlIGNhcGFiaWxpdHkgdGhhbiBpdCBkaWQgYmVmb3JlLgorSSBoYXZlIGVuY2xvc2VkIHNvbWUgZXhhbXBsZXMgdGhhdCBzaG93IHVzYWdlIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorTmV3IGZlYXR1cmVzIGluY2x1ZGU6CiAKLS1FcmljCisJMSkgQWJpbGl0eSBvZiBkZWJ1Z2dlciB0byByZWFkIGRlYnVnIGluZm9ybWF0aW9uIGZyb20gd2luZSBleGVjdXRhYmxlCisqYW5kKiBmcm9tIFdpbjMyIGV4ZWN1dGFibGVzLiAgTG9jYWwgdmFyaWFibGUgYW5kIGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIGlzCithbHNvIHJlYWQgYW5kIHByb2Nlc3NlZC4KIAorCTIpIFRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBpcyBjYXBhYmxlIG9mICdzdGVwcGluZycgdG8gdGhlIG5leHQKK2xpbmUgbnVtYmVyLCBqdXN0IGxpa2UgZ2RiLiAgRXhhbXBsZXMgb2YgdGhlIGNvbW1hbmRzIGFyZToKKworCXN0ZXAKKwlzdGVwaQorCXNpCisJc3RlcCAzCisJc2kgNQorCW5leHQKKwluZXh0aQorCWNvbnQgNAorCWZpbmlzaAorCitBbGwgb2YgdGhlc2Ugc2hvdWxkIGJlIGV4YWN0bHkgbGlrZSBob3cgZ2RiIGRvZXMgdGhpbmdzLgorCisJMykgVGhlIGludGVybmFsIGRlYnVnZ2VyIG5vdyBoYXMgYSBzZW5zZSBvZiB3aGF0IHNvdXJjZSBmaWxlIGFuZCBsaW5lCitudW1iZXIgYSBnaXZlbiBQQyBpcyBhdC4gIE5ldyBjb21tYW5kcyB0byBzdXBwb3J0IHRoaXMgYXJlIGp1c3QgbGlrZSBnZGIsCithbmQgaW5jbHVkZToKKworCWxpc3QKKwlkaXIKKwlzaG93IGRpcgorCit0aGVyZSBhcmUgYSB2YXJpZXR5IG9mIGZvcm1hdHMgb2YgYXJndW1lbnRzIGZvciB0aGUgbGlzdCBjb21tYW5kLiAgQWxsCitwZXJtdXRhdGlvbnMgc3VwcG9ydGVkIGJ5IGdkYiBzaG91bGQgYWxzbyBiZSBzdXBwb3J0ZWQuCisKKwk0KSBUaGUgaW50ZXJuYWwgZGVidWdnZXIga25vd3MgYWJvdXQgZGF0YXR5cGVzIG9mIHZhcmlvdXMgb2JqZWN0cywKK2ZvciBib3RoIFdpbjMyICphbmQqIHRoZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaW4gdGhlIHdpbmUgZXhlY3V0YWJsZSBpdHNlbGYuCitJIGhhdmUgZW5jbG9zZWQgYW4gZXhhbXBsZSBvZiBob3cgdGhpcyB3b3JrcyBhdCB0aGUgZW5kLgorCisJNSkgVGhlcmUgYXJlIG1vcmUgd2F5cyB0aGUgJ2InIGNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gc2V0IGJyZWFrcG9pbnRzLgorRXhhbXBsZXMgYXJlOgorCisJYiAqMHg4MTkwMDAwCisJYiAxMTAwCisJYiBVc2FnZQorCWIKKworSSBkb24ndCB0aGluayB0aGlzIGNvdmVycyBhbGwgb2YgdGhlIHBlcm11dGF0aW9ucyB0aGF0IGdkYiBhY2NlcHRzICh0aGlzIHNob3VsZAorYmUgY2xlYW5lZCB1cCBzb21lZGF5IHNvIHRoYXQgYWxsIHBvc3NpYmlsaXRpZXMgYXJlIGFjY2VwdGFibGUpLgorCisJNikgIFRoZSAncHJpbnQnIGFuZCAneCcgY29tbWFuZHMgc2hvdWxkIGJlaGF2ZSBtb3JlIG9yIGxlc3MgZXhhY3RseQorYXMgdGhleSBkbyB1bmRlciBnZGIuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHRoZSB3YXkgdGhlIGRhdGEgaXMgcHJlc2VudGVkCit3aWxsIGJlIHNsaWdodGx5IGRpZmZlcmVudCwgYnV0IHRoZSBjb250ZW50IHNob3VsZCBiZSBmdW5kYW1lbnRhbGx5IHRoZSBzYW1lLgorCisJNykgVGhlIGludGVybmFsIGRlYnVnZ2VyIG5vdyBzdXBwb3J0cyBjb25kaXRpb25hbCBicmVha3BvaW50cywgYW5kCithdXRvbWF0aWMgZGlzcGxheSBleHByZXNzaW9ucy4gIEFuIGV4YW1wbGUgaXMgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUuICBUaGUKK3N5bnRheCBhbmQgdXNhZ2Ugc2hvdWxkIGJlIGlkZW50aWNhbCB0byB0aGF0IG9mIGdkYi4KKworTk9URVM6CisKKwlJZiBpdCB3ZXJlbid0IGZvciB0aGUgZmFjdCB0aGF0IGdkYiBkb2Vzbid0IGdyb2sgdGhlIFdpbjMyIGRlYnVnCitpbmZvcm1hdGlvbiwgeW91IGNvdWxkIGp1c3QgdXNlIGdkYi4gIFRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBzaG91bGQgYmUgYWJsZQordG8gcmVhZCBhbmQgdXNlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYm90aCBXaW4zMiBhbmQgYWxzbyBmb3IgdGhlCitXaW5lIGV4ZWN1dGFibGUsIG1ha2luZyBpdCBwb3NzaWJsZSB0byBkZWJ1ZyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHR3bwordG9nZXRoZXIgYXMgaWYgaXQgd2VyZSBvbmUgbGFyZ2UgKHZlcnkgbGFyZ2UpIGVudGl0eS4KKworTElNSVRBVElPTlMgQU5EIERJRkZFUkVOQ0VTIEZST00gR0RCOgorCisJWW91IGNhbm5vdCB1c2UgdHlwZSBjYXN0cyBpbiBleHByZXNzaW9ucyB0aGF0IHlvdSBnaXZlIHRvIHRoZQorZGVidWdnZXIuICBUaGUgaGFyZGVzdCBwYXJ0IGFib3V0IGFkZGluZyBzdXBwb3J0IGZvciB0aGlzIGlzIGZpeGluZwordGhlIHBhcnNlci9sZXhlciB0byBrbm93IHdoZW4gaXQgaXMgaGFuZGxpbmcgYSB0eXBlIGNhc3QsIGFuZCB3aGVuIGl0CitpcyBoYW5kbGluZyBhbnkgb3RoZXIgdHlwZSBvZiBwYXJlbnRoZXNpemVkIGV4cHJlc3Npb24uICBXaXRoIGxleGVyCitzdGF0ZXMsIGl0IG1heSBiZSBwb3NzaWJsZSB0byBrZWVwIHRyYWNrIG9mIHdoYXQgd2Ugd291bGQgZXhwZWN0IGF0CithbnkgZ2l2ZW4gbW9tZW50LCBidXQgaXQgd291bGQgYmUgdGVkaW91cyB0byBnbyB0aHJvdWdoIGFuZCBtYWtlIHN1cmUKK3RoYXQgdGhlIHN0YXRlIGlzIHNldCB1cCBjb3JyZWN0bHkgZm9yIGFsbCBvZiB0aGUgZGlmZmVyZW50IG9wZXJhdG9ycworYW5kIGNoYXJhY3RlcnMgdGhhdCB3ZSBhY2NlcHQsIGFuZCBJIGFtIG5vdCB5ZXQgY29udmluY2VkIHRoYXQgdGhpcyB3b3VsZAorZXZlbiB3b3JrLgorCisJWW91IGNhbm5vdCBzZXQgYSBicmVha3BvaW50IGJ5IGZpbGUgYW5kIGxpbmUgbnVtYmVyIGFzIHlvdSBjYW4KK3dpdGggZ2RiLiAgQWRkaW5nIHN1cHBvcnQgZm9yIHRoaXMgd291bGRuJ3QgYmUgYWxsIHRoYXQgdG91Z2gsIEkgZ3Vlc3MsIGJ1dAoraXQgd291bGQgYmUgYSBudWlzYW5jZS4gICBZb3UgY2FuIHNldCBhIGJyZWFrcG9pbnQgZ2l2ZW4gYSBmdW5jdGlvbiBhbmQKK2xpbmUgbnVtYmVyLCBob3dldmVyLiAgQW4gZXhhbXBsZSB3b3VsZCBiZSAnYiBtYWluOjI5OTMnLiAgSXQgdHVybnMgb3V0Cit0aGF0IHRoZSB3YXkgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlcyBhcmUgYXJyYW5nZWQgaXQgaXMgYSB3aG9sZSBsb3QKK2Vhc2llciB0byBkbyB0aGluZ3MgaW4gdGhpcyB3YXkgdGhhbiBpdCB3b3VsZCBiZSB0byB0cnkgYW5kIGdldCB0aGUKK3NvdXJjZTpsaW5lIHR5cGUgb2YgYnJlYWtwb2ludCB3b3JraW5nLCBidXQgaXQgd291bGQgcHJvYmFibHkgYmUgd29ydGggaXQKK3RvIHRyeS4KKworCUdldHRpbmcgc3RhY2sgdHJhY2VzIHRocm91Z2ggV2luZSBpdHNlbGYgY2FuIGJlIGEgYml0IHRyaWNreS4KK1RoaXMgaXMgYmVjYXVzZSBieSBkZWZhdWx0IHRoZSB0aGluZyBpcyBidWlsdCB3aXRoIG9wdGltaXphdGlvbgorZW5hYmxlZCwgYW5kIGFzIGEgcmVzdWx0IHNvbWV0aW1lcyBmdW5jdGlvbnMgZG9uJ3QgZ2V0IGZyYW1lcywgYW5kCitsb3RzIG9mIHZhcmlhYmxlcyBhcmUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXJzLiAgWW91IGNhbiB0dXJuIG9mZgorb3B0aW1pemF0aW9uIGZvciBhIGZldyBrZXkgc291cmNlIGZpbGVzIGlmIGl0IHdpbGwgaGVscCB5b3UuCisKKwlNZW1vcnkgY29uc3VtcHRpb24gaXMgZ2V0dGluZyB0byBiZSBhIHJlYWwgcHJvYmxlbS4gIEkgdGhpbmsgMzJNYiBpcworbm8gbG9uZ2VyIHN1ZmZpY2llbnQgdG8gZGVidWcgd2luZSAtIDQ4IG9yIDY0IGlzIHByb2JhYmx5IGEgd2hvbGUgbG90IGJldHRlci4KK1VuZm9ydHVuYXRlbHkgSSBjYW5ub3Qgc2h1dCBkb3duIFggdG8gc2F2ZSBtZW1vcnkgOi0pLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitFWEFNUExFUzoKKworCUhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgSSB0cmFja2VkIGRvd24gYSBidWcgaW4gV2luZS4gIFRoZSBwcm9ncmFtCitpcyBzb21ldGhpbmcgdGhhdCBqdXN0IG1hcHMgYW5kIGR1bXBzIHRoZSBjb250ZW50cyBvZiBhIFdpbjMyIGV4ZWN1dGFibGUuCitJdCB3YXMgZHlpbmcgZm9yIHNvbWUgcmVhc29uLgorCitTdGFydCB0aGUgZmlyc3QgdGltZSB0aHJvdWdoLgorCitiYXNoJCBscyAtbCBkdW1wZXhlLmV4ZSAKKy1ydy1ydy1yLS0gICAxIGVyaWMgICAgIGRldmVsICAgICAgMTY4NDQ4IEphbiAgNCAxMzo1MSBkdW1wZXhlLmV4ZQorYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCitXYXJuaW5nOiBpbnZhbGlkIGRpciAnZTpcdGVzdCcgaW4gcGF0aCwgZGVsZXRpbmcgaXQuCitXaW4zMiB0YXNrICdXMzJTWFhYWCc6IEJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwCitMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhwbS5zby40LjYuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlNNLnNvLjYuMC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWGV4dC5zby42LjAuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlgxMS5zby42LjAuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJjLnNvLjUuMi4xOC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9sZC1saW51eC5zby4xLi4uCitMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KK1N0b3BwZWQgb24gYnJlYWtwb2ludCAxIGF0IDB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCkKK0luIDMyIGJpdCBtb2RlLgorKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCisweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApOiAgbW92bAklZnM6MCwlZWF4CitXaW5lLWRiZz5iIER1bXBGaWxlCitCcmVha3BvaW50IDIgYXQgMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pCitXaW5lLWRiZz5jCitEdW1wIEZpbGU6IC4vZHVtcGV4ZS5leGUKK1N0b3BwZWQgb24gYnJlYWtwb2ludCAyIGF0IDB4MDgxYTAwNzggKER1bXBGaWxlKzB4OSBbZHVtcGV4ZS5jOjI3MjNdKQorRW50ZXIgcGF0aCB0byBmaWxlIGR1bXBleGUuYzogLi4vZGUKKzI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOworMHgwODFhMDA3OCAoRHVtcEZpbGUrMHg5IFtkdW1wZXhlLmM6MjcyM10pOiAgbW92bAkkMHgwLDB4ZmZmZmZmZjQoJWVicCkKK1dpbmUtZGJnPmxpc3QKKzI3MjMJCUhBTkRMRQkJCSAgaEZpbGUgPSBOVUxMOworMjcyNAkJSEFORExFCQkJICBoTWFwICA9IE5VTEw7CisyNzI1CQlQU1RSCQkJICBscE1hcCA9IE5VTEw7CisyNzI2CQlEV09SRAkJCSAgZHdGaWxlU2l6ZSAgICAgPSAwOworMjcyNwkJRFdPUkQJCQkgIGR3RmlsZVNpemVIaWdoID0gMDsKKzI3MjgJCisyNzI5CQlQSU1BR0VfRE9TX0hFQURFUgkgIGxwSW1hZ2VET1MgID0gTlVMTDsKKzI3MzAJCVBJTUFHRV9GSUxFX0hFQURFUgkgIGxwSW1hZ2VGaWxlID0gTlVMTDsKKzI3MzEJCVBJTUFHRV9OVF9IRUFERVJTCSAgbHBJbWFnZU5UICAgPSBOVUxMOworMjczMgkKKzI3MzMJCS8qCitXaW5lLWRiZz5uIDEwCisyNzQ3CQlkd0ZpbGVTaXplID0gR2V0RmlsZVNpemUoaEZpbGUsICZkd0ZpbGVTaXplSGlnaCk7CisweDA4MWEwMGVhIChEdW1wRmlsZSsweDdiIFtkdW1wZXhlLmM6Mjc0N10pOiAgbGVhbAkweGZmZmZmZmYwKCVlYnApLCVlYXgKK1dpbmUtZGJnPm4KKzI3NDkJCSAgICAmJiAoR2V0TGFzdEVycm9yKCkgIT0gTk9fRVJST1IpICkNCisweDA4MWEwMGZiIChEdW1wRmlsZSsweDhjIFtkdW1wZXhlLmM6Mjc0OV0pOiAgY21wbAkkLTEsMHhmZmZmZmZlOCglZWJwKQorV2luZS1kYmc+eC9kIGR3RmlsZVNpemUKK3gvZCBkd0ZpbGVTaXplDQorIDE2ODQ0OAorV2luZS1kYmc+bgorMjc1OAkJCQkJIFBBR0VfUkVBRE9OTFksIDAsIDAsIChMUFNUUikgTlVMTCk7CisweDA4MWEwMTI0IChEdW1wRmlsZSsweGI1IFtkdW1wZXhlLmM6Mjc1OF0pOiAgcHVzaGwJJDB4MAorV2luZS1kYmc+bGlzdCAyNzUwCitsaXN0IDI3NTANCisyNzUwCQl7CisyNzUxCQkJRmF0YWwoIkNhbm5vdCBnZXQgc2l6ZSBvZiBmaWxlICVzIiwgbHBGaWxlTmFtZSk7CisyNzUyCQl9CisyNzUzCQkKKzI3NTQJCS8qCisyNzU1CQkgKiBtYXAgdGhlIGZpbGUKKzI3NTYJCSAqLworMjc1NwkJaE1hcCA9IENyZWF0ZUZpbGVNYXBwaW5nKGhGaWxlLCAoTFBTRUNVUklUWV9BVFRSSUJVVEVTKSBOVUxMLAorMjc1OAkJCQkJIFBBR0VfUkVBRE9OTFksIDAsIDAsIChMUFNUUikgTlVMTCk7CisyNzU5CQlpZiggaE1hcCA9PSBOVUxMICkKKzI3NjAJCXsKK1dpbmUtZGJnPm4KKzI3NTkJCWlmKCBoTWFwID09IE5VTEwgKQorMHgwODFhMDEzYiAoRHVtcEZpbGUrMHhjYyBbZHVtcGV4ZS5jOjI3NTldKTogIGNtcGwJJDAsMHhmZmZmZmZmYyglZWJwKQorV2luZS1kYmc+eCBoTWFwCisgMDhlNDhjMzAKK1dpbmUtZGJnPm4KKzI3NjcJCWxwTWFwID0gKExQU1RSKSBNYXBWaWV3T2ZGaWxlKGhNYXAsIEZJTEVfTUFQX1JFQUQsIDAsIDAsIDApOworMHgwODFhMDE1NiAoRHVtcEZpbGUrMHhlNyBbZHVtcGV4ZS5jOjI3NjddKTogIHB1c2hsCSQweDAKK1dpbmUtZGJnPm4KKzI3NjgJCWlmKCBscE1hcCA9PSBOVUxMICkKKzB4MDgxYTAxNmIgKER1bXBGaWxlKzB4ZmMgW2R1bXBleGUuYzoyNzY4XSk6ICBjbXBsCSQwLDB4ZmZmZmZmZTAoJWVicCkKK1dpbmUtZGJnPnByaW50IGxwTWFwCisweDQxNGM1ZjQwCitXaW5lLWRiZz54IGxwTWFwCisgNDAwMDcwMDAKK1dpbmUtZGJnPiB4LzEweCAweDQwMDA3MDAwCisgeC8xMHggMHg0MDAwNzAwMA0KKzB4NDAwMDcwMDAgKH9LRVJORUwzMl9OVUxMX1RIVU5LX0RBVEErMHgzN2U0ZmU3NCk6ICoqKiBJbnZhbGlkIGFkZHJlc3MgMHg0MDAwNzAwMCAof0tFUk5FTDMyX05VTExfVEhVTktfREFUQSsweDM3ZTRmZTc0KQorV2luZS1kYmc+cXVpdAorJAorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUaGUgZmlyc3QgdGltZSB0aHJvdWdoLCB3ZSBmaW5kIHRoYXQgTWFwVmlld09mRmlsZSBpc24ndCBtYXBwaW5nIHRoZSBmaWxlCitjb3JyZWN0bHkgaW50byB0aGUgdmlydHVhbCBhZGRyZXNzIHNwYWNlLiAgVHJ5IHJ1bm5pbmcgYWdhaW4sIGFuZCBzdGVwIGludG8KK01hcFZpZXdPZkZpbGUgdG8gZmlndXJlIG91dCB3aGF0IHdlbnQgd3JvbmcuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworYmFzaCQgLi93aW5lIC1kZWJ1ZyAnLi9kdW1wZXhlLmV4ZSAtc3ltYm9sIC4vZHVtcGV4ZS5leGUnCitXYXJuaW5nOiBpbnZhbGlkIGRpciAnZTpcdGVzdCcgaW4gcGF0aCwgZGVsZXRpbmcgaXQuCitXaW4zMiB0YXNrICdXMzJTWFhYWCc6IEJyZWFrcG9pbnQgMSBhdCAweDA4MWEzNDUwCitMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAuL3dpbmUuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlhwbS5zby40LjYuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlNNLnNvLjYuMC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliSUNFLnNvLjYuMC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL3Vzci9YMTFSNi9saWIvbGliWGV4dC5zby42LjAuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC91c3IvWDExUjYvbGliL2xpYlgxMS5zby42LjAuLi4KK0xvYWRpbmcgc3ltYm9scyBmcm9tIEVMRiBmaWxlIC9saWIvbGlibS5zby41LjAuNS4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9saWJjLnNvLjUuMi4xOC4uLgorTG9hZGluZyBzeW1ib2xzIGZyb20gRUxGIGZpbGUgL2xpYi9sZC1saW51eC5zby4xLi4uCitMb2FkaW5nIHN5bWJvbHMgZnJvbSBXaW4zMiBmaWxlIC4vZHVtcGV4ZS5leGUuLi4KK1N0b3BwZWQgb24gYnJlYWtwb2ludCAxIGF0IDB4MDgxYTM0NTAgKF9tYWluQ1JUU3RhcnR1cCkKK0luIDMyIGJpdCBtb2RlLgorKioqIEludmFsaWQgYWRkcmVzcyAweDQxNGM1ZmY4ICh/S0VSTkVMMzJfTlVMTF9USFVOS19EQVRBKzB4MzkzMGVlNmMpCisweDA4MWEzNDUwIChfbWFpbkNSVFN0YXJ0dXApOiAgbW92bAklZnM6MCwlZWF4CitXaW5lLWRiZz5iIER1bXBGaWxlOjI3NjcKK0JyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCitXaW5lLWRiZz5jCitEdW1wIEZpbGU6IC4vZHVtcGV4ZS5leGUNCitTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMiBhdCAweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pCitFbnRlciBwYXRoIHRvIGZpbGUgZHVtcGV4ZS5jOiAuLi9kZQorMjc2NwkJbHBNYXAgPSAoTFBTVFIpIE1hcFZpZXdPZkZpbGUoaE1hcCwgRklMRV9NQVBfUkVBRCwgMCwgMCwgMCk7CisweDA4MWEwMTU2IChEdW1wRmlsZSsweGU3IFtkdW1wZXhlLmM6Mjc2N10pOiAgcHVzaGwJJDB4MAorV2luZS1kYmc+c3RlcAorMzkwCTAzODUgc3RkY2FsbCBNYXBWaWV3T2ZGaWxlKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgTWFwVmlld09mRmlsZQorMHgwODBkNzkzYyAoS0VSTkVMMzJfMzg1IFtrZXJuZWwzMi5zcGVjOjM5MF0pOiAgcHVzaGwJJWVicAorV2luZS1kYmc+c3RlcAorMjIzCSAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOworMHgwODBjODNkYyAoUkVMQVlfRGVidWdDYWxsRnJvbTMyKzB4YyBbcmVsYXkuYzoyMjNdKTogIGNtcHcJJDAsMHg2NDRhCitXaW5lLWRiZz4KKzI0NAl9CisweDA4MGM4NDhlIChSRUxBWV9EZWJ1Z0NhbGxGcm9tMzIrMHhiZSBbcmVsYXkuYzoyNDRdKTogIGxlYWwJMHhmZmZmZmZmNCglZWJwKSwlZXNwCitXaW5lLWRiZz4KKzEwMwkgICAgcmV0dXJuIE1hcFZpZXdPZkZpbGVFeChoYW5kbGUsYWNjZXNzLG9mZmhpLG9mZmxvLHNpemUsMCk7CisweDA4MDkxMWE0IChNYXBWaWV3T2ZGaWxlKzB4MTQgW2ZpbGUuYzoxMDNdKTogIHB1c2hsCSQweDAKK1dpbmUtZGJnPgorMTEzCSAgICBGSUxFTUFQX09CSkVDVCAqZm1hcCA9IChGSUxFTUFQX09CSkVDVCopaGFuZGxlOworMHgwODA5MTFjZiAoTWFwVmlld09mRmlsZUV4KzB4ZiBbZmlsZS5jOjExM10pOiAgbW92bAkweDgoJWVicCksJWVzaQorV2luZS1kYmc+bgorMTE1CSAgICBpZiAoIXNpemUpIHNpemUgPSBmbWFwLT5zaXplOworMHgwODA5MTFkMiAoTWFwVmlld09mRmlsZUV4KzB4MTIgW2ZpbGUuYzoxMTVdKTogIHRlc3RsCSVlYngsJWVieAorV2luZS1kYmc+bGlzdAorbGlzdA0KKzExNQkgICAgaWYgKCFzaXplKSBzaXplID0gZm1hcC0+c2l6ZTsKKzExNgkgICAgaWYgKCFzaXplKSBzaXplID0gMTsKKzExNwkgICAgcmV0dXJuIG1tYXAgKChjYWRkcl90KXN0LCBzaXplLCBmbWFwLT5wcm90LCAKKzExOAkgICAgICAgICAgICAgICAgIE1BUF9BTk9OfE1BUF9QUklWQVRFLCAKKzExOQkJCSBGSUxFX0dldFVuaXhIYW5kbGUoZm1hcC0+aGZpbGUpLAorMTIwCQkJIG9mZmxvKTsKKzEyMQl9CisxMjIJCisxMjMJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisxMjQJICogICAgICAgICAgIFVubWFwVmlld09mRmlsZSAgICAgICAgICAgICAgICAgIChLRVJORUwzMi4zODUpCisxMjUJICovCitXaW5lLWRiZz54IHNpemUKKyAwMDAwMDAwMAorV2luZS1kYmc+bgorMTE2CSAgICBpZiAoIXNpemUpIHNpemUgPSAxOworMHgwODA5MTFkOSAoTWFwVmlld09mRmlsZUV4KzB4MTkgW2ZpbGUuYzoxMTZdKTogIHRlc3RsCSVlYngsJWVieAorV2luZS1kYmc+eCBzaXplCisgMDAwMDAwMDAKK1dpbmUtZGJnPm4KKzExNwkgICAgcmV0dXJuIG1tYXAgKChjYWRkcl90KXN0LCBzaXplLCBmbWFwLT5wcm90LCAKKzB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSk6ICBwdXNobAklZWF4CitXaW5lLWRiZz54IHNpemUKKyAwMDAwMDAwMAorV2luZS1kYmc+aW5mbyBsb2NhbAorTWFwVmlld09mRmlsZUV4OmhhbmRsZSA9PSAweDA4ZTQ4YzkwCitNYXBWaWV3T2ZGaWxlRXg6YWNjZXNzID09IDB4MDAwMDAwMDQKK01hcFZpZXdPZkZpbGVFeDpvZmZoaSA9PSAweDAwMDAwMDAwCitNYXBWaWV3T2ZGaWxlRXg6b2ZmbG8gPT0gMHgwMDAwMDAwMAorTWFwVmlld09mRmlsZUV4OnNpemUgPT0gMHgwMDAwMDAwMAorTWFwVmlld09mRmlsZUV4OnN0ID09IDB4MDAwMDAwMDAKK01hcFZpZXdPZkZpbGVFeDpvZmZsbyBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWF4IAorTWFwVmlld09mRmlsZUV4OnNpemUgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVieCAKK01hcFZpZXdPZkZpbGVFeDpzdCBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkZWRpIAorTWFwVmlld09mRmlsZUV4OmZtYXAgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJGVzaSAKK1dpbmUtZGJnPnByaW50ICRlYngKKzB4MDAwMQorV2luZS1kYmc+YnQKK2J0DQorQmFja3RyYWNlOgorPT4wIDB4MDgwOTExZTIgKE1hcFZpZXdPZkZpbGVFeCsweDIyIFtmaWxlLmM6MTE3XSkKKyAgMSAweDA4MDkxMWIwIChNYXBWaWV3T2ZGaWxlKzB4MjAoaGFuZGxlPTB4OGU0OGM5MCwgYWNjZXNzPTB4NCwgb2ZmaGk9MHgwLCBvZmZsbz0weDAsIHNpemU9MHgwKSBbZmlsZS5jOjEwNF0pCisgIDIgMHgwODEwNGFiNSAoQ2FsbEZyb20zMl9zdGRjYWxsXzUrMHgyNSBbY2FsbGZyb20zMi5zXSkKKyAgMyAweDA4MWEwMTY4IChEdW1wRmlsZSsweGY5KGxwRmlsZU5hbWU9MHg0MTRjNjFlZCkgW2R1bXBleGUuYzoyNzY3XSkKKyAgNCAweDA4MWEwYzM1IChtYWluKzB4NDEwKGFyZ2M9MHgzLCBhcmd2PTB4NDE0YzYxY2MpIFtkdW1wZXhlLmM6MzA3OF0pCisgIDUgMHgwODFhMzUxNCAoX21haW5DUlRTdGFydHVwKzB4YzQpCisgIDYgMHgwODEwNTQ5ZiAoQ29kZV9TdGFydCsweDEzIFtjYWxsdG8zMi5zXSkKKyAgNyAweDA4MDJmZGFjIChUQVNLX0NhbGxUb1N0YXJ0KzB4OGMgW3Rhc2suYzozNzNdKQorCitXaW5lLWRiZz4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorTm90aWNlIHRoYXQgeW91IGNhbiBzdGVwIHRocm91Z2ggdGhlIHRodW5rcyBpbnRvIG91ciBvd24gdHJhbnNmZXIKK3JvdXRpbmVzLiAgIFlvdSB3aWxsIG5vdGljZSB0aGF0IHRoZSBzb3VyY2UgbGluZSBkaXNwbGF5cyBhcyBzb21ldGhpbmcKK2xpa2U6CisKKzM5MAkwMzg1IHN0ZGNhbGwgTWFwVmlld09mRmlsZShsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpIE1hcFZpZXdPZkZpbGUKKworVGhpcyBpcyBqdXN0IHRoZSBzb3VyY2UgbGluZSBmcm9tIHRoZSBzcGVjIGZpbGUgdGhhdCBjYXVzZWQgdGhlIHRyYW5zZmVyCityb3V0aW5lIHRvIGJlIGdlbmVyYXRlZC4gIEZyb20gdGhpcyB5b3UgY2FuIHN0ZXAgYWdhaW4sIGFuZCB5b3Ugc3RlcAoraW50byB0aGUgcmVsYXkgbG9nZ2luZyBjb2RlIC0ga2VlcCBzdGVwcGluZyBhbmQgeW91IGV2ZW50dWFsbHkgc3RlcCBpbnRvCit0aGUgYWN0dWFsIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgZGlydHkgd29yay4KKworCUF0IHRoaXMgcG9pbnQgYW4gZXhhbWluYXRpb24gb2YgdGhlIHNvdXJjZSB0byB0aGUgV2luMzIgcHJvZ3JhbQorYW5kIGFuIGV4YW1pbmF0aW9uIG9mIHRoZSBzb3VyY2UgdG8gd2luMzIvZmlsZS5zIHNob3dlZCB3aGVyZSB0aGUgcHJvYmxlbQord2FzLiAgV2hlbiB5b3Ugc3BlY2lmeSAwIGZvciB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGluIENyZWF0ZUZpbGVNYXBwaW5nLAoraXQgaXMgc3VwcG9zZWQgdG8gdXNlIHRoZSBlbnRpcmUgc2l6ZSBvZiB0aGUgZmlsZSBhcyB0aGUgc2l6ZSBvZiB0aGUKK29iamVjdC4gIEluc3RlYWQgd2Ugd2VyZSBqdXN0IGJsaW5kbHkgY29weWluZyB0aGUgbnVtYmVyIG92ZXIuCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworV2luZS1kYmc+YiBtYWluCitCcmVha3BvaW50IDEgYXQgMHgwODAxMDhjMCAobWFpbiBbZGJnbWFpbi5jOjIxM10pCitXaW5lLWRiZz5wcmludCBicmVha3BvaW50c1sxXQore2FkZHI9e3R5cGU9MHgwODA0MzAwMCwgc2VnPTAsIG9mZj0xMzQyODU1MDR9LCBhZGRybGVuPScgJywgb3Bjb2RlPSdVJywgZW5hYmxlZD0xLCBza2lwY291bnQ9MCwgaW5fdXNlPTF9CisKK1dpbmUtZGJnPiBwcmludCBicmVha3BvaW50c1sxXS5lbmFibGVkCisxCitXaW5lLWRiZz5zZXQgYnJlYWtwb2ludHNbMF0uZW5hYmxlZCA9IDAKK1dpbmUtZGJnPnByaW50IGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQKKzAKKworV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdLT50eXBlCitTVFJVQ1QKKworV2luZS1kYmc+cHJpbnQgdHlwZV9oYXNoX3RhYmxlWzFdCisweDA4MDcyMDIwCitXaW5lLWRiZz5wcmludCAqdHlwZV9oYXNoX3RhYmxlWzFdCitwcmludCAqdHlwZV9oYXNoX3RhYmxlWzFdDQore3R5cGU9U1RSVUNULCBuZXh0PTB4MDAwMDAwMDAsIG5hbWU9IkxPR1BBTEVUVEUiLCB1bj17YmFzaWM9e2Jhc2ljX3R5cGU9OCwgb3V0cHV0X2Zvcm1hdD0ioFYdCKBNHQgiLCBiYXNpY19zaXplPS0xMjgsIGJfc2lnbmVkPTB9LCBiaXRmaWVsZD17Yml0b2ZmPTgsIG5iaXRzPTAsIGJhc2V0eXBlPTB4MDgxZDU2YzB9LCBwb2ludGVyPXtwb2ludHN0bz0weDAwMDAwMDA4fSwgZnVuY3Q9e3JldHR5cGU9MHgwMDAwMDAwOH0sIGFycmF5PXtzdGFydD04LCBlbmQ9MTM2MTQwNDgwLCBiYXNpY3R5cGU9MHgwODA0M2U4MH0sIHN0cnVjdHVyZT17c2l6ZT04LCBtZW1iZXJzPTB4MDgxZDU2YzB9LCBlbnVtZXJhdGlvbj17bWVtYmVycz0weDAwMDAwMDA4fX19CitXaW5lLWRiZz4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisJVGhpcyBleGFtcGxlIHNob3dzIGhvdyB5b3UgY2FuIHByaW50IG91dCB2YXJpb3VzIGRhdGEgc3RydWN0dXJlcy4KK05vdGUgdGhhdCBlbnVtZXJhdGVkIHR5cGVzIGFyZSBkaXNwbGF5ZWQgaW4gdGhlIHN5bWJvbGljIGZvcm0sIGFuZCBzdHJpbmdzCithcmUgZGlzcGxheWVkIGluIHRoZSBleHBlY3RlZCBtYW5uZXIuCisKKwlZb3UgY2FuIHVzZSB0aGUgc2V0IGNvbW1hbmQgdG8gc2V0IG1vcmUgb3IgbGVzcyBhbnl0aGluZy4gIE5vdGUKK2hvd2V2ZXIgdGhhdCB5b3UgY2Fubm90IHVzZSBlbnVtZXJhdGVkIHR5cGVzIG9uIHRoZSBSSFMgb2YgdGhlIGV4cHJlc3Npb24uCisKKwlGaW5hbGx5LCB0eXBlIGNhc3RzIGFyZSBub3QgeWV0IHN1cHBvcnRlZCBpbiB0aGUgZXhwcmVzc2lvbgoraGFuZGxpbmcuICBUaGVyZSBpcyBzdWZmaWNpZW50IGluZm9ybWF0aW9uIHN0b3JlZCBpbnRlcm5hbGx5IHRvIGJlCithYmxlIHRvIGhhbmRsZSB0aGlzIC0gdGhlIG1haW4gY2hhbGxlbmdlIGlzIHRoYXQgdGhlIHBhcnNlciB3b3VsZAorbmVlZCB0byBiZSBmaXhlZCB0byBjb3JyZWN0bHkgcGFyc2UgdGhlIHR5cGUgY2FzdC4KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisKK1dpbmUtZGJnPmxpc3QKKzI5ODYgICAgICAgICAgICBpZiggYXJnYyA8PSAxICkKKzI5ODcgICAgICAgICAgICB7CisyOTg4ICAgICAgICAgICAgICAgICAgICBVc2FnZShhcmd2WzBdKTsKKzI5ODkgICAgICAgICAgICB9CisyOTkwCisyOTkxICAgICAgICAgICAgZm9yKCBpID0gMTsgaSA8IGFyZ2M7IGkrKyApCisyOTkyICAgICAgICAgICAgeworMjk5MyAgICAgICAgICAgICAgICAgICAgaWYoIHN0cm5jbXAoYXJndltpXSwgIi1kb3MiLCBzaXplb2YoIi1kb3MiKSAtIDEpID09IDAgKQorMjk5NCAgICAgICAgICAgICAgICAgICAgeworMjk5NSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbXBDdHJsLmJEdW1wRE9TSGVhZGVyID0gVFJVRTsKKzI5OTYgICAgICAgICAgICAgICAgICAgIH0KK1dpbmUtZGJnPmIgMjk5MworQnJlYWtwb2ludCAzIGF0IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQorV2luZS1kYmc+Y29uZGl0aW9uIDMgaSA9PSAyCitXaW5lLWRiZz5jCitTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKKzI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKKzB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKK1dpbmUtZGJnPnByaW50IGkKKzIKK1dpbmUtZGJnPnByaW50IGFyZ3ZbaV0KKyIuL2R1bXBleGUuZXhlIgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKwlUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBjb25kaXRpb25hbCBicmVha3BvaW50cy4KKwlIZXJlIGlzIGFub3RoZXIgb25lIHRoYXQgZGVtb25zdHJhdGVzIGFub3RoZXIgY29vbCBmZWF0dXJlCisJY29uZGl0aW9uYWwgYnJlYWtwb2ludHMgdGhhdCBpbnZvbHZlIGEgZnVuY3Rpb24gY2FsbDoKKworCQljb25kaXRpb24gMyBzdHJjbXAoYXJndltpXSwgIi4vZHVtcGV4ZS5leGUiKSA9PSAwCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKworCitXaW5lLWRiZz5saXN0CisyOTg2ICAgICAgICAgICAgaWYoIGFyZ2MgPD0gMSApCisyOTg3ICAgICAgICAgICAgeworMjk4OCAgICAgICAgICAgICAgICAgICAgVXNhZ2UoYXJndlswXSk7CisyOTg5ICAgICAgICAgICAgfQorMjk5MAorMjk5MSAgICAgICAgICAgIGZvciggaSA9IDE7IGkgPCBhcmdjOyBpKysgKQorMjk5MiAgICAgICAgICAgIHsKKzI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKKzI5OTQgICAgICAgICAgICAgICAgICAgIHsKKzI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG1wQ3RybC5iRHVtcERPU0hlYWRlciA9IFRSVUU7CisyOTk2ICAgICAgICAgICAgICAgICAgICB9CitXaW5lLWRiZz5iIDI5OTMKK0JyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKK1dpbmUtZGJnPmNvbmRpdGlvbiAzIHN0cmNtcChhcmd2W2ldLCAiLi9kdW1wZXhlLmV4ZSIpID09IDAKK1dpbmUtZGJnPmluZm8gYnJlYWsKK0JyZWFrcG9pbnRzOgorMTogeSAweDA4MWFiNDUwIChfbWFpbkNSVFN0YXJ0dXApCisyOiB5IDB4MDgxYTg4MmUgKG1haW4rMHg5IFtkdW1wZXhlLmM6Mjk4Nl0pCiszOiB5IDB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKQorICAgICAgICAgICAgICAgIHN0b3Agd2hlbiAgKCBzdHJjbXAoKCBhcmd2W2ldICksICIuL2R1bXBleGUuZXhlIikgPT0gMCApCitXaW5lLWRiZz5jCitTdG9wcGVkIG9uIGJyZWFrcG9pbnQgMyBhdCAweDA4MWE4ODYxIChtYWluKzB4M2MgW2R1bXBleGUuYzoyOTkzXSkKKzI5OTMgICAgICAgICAgICAgICAgICAgIGlmKCBzdHJuY21wKGFyZ3ZbaV0sICItZG9zIiwgc2l6ZW9mKCItZG9zIikgLSAxKSA9PSAwICkKKzB4MDgxYTg4NjEgKG1haW4rMHgzYyBbZHVtcGV4ZS5jOjI5OTNdKTogIHB1c2hsICQweDQKK1dpbmUtZGJnPnByaW50IGkKKzIKK1dpbmUtZGJnPnByaW50IGFyZ3ZbaV0gIAorIi4vZHVtcGV4ZS5leGUiCitXaW5lLWRiZz4KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL1RPRE8gYi9kZWJ1Z2dlci9UT0RPCmluZGV4IDU0ZGU3YTYuLjM1NDRiMTIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL1RPRE8KKysrIGIvZGVidWdnZXIvVE9ETwpAQCAtMywyOCArMyw0MiBAQAogcG9zc2libGUgdG8gbWUgcmlnaHQgbm93LiAgIEluIG5vIHBhcnRpY3VsYXIgb3JkZXIuICBJZiBzb21lb25lIGVsc2UKIHdhbnRzIHRvIGRpZyBpbiwgZmVlbCBmcmVlLgogCi0xKSBTb21lIGtpbmQgb2YgY3J1ZGUgZGlzcGxheSBjYXBhYmlsaXR5LiAgTm90IHRvbyBoYXJkLCBJIGd1ZXNzLgotCUp1c3Qga2VlcCBhIGxpc3Qgb2YgYWRkcmVzc2VzLCBjb3VudHMgYW5kIGZvcm1hdHMgdGhhdCB3ZQotCXdhbnQgZGlzcGxheWVkIGVhY2ggdGltZSB3ZSBlbnRlciB0aGUgZGVidWdnZXIuCi0KLTIpIFNvbWUga2luZCBvZiBzaW5nbGUgc3RlcCBjYXBhYmlsaXR5LgotCUkgYW0gbm90IHN1cmUgLSBJIHRoaW5rIHlvdSBqdXN0IHNldCBhIGZsYWcKLQlpbiBBRkxBR1MsIGFuZCB5b3UgZ2V0IGFuIGludGVycnVwdCBiYWNrIGFnYWluLgotCVRoZSBzaWduYWwgdHlwZSB3b3VsZCBwcm9hYmFibHkgYmUgZGlmZmVyZW50LCBob3dldmVyLAotCWJ1dCBXaW5lIGNvdWxkIGVhc2lseSBiZSBwYXRjaGVkIHRvIGFjY2VwdCB0aGlzIG9uZSBhcyB3ZWxsLgotCVRoZSBtYWluIHByb2JsZW0gd2l0aCB0aGlzIGlzIHRoYXQgZ2RiIG5vcm1hbGx5IHJ1bnMgaW4gYQotCXNlcGFyYXRlIHByb2Nlc3Mgc28gaXQgaXMgZWFzeSB0byBzaW5nbGUgc3RlcCBzZWNvbmQgcHJvY2Vzcy4KLQlIZXJlIHdlIGFyZSBhbGwgcGFydCBvZiB0aGUgc2FtZSBwcm9jZXNzLiAgUGVyaGFwcyB3ZSBjb3VsZCBsb29rCi0JYWhlYWQgdG8gdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHNldCBhbm90aGVyIGJyZWFrcG9pbnQ/Ci0KLTMpIFNvbWUga2luZCBvZiBicmVha3BvaW50IGNhcGFiaWxpdHkuCi0JUmVxdWlyZXMgc2luZ2xlIHN0ZXAuICBXaGVuIHdlIHJlc3RhcnQsIHdlCi0JcmVtb3ZlIHRoZSBicmVha3BvaW50LCBzaW5nbGUgc3RlcCBvbmUgaW5zdHJ1Y3Rpb24KLQlyZXBsYWNlIHRoZSBicmVha3BvaW50LCBhbmQgdGhlbiBjb250aW51ZS4KLQotNCkgU29tZSBraW5kIG9mIHdhdGNocG9pbnQgY2FwYWJpbGl0eS4gIFByZXR0eSBlYXN5IG9uY2Ugd2UgaGF2ZSBhCisxKSBTb21lIGtpbmQgb2Ygd2F0Y2hwb2ludCBjYXBhYmlsaXR5LiAgUHJldHR5IGVhc3kgb25jZSB3ZSBoYXZlIGEKIAlzaW5nbGUgc3RlcCBjYXBhYmlsaXR5LCBidXQgd2UgZW5kIHVwIHJ1bm5pbmcgdGhlIHByb2dyYW0KLQlyZWFsbHkgc2xvd2x5IG9uZSBpbnN0cnVjdGlvbiBhdCBhIHRpbWUuCisJcmVhbGx5IHNsb3dseSBvbmUgaW5zdHJ1Y3Rpb24gYXQgYSB0aW1lLiAgVXNlIGhhcmR3YXJlIGRlYnVnCisJcmVnaXN0ZXJzIGZvciB0aGlzPz8/CiAKLTUpIFNvbWUga2luZCBvZiAud2RiaW5pdCBmaWxlLgorMikgU29tZSBraW5kIG9mIC53ZGJpbml0IGZpbGUuCiAKKzMpIEFkZCAnaW5mbyBsaW5lJyBjb21tYW5kLiAgTm90IGFsbCAqdGhhdCogdXNlZnVsLCBidXQgaXQgd291bGQgdGVsbCB5b3UKKwl0aGUgcmFuZ2Ugb2YgUEMgZm9yIGEgZ2l2ZW4gc291cmNlIGxpbmUuCisKKzQpIEFkZCBzZWFyY2ggZGlyZWN0b3J5IGxpc3QgZm9yIFBEQiBmaWxlcy4gIFdlIGhhdmUgdGhlIHBhdGggaW4gdGhlCisJRE9TIG5vdGF0aW9uIChpLmUuIEM6XGZvb1xiYXJceHh4LmMpLCB3aGljaCBtYXkgYmUgYSB1c2VmdWwgaGludC4KKwlNYXliZSBub3QuCisKKzUpIEFkZCBzdXBwb3J0IGZvciBlbWFjcyBtb2RlIHNvIHRoYXQgeW91ICBjYW4gcnVuIHVuZGVyIGVtYWNzIGFuZCBoYXZlCisJdGhlIHNvdXJjZSBwb3AgdXAgYXV0b21hdGljYWxseS4gIE9ubHkgdXNlZnVsIG9uY2UgdGhlIGxpc3QgY29tbWFuZAorCWlzIGltcGxlbWVudGVkLgorCis2IEFkZCBzdXBwb3J0IGZvciBCb3JsYW5kLiAgSSBoYXZlIGhlYXJkIHJ1bW9ycyB0aGF0IEJvcmxhbmQgaXMgZm9ydGhjb21pbmcKKwl3aXRoIGluZm8gYWJvdXQgaG93IHRoZWlyIHN0dWZmIHdvcmtzLCBzbyB0aGlzIG1pZ2h0IG5vdCBiZSB0aGF0CisJYmFkLgorCis3IEFkZCBzdXBwb3J0IGZvciBXaW4xNi4gIE5vdCBzdXJlIGlmIHRoaXMgaXMgcmVhbGx5IHdvcnRoIHRoZSB0cm91YmxlLiAgSG93CisJbXVjaCBhcmUgcGVvcGxlIHJlYWxseSBnb2luZyB0byB1c2UgdGhpcyBpbiB0aGUgbG9uZyBydW4/Pz8KKworOCkgU29tZSBvZiB0aGUgbmV3ZXIgZGlzcGxheXMgYXJlIHN0aWxsIGEgbGl0dGxlIGJpdCBzcGFyc2Ugb24gaW5mb3JtYXRpb24uCisJTWFrZSB0aGVzZSBtb3JlIGxpa2UgZ2RiLgorCis5KSBEb24ndCBib3RoZXIgdG8gZGlzYXNzZW1ibGUgYW4gaW5zdHJ1Y3Rpb24gd2hlbiB3ZSBzdG9wIGF0IGEgYnJlYWtwb2ludAorCWFuZCBpZiB3ZSBoYXZlIGEgdmFsaWQgc291cmNlIGxpbmUgd2UgYXJlIGRpc3BsYXlpbmcuCisKKzEwKSBBZGQgc3VwcG9ydCBmb3IgJy9pJywgZXRjIGluIGRpc3BsYXkgY29tbWFuZC4gIE1ha2Ugc3VyZSAnZGlzcGxheS9pICRlaXAnCisJZG9lcyB0aGUgY29ycmVjdCB0aGluZywgYW5kIHRoZW4gc2tpcCBhdXRvbWF0aWMgZGlzYXNzZW1ibHkgY29tcGxldGVseS4KKworMTEpCUxpbWl0IGFtb3VudCBvZiBpbmZvcm1hdGlvbiBkaXNwbGF5ZWQgd2l0aCBwcmludCBjb21tYW5kLgorCisxMikJTWFrZSBzdXJlIG9wZXJhdG9yIHByZWNlZGVuY2Ugd29ya3MgT0suCisKKyoqKioqKioqKioqKioqKioKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2JyZWFrLmMgYi9kZWJ1Z2dlci9icmVhay5jCmluZGV4IGViOTdmNmMuLjVjZjE2NGYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2JyZWFrLmMKKysrIGIvZGVidWdnZXIvYnJlYWsuYwpAQCAtMTQsMTUgKzE0LDE3IEBACiAKICNkZWZpbmUgSU5UMyAgICAgICAgICAweGNjICAgLyogaW50IDMgb3Bjb2RlICovCiAKLSNkZWZpbmUgTUFYX0JSRUFLUE9JTlRTIDI1CisjZGVmaW5lIE1BWF9CUkVBS1BPSU5UUyAxMDAKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBEQkdfQUREUiAgICBhZGRyOwotICAgIEJZVEUgICAgICAgIGFkZHJsZW47Ci0gICAgQllURSAgICAgICAgb3Bjb2RlOwotICAgIEJPT0wxNiAgICAgIGVuYWJsZWQ7Ci0gICAgQk9PTDE2ICAgICAgaW5fdXNlOworICAgIERCR19BRERSICAgICAgYWRkcjsKKyAgICBCWVRFICAgICAgICAgIGFkZHJsZW47CisgICAgQllURSAgICAgICAgICBvcGNvZGU7CisgICAgQk9PTDE2ICAgICAgICBlbmFibGVkOworICAgIFdPUkQJICBza2lwY291bnQ7CisgICAgQk9PTDE2ICAgICAgICBpbl91c2U7CisgICAgc3RydWN0IGV4cHIgKiBjb25kaXRpb247CiB9IEJSRUFLUE9JTlQ7CiAKIHN0YXRpYyBCUkVBS1BPSU5UIGJyZWFrcG9pbnRzW01BWF9CUkVBS1BPSU5UU107CkBAIC02NSw3ICs2Nyw3IEBACiAgKiBEZXRlcm1pbmUgaWYgdGhlIGluc3RydWN0aW9uIGF0IENTOkVJUCBpcyBhbiBpbnN0cnVjdGlvbiB0aGF0CiAgKiB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciAobGlrZSBhIGNhbGwgb3IgYSByZXBldGl0aXZlIHN0cmluZyBtb3ZlKS4KICAqLwotc3RhdGljIEJPT0wzMiBERUJVR19Jc1N0ZXBPdmVySW5zdHIodm9pZCkKK3N0YXRpYyBCT09MMzIgREVCVUdfSXNTdGVwT3Zlckluc3RyKCkKIHsKICAgICBCWVRFICppbnN0ciA9IChCWVRFICopUFRSX1NFR19PRkZfVE9fTElOKCBDU19yZWcoJkRFQlVHX2NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpICk7CkBAIC0xMjYsNiArMTI4LDMxIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfSXNGY3RSZXR1cm4KKyAqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGluc3RydWN0aW9uIGF0IENTOkVJUCBpcyBhbiBpbnN0cnVjdGlvbiB0aGF0CisgKiBpcyBhIGZ1bmN0aW9uIHJldHVybi4KKyAqLworQk9PTDMyIERFQlVHX0lzRmN0UmV0dXJuKHZvaWQpCit7CisgICAgQllURSAqaW5zdHIgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKCZERUJVR19jb250ZXh0KSApOworCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIHN3aXRjaCgqaW5zdHIpCisgICAgICAgIHsKKwljYXNlIDB4YzI6CisJY2FzZSAweGMzOgorCSAgcmV0dXJuIFRSVUU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVCVUdfU2V0QnJlYWtwb2ludHMKICAqCiAgKiBTZXQgb3IgcmVtb3ZlIGFsbCB0aGUgYnJlYWtwb2ludHMuCkBAIC0yMDUsNiArMjMyLDcgQEAKICAgICBicmVha3BvaW50c1tudW1dLm9wY29kZSAgPSAqcDsKICAgICBicmVha3BvaW50c1tudW1dLmVuYWJsZWQgPSBUUlVFOwogICAgIGJyZWFrcG9pbnRzW251bV0uaW5fdXNlICA9IFRSVUU7CisgICAgYnJlYWtwb2ludHNbbnVtXS5za2lwY291bnQgPSAwOwogICAgIGZwcmludGYoIHN0ZGVyciwgIkJyZWFrcG9pbnQgJWQgYXQgIiwgbnVtICk7CiAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYnJlYWtwb2ludHNbbnVtXS5hZGRyLCBicmVha3BvaW50c1tudW1dLmFkZHJsZW4sCiAJCQlUUlVFICk7CkBAIC0yMjYsNiArMjU0LDcgQEAKICAgICB9CiAgICAgYnJlYWtwb2ludHNbbnVtXS5lbmFibGVkID0gRkFMU0U7CiAgICAgYnJlYWtwb2ludHNbbnVtXS5pbl91c2UgID0gRkFMU0U7CisgICAgYnJlYWtwb2ludHNbbnVtXS5za2lwY291bnQgPSAwOwogfQogCiAKQEAgLTI0Miw2ICsyNzEsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGJyZWFrcG9pbnRzW251bV0uZW5hYmxlZCA9IGVuYWJsZTsKKyAgICBicmVha3BvaW50c1tudW1dLnNraXBjb3VudCA9IDA7CiB9CiAKIApAQCAtMjYzLDYgKzI5MywxMiBAQAogICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYnJlYWtwb2ludHNbaV0uYWRkciwgYnJlYWtwb2ludHNbaV0uYWRkcmxlbiwKIAkJCQlUUlVFKTsKICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOworCSAgICBpZiggYnJlYWtwb2ludHNbaV0uY29uZGl0aW9uICE9IE5VTEwgKQorCSAgICAgIHsKKwkJZnByaW50ZihzdGRlcnIsICJcdFx0c3RvcCB3aGVuICAiKTsKKyAJCURFQlVHX0Rpc3BsYXlFeHByKGJyZWFrcG9pbnRzW2ldLmNvbmRpdGlvbik7CisJCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKwkgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNzQsMTAgKzMxMCwxMiBAQAogICogRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb250aW51ZSBleGVjdXRpb24gYWZ0ZXIgYSBTSUdUUkFQIHNpZ25hbCB3aGVuCiAgKiBleGVjdXRpbmcgaW4gdGhlIGdpdmVuIG1vZGUuCiAgKi8KLUJPT0wzMiBERUJVR19TaG91bGRDb250aW51ZSggZW51bSBleGVjX21vZGUgbW9kZSApCitCT09MMzIgREVCVUdfU2hvdWxkQ29udGludWUoIGVudW0gZXhlY19tb2RlIG1vZGUsIGludCAqIGNvdW50ICkKIHsKICAgICBEQkdfQUREUiBhZGRyOworICAgIERCR19BRERSIGNvbmRfYWRkcjsKICAgICBpbnQgYnBudW07CisgICAgc3RydWN0IGxpc3RfaWQgbGlzdDsKIAogICAgICAgLyogSWYgbm90IHNpbmdsZS1zdGVwcGluZywgYmFjayB1cCBvdmVyIHRoZSBpbnQzIGluc3RydWN0aW9uICovCiAgICAgaWYgKCEoRUZMX3JlZygmREVCVUdfY29udGV4dCkgJiBTVEVQX0ZMQUcpKSBFSVBfcmVnKCZERUJVR19jb250ZXh0KS0tOwpAQCAtMjkxLDIwICszMjksOTggQEAKIAogICAgIGlmICgoYnBudW0gIT0gMCkgJiYgKGJwbnVtICE9IC0xKSkKICAgICB7CisgICAgICAgIGlmKCBicmVha3BvaW50c1ticG51bV0uY29uZGl0aW9uICE9IE5VTEwgKQorCSAgeworCSAgICBjb25kX2FkZHIgPSBERUJVR19FdmFsRXhwcihicmVha3BvaW50c1ticG51bV0uY29uZGl0aW9uKTsKKwkgICAgaWYoIGNvbmRfYWRkci50eXBlID09IE5VTEwgKQorCSAgICAgIHsKKwkJLyoKKwkJICogU29tZXRoaW5nIHdyb25nIC0gdW5hYmxlIHRvIGV2YWx1YXRlIHRoaXMgZXhwcmVzc2lvbi4KKwkJICovCisJCWZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGV2YWx1YXRlIGV4cHJlc3Npb24gIik7CisgCQlERUJVR19EaXNwbGF5RXhwcihicmVha3BvaW50c1ticG51bV0uY29uZGl0aW9uKTsKKwkJZnByaW50ZihzdGRlcnIsICJcblR1cm5pbmcgb2ZmIGNvbmRpdGlvblxuIik7CisJCURFQlVHX0FkZEJQQ29uZGl0aW9uKGJwbnVtLCBOVUxMKTsKKwkgICAgICB9CisJICAgIGVsc2UgaWYoICEgREVCVUdfR2V0RXhwclZhbHVlKCAmY29uZF9hZGRyLCBOVUxMKSApCisJICAgICAgeworCQlyZXR1cm4gVFJVRTsKKwkgICAgICB9CisJICB9CisKKyAgICAgICAgaWYoIGJyZWFrcG9pbnRzW2JwbnVtXS5za2lwY291bnQgPiAwICkKKwkgIHsKKwkgICAgYnJlYWtwb2ludHNbYnBudW1dLnNraXBjb3VudC0tOworCSAgICBpZiggYnJlYWtwb2ludHNbYnBudW1dLnNraXBjb3VudCA+IDAgKQorCSAgICAgIHsKKwkJcmV0dXJuIFRSVUU7CisJICAgICAgfQorCSAgfQogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTdG9wcGVkIG9uIGJyZWFrcG9pbnQgJWQgYXQgIiwgYnBudW0gKTsKICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYnJlYWtwb2ludHNbYnBudW1dLmFkZHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHNbYnBudW1dLmFkZHJsZW4sIFRSVUUgKTsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiXG4iICk7CisJCisJLyoKKwkgKiBTZWUgaWYgdGhlcmUgaXMgYSBzb3VyY2UgZmlsZSBmb3IgdGhpcyBicC4gIElmIHNvLAorCSAqIHRoZW4gZGlnIGl0IG91dCBhbmQgZGlzcGxheSBvbmUgbGluZS4KKwkgKi8KKwlERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsIE5VTEwsIDAsICZsaXN0KTsKKwlpZiggbGlzdC5zb3VyY2VmaWxlICE9IE5VTEwgKQorCSAgeworCSAgICBERUJVR19MaXN0KCZsaXN0LCBOVUxMLCAwKTsKKwkgIH0KICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAorICAgIC8qCisgICAgICogSWYgb3VyIG1vZGUgaW5kaWNhdGVzIHRoYXQgd2UgYXJlIHN0ZXBwaW5nIGxpbmUgbnVtYmVycywKKyAgICAgKiBnZXQgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIGFuZCBmaWd1cmUgb3V0IGlmIHdlIGFyZSBleGFjdGx5CisgICAgICogb24gYSBsaW5lIG51bWJlciBvciBub3QuCisgICAgICovCisgICAgaWYoIG1vZGUgPT0gRVhFQ19TVEVQX09WRVIgCisJfHwgbW9kZSA9PSBFWEVDX1NURVBfSU5TVFIgKQorICAgICAgeworCWlmKCBERUJVR19DaGVja0xpbmVub1N0YXR1cygmYWRkcikgPT0gQVRfTElORU5VTUJFUiApCisJICB7CisJICAgICgqY291bnQpLS07CisJICB9CisgICAgICB9CisgICAgZWxzZSBpZiggbW9kZSA9PSBFWEVDX1NURVBJX09WRVIgCisJfHwgbW9kZSA9PSBFWEVDX1NURVBJX0lOU1RSICkKKworICAgICAgeworCSgqY291bnQpLS07CisgICAgICB9CisKKyAgICBpZiggKmNvdW50ID4gMCB8fCBtb2RlID09IEVYRUNfRklOSVNIICkKKyAgICAgIHsKKwkvKgorCSAqIFdlIHN0aWxsIG5lZWQgdG8gZXhlY3V0ZSBtb3JlIGluc3RydWN0aW9ucy4KKwkgKi8KKwlyZXR1cm4gVFJVRTsKKyAgICAgIH0KKyAgICAKKyAgICAvKgorICAgICAqIElmIHdlIGFyZSBhYm91dCB0byBzdG9wLCB0aGVuIHByaW50IG91dCB0aGUgc291cmNlIGxpbmUgaWYgd2UKKyAgICAgKiBoYXZlIGl0LgorICAgICAqLworICAgIGlmKCAobW9kZSAhPSBFWEVDX0NPTlQgJiYgbW9kZSAhPSBFWEVDX0ZJTklTSCkgKQorICAgICAgeworCURFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCAmYWRkciwgVFJVRSwgTlVMTCwgMCwgJmxpc3QpOworCWlmKCBsaXN0LnNvdXJjZWZpbGUgIT0gTlVMTCApCisJICB7CisJICAgIERFQlVHX0xpc3QoJmxpc3QsIE5VTEwsIDApOworCSAgfQorICAgICAgfQorCiAgICAgLyogSWYgdGhlcmUncyBubyBicmVha3BvaW50IGFuZCB3ZSBhcmUgbm90IHNpbmdsZS1zdGVwcGluZywgdGhlbiB3ZSAgICAgKi8KICAgICAvKiBtdXN0IGhhdmUgZW5jb3VudGVyZWQgYW4gaW50MyBpbiB0aGUgV2luZG93cyBwcm9ncmFtOyBsZXQncyBza2lwIGl0LiAqLwogICAgIGlmICgoYnBudW0gPT0gLTEpICYmICEoRUZMX3JlZygmREVCVUdfY29udGV4dCkgJiBTVEVQX0ZMQUcpKQogICAgICAgICBFSVBfcmVnKCZERUJVR19jb250ZXh0KSsrOwogCiAgICAgICAvKiBubyBicmVha3BvaW50LCBjb250aW51ZSBpZiBpbiBjb250aW51b3VzIG1vZGUgKi8KLSAgICByZXR1cm4gKG1vZGUgPT0gRVhFQ19DT05UKTsKKyAgICByZXR1cm4gKG1vZGUgPT0gRVhFQ19DT05UIHx8IG1vZGUgPT0gRVhFQ19GSU5JU0gpOwogfQogCiAKQEAgLTMxNCwxNiArNDMwLDEwMiBAQAogICogU2V0IHRoZSBicmVha3BvaW50cyB0byB0aGUgY29ycmVjdCBzdGF0ZSB0byByZXN0YXJ0IGV4ZWN1dGlvbgogICogaW4gdGhlIGdpdmVuIG1vZGUuCiAgKi8KLXZvaWQgREVCVUdfUmVzdGFydEV4ZWN1dGlvbiggZW51bSBleGVjX21vZGUgbW9kZSwgaW50IGluc3RyX2xlbiApCitlbnVtIGV4ZWNfbW9kZSBERUJVR19SZXN0YXJ0RXhlY3V0aW9uKCBlbnVtIGV4ZWNfbW9kZSBtb2RlLCBpbnQgY291bnQgKQogewogICAgIERCR19BRERSIGFkZHI7CisgICAgREJHX0FERFIgYWRkcjI7CisgICAgaW50IGJwOworICAgIGludAlkZWx0YTsKKyAgICBpbnQgc3RhdHVzOworICAgIHVuc2lnbmVkIGludCAqIHZhbHVlOworICAgIGVudW0gZXhlY19tb2RlIHJldF9tb2RlOworICAgIEJZVEUgKmluc3RyOwogCiAgICAgYWRkci5zZWcgPSAoQ1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBXSU5FX0NPREVfU0VMRUNUT1IpID8KICAgICAgICAgICAgICAgICAwIDogQ1NfcmVnKCZERUJVR19jb250ZXh0KTsKICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogCi0gICAgaWYgKERFQlVHX0ZpbmRCcmVha3BvaW50KCAmYWRkciApICE9IC0xKQotICAgICAgICBtb2RlID0gRVhFQ19TVEVQX0lOU1RSOyAgLyogSWYgdGhlcmUncyBhIGJyZWFrcG9pbnQsIHNraXAgaXQgKi8KKyAgICAvKgorICAgICAqIFRoaXMgaXMgdGhlIG1vZGUgd2Ugd2lsbCBiZSBydW5uaW5nIGluIGFmdGVyIHdlIGZpbmlzaC4gIFdlIHdvdWxkIGxpa2UKKyAgICAgKiB0byBiZSBhYmxlIHRvIG1vZGlmeSB0aGlzIGluIGNlcnRhaW4gY2FzZXMuCisgICAgICovCisgICAgcmV0X21vZGUgPSBtb2RlOworCisgICAgYnAgPSBERUJVR19GaW5kQnJlYWtwb2ludCggJmFkZHIgKTsgCisgICAgaWYgKCBicCAhPSAtMSAmJiBicCAhPSAwKQorICAgICAgeworCS8qCisJICogSWYgd2UgaGF2ZSBzZXQgYSBuZXcgdmFsdWUsIHRoZW4gc2F2ZSBpdCBpbiB0aGUgQlAgbnVtYmVyLgorCSAqLworCWlmKCBjb3VudCAhPSAwICYmIG1vZGUgPT0gRVhFQ19DT05UICkKKwkgIHsKKwkgICAgYnJlYWtwb2ludHNbYnBdLnNraXBjb3VudCA9IGNvdW50OworCSAgfQorICAgICAgICBtb2RlID0gRVhFQ19TVEVQSV9JTlNUUjsgIC8qIElmIHRoZXJlJ3MgYSBicmVha3BvaW50LCBza2lwIGl0ICovCisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCWlmKCBtb2RlID09IEVYRUNfQ09OVCAmJiBjb3VudCA+IDEgKQorCSAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiTm90IHN0b3BwZWQgYXQgYW55IGJyZWFrcG9pbnQ7IGFyZ3VtZW50IGlnbm9yZWQuXG4iKTsKKwkgIH0KKyAgICAgIH0KKyAgICAKKyAgICBpZiggbW9kZSA9PSBFWEVDX0ZJTklTSCAmJiBERUJVR19Jc0ZjdFJldHVybigpICkKKyAgICAgIHsKKwltb2RlID0gcmV0X21vZGUgPSBFWEVDX1NURVBJX0lOU1RSOworICAgICAgfQorCisgICAgaW5zdHIgPSAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggQ1NfcmVnKCZERUJVR19jb250ZXh0KSwKKwkJCQkJRUlQX3JlZygmREVCVUdfY29udGV4dCkgKTsKKyAgICAvKgorICAgICAqIFNlZSBpZiB0aGUgZnVuY3Rpb24gd2UgYXJlIHN0ZXBwaW5nIGludG8gaGFzIGRlYnVnIGluZm8KKyAgICAgKiBhbmQgbGluZSBudW1iZXJzLiAgSWYgbm90LCB0aGVuIHdlIHN0ZXAgb3ZlciBpdCBpbnN0ZWFkLgorICAgICAqIEZJWE1FIC0gd2UgbmVlZCB0byBjaGVjayBmb3IgdGhpbmdzIGxpa2UgdGh1bmtzIG9yIHRyYW1wb2xpbmVzLAorICAgICAqIGFzIHRoZSBhY3R1YWwgZnVuY3Rpb24gbWF5IGluIGZhY3QgaGF2ZSBkZWJ1ZyBpbmZvLgorICAgICAqLworICAgIGlmKCAqaW5zdHIgPT0gMHhlOCApCisgICAgICB7CisJZGVsdGEgPSAqKHVuc2lnbmVkIGludCopIChpbnN0ciArIDEpOworCWFkZHIyID0gYWRkcjsKKwlERUJVR19EaXNhc20oJmFkZHIyLCBGQUxTRSk7CisJYWRkcjIub2ZmICs9IGRlbHRhOworCQorCXN0YXR1cyA9IERFQlVHX0NoZWNrTGluZW5vU3RhdHVzKCZhZGRyMik7CisJLyoKKwkgKiBBbnl0aW1lIHdlIGhhdmUgYSB0cmFtcG9saW5lLCBzdGVwIG92ZXIgaXQuCisJICovCisJaWYoICgobW9kZSA9PSBFWEVDX1NURVBfT1ZFUikgfHwgKG1vZGUgPT0gRVhFQ19TVEVQSV9PVkVSKSkKKwkgICAgJiYgc3RhdHVzID09IEZVTkNfSVNfVFJBTVBPTElORSApCisJICB7CisjaWYgMAorCSAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBzdGVwcGluZyBpbnRvIHRyYW1wb2xpbmUgYXQgJXggKG5vIGxpbmVzKVxuIiwKKwkJICAgIGFkZHIyLm9mZik7CisjZW5kaWYKKwkgICAgbW9kZSA9IEVYRUNfU1RFUF9PVkVSX1RSQU1QT0xJTkU7CisJICB9CisJCisJaWYoIG1vZGUgPT0gRVhFQ19TVEVQX0lOU1RSICYmIHN0YXR1cyA9PSBGVU5DX0hBU19OT19MSU5FUyApCisJICB7CisjaWYgMAorCSAgICBmcHJpbnRmKHN0ZGVyciwgIk5vdCBzdGVwcGluZyBpbnRvIGZ1bmN0aW9uIGF0ICV4IChubyBsaW5lcylcbiIsCisJCSAgICBhZGRyMi5vZmYpOworI2VuZGlmCisJICAgIG1vZGUgPSBFWEVDX1NURVBfT1ZFUjsKKwkgIH0KKyAgICAgIH0KKworCisgICAgaWYoIG1vZGUgPT0gRVhFQ19TVEVQX0lOU1RSICkKKyAgICAgIHsKKwlpZiggREVCVUdfQ2hlY2tMaW5lbm9TdGF0dXMoJmFkZHIpID09IEZVTkNfSEFTX05PX0xJTkVTICkKKwkgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJTaW5nbGUgc3RlcHBpbmcgdW50aWwgZXhpdCBmcm9tIGZ1bmN0aW9uLCBcbiIpOworCSAgICBmcHJpbnRmKHN0ZGVyciwgIndoaWNoIGhhcyBubyBsaW5lIG51bWJlciBpbmZvcm1hdGlvbi5cbiIpOworCSAgICAKKwkgICAgcmV0X21vZGUgPSBtb2RlID0gRVhFQ19GSU5JU0g7CisJICB9CisgICAgICB9CiAKICAgICBzd2l0Y2gobW9kZSkKICAgICB7CkBAIC0zMzIsMTQgKzUzNCwzNSBAQAogICAgICAgICBERUJVR19TZXRCcmVha3BvaW50cyggVFJVRSApOwogICAgICAgICBicmVhazsKIAorICAgIGNhc2UgRVhFQ19TVEVQX09WRVJfVFJBTVBPTElORToKKyAgICAgIC8qCisgICAgICAgKiBUaGlzIGlzIHRoZSBtZWFucyBieSB3aGljaCB3ZSBzdGVwIG92ZXIgb3VyIGNvbnZlcnNpb24gc3R1YnMKKyAgICAgICAqIGluIGNhbGxmcm9tKi5zIGFuZCBjYWxsdG8qLnMuICBXZSBkaWcgdGhlIGFwcHJvcHJpYXRlIGFkZHJlc3MKKyAgICAgICAqIG9mZiB0aGUgc3RhY2ssIGFuZCB3ZSBzZXQgdGhlIGJyZWFrcG9pbnQgdGhlcmUgaW5zdGVhZCBvZiB0aGUKKyAgICAgICAqIGFkZHJlc3MganVzdCBhZnRlciB0aGUgY2FsbC4KKyAgICAgICAqLworICAgICAgdmFsdWUgPSAodW5zaWduZWQgaW50ICopIEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpICsgMjsKKyAgICAgIGFkZHIub2ZmID0gKnZhbHVlOworICAgICAgRUZMX3JlZygmREVCVUdfY29udGV4dCkgJj0gflNURVBfRkxBRzsKKyAgICAgIGJyZWFrcG9pbnRzWzBdLmFkZHIgICAgPSBhZGRyOworICAgICAgYnJlYWtwb2ludHNbMF0uZW5hYmxlZCA9IFRSVUU7CisgICAgICBicmVha3BvaW50c1swXS5pbl91c2UgID0gVFJVRTsKKyAgICAgIGJyZWFrcG9pbnRzWzBdLnNraXBjb3VudCA9IDA7CisgICAgICBicmVha3BvaW50c1swXS5vcGNvZGUgID0gKihCWVRFICopREJHX0FERFJfVE9fTElOKCAmYWRkciApOworICAgICAgREVCVUdfU2V0QnJlYWtwb2ludHMoIFRSVUUgKTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBFWEVDX0ZJTklTSDoKKyAgICBjYXNlIEVYRUNfU1RFUElfT1ZFUjogIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsICovCiAgICAgY2FzZSBFWEVDX1NURVBfT1ZFUjogIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsICovCiAgICAgICAgIGlmIChERUJVR19Jc1N0ZXBPdmVySW5zdHIoKSkKICAgICAgICAgewogICAgICAgICAgICAgRUZMX3JlZygmREVCVUdfY29udGV4dCkgJj0gflNURVBfRkxBRzsKLSAgICAgICAgICAgIGFkZHIub2ZmICs9IGluc3RyX2xlbjsKKyAgICAgICAgICAgIERFQlVHX0Rpc2FzbSgmYWRkciwgRkFMU0UpOwogICAgICAgICAgICAgYnJlYWtwb2ludHNbMF0uYWRkciAgICA9IGFkZHI7CiAgICAgICAgICAgICBicmVha3BvaW50c1swXS5lbmFibGVkID0gVFJVRTsKICAgICAgICAgICAgIGJyZWFrcG9pbnRzWzBdLmluX3VzZSAgPSBUUlVFOworCSAgICBicmVha3BvaW50c1swXS5za2lwY291bnQgPSAwOwogICAgICAgICAgICAgYnJlYWtwb2ludHNbMF0ub3Bjb2RlICA9ICooQllURSAqKURCR19BRERSX1RPX0xJTiggJmFkZHIgKTsKICAgICAgICAgICAgIERFQlVHX1NldEJyZWFrcG9pbnRzKCBUUlVFICk7CiAgICAgICAgICAgICBicmVhazsKQEAgLTM0Nyw3ICs1NzAsMzIgQEAKICAgICAgICAgLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gc2luZ2xlLXN0ZXBwaW5nICovCiAKICAgICBjYXNlIEVYRUNfU1RFUF9JTlNUUjogLyogU2luZ2xlLXN0ZXBwaW5nIGFuIGluc3RydWN0aW9uICovCisgICAgY2FzZSBFWEVDX1NURVBJX0lOU1RSOiAvKiBTaW5nbGUtc3RlcHBpbmcgYW4gaW5zdHJ1Y3Rpb24gKi8KICAgICAgICAgRUZMX3JlZygmREVCVUdfY29udGV4dCkgfD0gU1RFUF9GTEFHOwogICAgICAgICBicmVhazsKICAgICB9CisgICAgcmV0dXJuIHJldF9tb2RlOworfQorCitpbnQKK0RFQlVHX0FkZEJQQ29uZGl0aW9uKGludCBudW0sIHN0cnVjdCBleHByICogZXhwKQoreworICAgIGlmICgobnVtIDw9IDApIHx8IChudW0gPj0gbmV4dF9icCkgfHwgIWJyZWFrcG9pbnRzW251bV0uaW5fdXNlKQorICAgIHsKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSW52YWxpZCBicmVha3BvaW50IG51bWJlciAlZFxuIiwgbnVtICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICBpZiggYnJlYWtwb2ludHNbbnVtXS5jb25kaXRpb24gIT0gTlVMTCApCisgICAgICB7CisJREVCVUdfRnJlZUV4cHIoYnJlYWtwb2ludHNbbnVtXS5jb25kaXRpb24pOworCWJyZWFrcG9pbnRzW251bV0uY29uZGl0aW9uID0gTlVMTDsKKyAgICAgIH0KKworICAgIGlmKCBleHAgIT0gTlVMTCApCisgICAgICB7CisJYnJlYWtwb2ludHNbbnVtXS5jb25kaXRpb24gPSBERUJVR19DbG9uZUV4cHIoZXhwKTsKKyAgICAgIH0KKworICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYl9kaXNhc20uYyBiL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCmluZGV4IGNiMjMwYzYuLjMyZTBkNDQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCisrKyBiL2RlYnVnZ2VyL2RiX2Rpc2FzbS5jCkBAIC03Miw2ICs3MiwxMyBAQAogc3RhdGljIEJPT0wzMiBkYl9kaXNhc21fMTYgPSBGQUxTRTsKIAogLyoKKyAqIEZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciB3ZSBuZWVkIHRvIGRpc3BsYXkgaW5zdHJ1Y3Rpb24sCisgKiBvciB3aGV0aGVyIHdlIGp1c3QgbmVlZCB0byBrbm93IHRoZSBhZGRyZXNzIG9mIHRoZSBuZXh0CisgKiBpbnN0cnVjdGlvbi4KKyAqLworc3RhdGljIEJPT0wzMiBkYl9kaXNwbGF5ID0gRkFMU0U7CisKKy8qCiAgKiBTaXplIGF0dHJpYnV0ZXMKICAqLwogI2RlZmluZQlCWVRFCTAKQEAgLTEwMDksNyArMTAxNiw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTE9ORzoKICAgICAgICAgewotICAgICAgICAgICAgREJHX0FERFIgYWRkcmVzcyA9IHsgMCwgYWRkciB9OworICAgICAgICAgICAgREJHX0FERFIgYWRkcmVzcyA9IHsgTlVMTCwgMCwgYWRkciB9OwogICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkcmVzcywgZGJfZGlzYXNtXzE2ID8gMTYgOiAzMiwgVFJVRSApOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwpAQCAtMTA1Nyw2ICsxMDY0LDExIEBACiAJY29uc3QgY2hhciAqCW5hbWU7CiAKIAlnZXRfdmFsdWVfaW5jKHJlZ21vZHJtLCBhZGRyLCAxLCBGQUxTRSk7CisJaWYoICFkYl9kaXNwbGF5ICkKKwkgIHsKKwkgICAgcmV0dXJuOworCSAgfQorCiAJZnAgPSAmZGJfRXNjX2luc3RbaW5zdCAtIDB4ZDhdW2ZfcmVnKHJlZ21vZHJtKV07CiAJbW9kID0gZl9tb2QocmVnbW9kcm0pOwogCWlmIChtb2QgIT0gMykgewpAQCAtMTEyOCw3ICsxMTQwLDcgQEAKICAqIERpc2Fzc2VtYmxlIGluc3RydWN0aW9uIGF0ICdhZGRyJy4gIGFkZHIgaXMgY2hhbmdlZCB0byBwb2ludCB0byB0aGUKICAqIHN0YXJ0IG9mIHRoZSBuZXh0IGluc3RydWN0aW9uLgogICovCi12b2lkIERFQlVHX0Rpc2FzbSggREJHX0FERFIgKmFkZHIgKQordm9pZCBERUJVR19EaXNhc20oIERCR19BRERSICphZGRyLCBpbnQgZGlzcGxheSApCiB7CiAJaW50CWluc3Q7CiAJaW50CXNpemU7CkBAIC0xMTQ2LDYgKzExNTgsMTEgQEAKIAlpbnQJbGVuOwogCXN0cnVjdCBpX2FkZHIJYWRkcmVzczsKIAorCS8qCisJICogU2V0IHRoaXMgc28gd2UgZ2V0IGNhbiBzdXByZXNzIHRoZSBwcmludG91dCBpZiB3ZSBuZWVkIHRvLgorCSAqLworCWRiX2Rpc3BsYXkgPSBkaXNwbGF5OworCiAgICAgICAgIGlmICghYWRkci0+c2VnKSBkYl9kaXNhc21fMTYgPSBGQUxTRTsKICAgICAgICAgZWxzZSBkYl9kaXNhc21fMTYgPSAhKEdFVF9TRUxfRkxBR1MoYWRkci0+c2VnKSAmIExEVF9GTEFHU18zMkJJVCk7CiAKQEAgLTEyNjMsMTQ1ICsxMjgwLDI0MiBAQAogCX0KIAogCWlmIChpX3NpemUgPT0gU0RFUCkgewotCSAgICBpZiAoc2l6ZSA9PSBXT1JEKQorCSAgaWYoIGRiX2Rpc3BsYXkgKQorCSAgICB7CisJICAgICAgaWYgKHNpemUgPT0gV09SRCkKIAkJZnByaW50ZihzdGRlcnIsaV9uYW1lKTsKLQkgICAgZWxzZQorCSAgICAgIGVsc2UKIAkJZnByaW50ZihzdGRlcnIsaXAtPmlfZXh0cmEpOworCSAgICB9CiAJfQogCWVsc2UgewotCSAgICBmcHJpbnRmKHN0ZGVycixpX25hbWUpOworCSAgaWYoIGRiX2Rpc3BsYXkgKQorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsaV9uYW1lKTsKKwkgICAgfQogCSAgICBpZiAoaV9zaXplICE9IE5PTkUpIHsKIAkJaWYgKGlfc2l6ZSA9PSBCWVRFKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiYiIpOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsImIiKTsKKwkJICAgIH0KIAkJICAgIHNpemUgPSBCWVRFOwogCQl9CiAJCWVsc2UgaWYgKGlfc2l6ZSA9PSBXT1JEKSB7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwidyIpOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsInciKTsKKwkJICAgIH0KIAkJICAgIHNpemUgPSBXT1JEOwogCQl9CiAJCWVsc2UgaWYgKHNpemUgPT0gV09SRCkKLQkJICAgIGZwcmludGYoc3RkZXJyLCJ3Iik7CisJCSAgeworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsInciKTsKKwkJICAgIH0KKwkJICB9CiAJCWVsc2UKLQkJICAgIGZwcmludGYoc3RkZXJyLCJsIik7CisJCSAgeworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsImwiKTsKKwkJICAgIH0KKwkJICB9CiAJICAgIH0KIAl9Ci0JZnByaW50ZihzdGRlcnIsIlx0Iik7CisJaWYoIGRiX2Rpc3BsYXkgKQorCSAgeworCSAgICBmcHJpbnRmKHN0ZGVyciwiXHQiKTsKKwkgIH0KIAlmb3IgKGZpcnN0ID0gVFJVRTsKIAkgICAgIGlfbW9kZSAhPSAwOwogCSAgICAgaV9tb2RlID4+PSA4LCBmaXJzdCA9IEZBTFNFKQogCXsKLQkgICAgaWYgKCFmaXJzdCkKKwkgICAgaWYgKCFmaXJzdCAmJiBkYl9kaXNwbGF5KQogCQlmcHJpbnRmKHN0ZGVyciwiLCIpOwogCiAJICAgIHN3aXRjaCAoaV9tb2RlICYgMHhGRikgewogCiAJCWNhc2UgRToKLQkJICAgIGRiX3ByaW50X2FkZHJlc3Moc2VnLCBzaXplLCAmYWRkcmVzcyk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBkYl9wcmludF9hZGRyZXNzKHNlZywgc2l6ZSwgJmFkZHJlc3MpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBFaW5kOgotCQkgICAgZnByaW50ZihzdGRlcnIsIioiKTsKLQkJICAgIGRiX3ByaW50X2FkZHJlc3Moc2VnLCBzaXplLCAmYWRkcmVzcyk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiKiIpOworCQkgICAgICBkYl9wcmludF9hZGRyZXNzKHNlZywgc2l6ZSwgJmFkZHJlc3MpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBFdzoKLQkJICAgIGRiX3ByaW50X2FkZHJlc3Moc2VnLCBXT1JELCAmYWRkcmVzcyk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBkYl9wcmludF9hZGRyZXNzKHNlZywgV09SRCwgJmFkZHJlc3MpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBFYjoKLQkJICAgIGRiX3ByaW50X2FkZHJlc3Moc2VnLCBCWVRFLCAmYWRkcmVzcyk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBkYl9wcmludF9hZGRyZXNzKHNlZywgQllURSwgJmFkZHJlc3MpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBSOgotCQkgICAgZnByaW50ZihzdGRlcnIsIiVzIiwgZGJfcmVnW3NpemVdW2ZfcmVnKHJlZ21vZHJtKV0pOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiVzIiwgZGJfcmVnW3NpemVdW2ZfcmVnKHJlZ21vZHJtKV0pOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBSdzoKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3JlZ1tXT1JEXVtmX3JlZyhyZWdtb2RybSldKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3JlZ1tXT1JEXVtmX3JlZyhyZWdtb2RybSldKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgUmk6Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJXMiLCBkYl9yZWdbc2l6ZV1bZl9ybShpbnN0KV0pOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiVzIiwgZGJfcmVnW3NpemVdW2Zfcm0oaW5zdCldKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgUzoKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3NlZ19yZWdbZl9yZWcocmVnbW9kcm0pXSk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJXMiLCBkYl9zZWdfcmVnW2ZfcmVnKHJlZ21vZHJtKV0pOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBTaToKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3NlZ19yZWdbZl9yZWcoaW5zdCldKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3NlZ19yZWdbZl9yZWcoaW5zdCldKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgQToKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlcyIsIGRiX3JlZ1tzaXplXVswXSk7CS8qIGFjYyAqLworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiVzIiwgZGJfcmVnW3NpemVdWzBdKTsJLyogYWNjICovCisJCSAgICB9CiAJCSAgICBicmVhazsKIAogCQljYXNlIEJYOgotCQkgICAgaWYgKHNlZykKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGlmIChzZWcpCiAJCQlmcHJpbnRmKHN0ZGVyciwiJXM6Iiwgc2VnKTsKLQkJICAgIGZwcmludGYoc3RkZXJyLCIoJXMpIiwgc2hvcnRfYWRkciA/ICIlYngiIDogIiVlYngiKTsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiglcykiLCBzaG9ydF9hZGRyID8gIiVieCIgOiAiJWVieCIpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBDTDoKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlJWNsIik7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJSVjbCIpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBEWDoKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlJWR4Iik7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJSVkeCIpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBTSToKLQkJICAgIGlmIChzZWcpCisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBpZiAoc2VnKQogCQkJZnByaW50ZihzdGRlcnIsIiVzOiIsIHNlZyk7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiKCVzKSIsIHNob3J0X2FkZHIgPyAiJXNpIiA6ICIlZXNpIik7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIoJXMpIiwgc2hvcnRfYWRkciA/ICIlc2kiIDogIiVlc2kiKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgREk6Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJSVlczooJXMpIiwgc2hvcnRfYWRkciA/ICIlZGkiIDogIiVlZGkiKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIlJWVzOiglcykiLCBzaG9ydF9hZGRyID8gIiVkaSIgOiAiJWVkaSIpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBDUjoKLQkJICAgIGZwcmludGYoc3RkZXJyLCIlJWNyJWQiLCBmX3JlZyhyZWdtb2RybSkpOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiUlY3IlZCIsIGZfcmVnKHJlZ21vZHJtKSk7CisJCSAgICB9CiAJCSAgICBicmVhazsKIAogCQljYXNlIERSOgotCQkgICAgZnByaW50ZihzdGRlcnIsIiUlZHIlZCIsIGZfcmVnKHJlZ21vZHJtKSk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJSVkciVkIiwgZl9yZWcocmVnbW9kcm0pKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgVFI6Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJSV0ciVkIiwgZl9yZWcocmVnbW9kcm0pKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIlJXRyJWQiLCBmX3JlZyhyZWdtb2RybSkpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBJOgogCQkgICAgbGVuID0gZGJfbGVuZ3Roc1tzaXplXTsKIAkJICAgIGdldF92YWx1ZV9pbmMoaW1tLCBhZGRyLCBsZW4sIEZBTFNFKTsvKiB1bnNpZ25lZCAqLwotCQkgICAgZnByaW50ZihzdGRlcnIsIiQweCV4IiwgaW1tKTsKKwkJICAgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgICAgeworCQkJZnByaW50ZihzdGRlcnIsIiQweCV4IiwgaW1tKTsKKwkJICAgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBJczoKIAkJICAgIGxlbiA9IGRiX2xlbmd0aHNbc2l6ZV07CiAJCSAgICBnZXRfdmFsdWVfaW5jKGltbSwgYWRkciwgbGVuLCBUUlVFKTsgLyogc2lnbmVkICovCi0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJCVkIiwgaW1tKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIkJWQiLCBpbW0pOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBJYjoKIAkJICAgIGdldF92YWx1ZV9pbmMoaW1tLCBhZGRyLCAxLCBGQUxTRSk7IC8qIHVuc2lnbmVkICovCi0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJDB4JXgiLCBpbW0pOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiQweCV4IiwgaW1tKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgSWJzOgogCQkgICAgZ2V0X3ZhbHVlX2luYyhpbW0sIGFkZHIsIDEsIFRSVUUpOyAvKiBzaWduZWQgKi8KLQkJICAgIGZwcmludGYoc3RkZXJyLCIkJWQiLCBpbW0pOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiQlZCIsIGltbSk7CisJCSAgICB9CiAJCSAgICBicmVhazsKIAogCQljYXNlIEl3OgogCQkgICAgZ2V0X3ZhbHVlX2luYyhpbW0sIGFkZHIsIDIsIEZBTFNFKTsgLyogdW5zaWduZWQgKi8KLQkJICAgIGZwcmludGYoc3RkZXJyLCIkMHgleCIsIGltbSk7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJDB4JXgiLCBpbW0pOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBJbDoKIAkJICAgIGdldF92YWx1ZV9pbmMoaW1tLCBhZGRyLCA0LCBGQUxTRSk7Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJDB4JXgiLCBpbW0pOworCQkgIGlmKCBkYl9kaXNwbGF5ICkKKwkJICAgIHsKKwkJICAgICAgZnByaW50ZihzdGRlcnIsIiQweCV4IiwgaW1tKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgTzoKQEAgLTE0MTEsNiArMTUyNSwxMSBAQAogCQkgICAgZWxzZSB7CiAJCQlnZXRfdmFsdWVfaW5jKGRpc3BsLCBhZGRyLCA0LCBUUlVFKTsKIAkJICAgIH0KKwkJICAgIGlmKCAhZGJfZGlzcGxheSApCisJCSAgICAgIHsKKwkJCWJyZWFrOworCQkgICAgICB9CisKIAkJICAgIGlmIChzZWcpCiAJCQlmcHJpbnRmKHN0ZGVyciwiJXM6JWQiLHNlZywgZGlzcGwpOwogCQkgICAgZWxzZQpAQCAtMTQxOSw2ICsxNTM4LDExIEBACiAKIAkJY2FzZSBEYjoKIAkJICAgIGdldF92YWx1ZV9pbmMoZGlzcGwsIGFkZHIsIDEsIFRSVUUpOworCQkgICAgaWYoICFkYl9kaXNwbGF5ICkKKwkJICAgICAgeworCQkJYnJlYWs7CisJCSAgICAgIH0KKwogCQkgICAgaWYgKHNob3J0X2FkZHIpIHsKIAkJCS8qIG9mZnNldCBvbmx5IGFmZmVjdHMgbG93IDE2IGJpdHMgKi8KIAkJICAgICAgICBkaXNwbCA9IChhZGRyLT5vZmYgJiAweGZmZmYwMDAwKQpAQCAtMTQzOSwxNSArMTU2MywyNSBAQAogCQkJZ2V0X3ZhbHVlX2luYyhkaXNwbCwgYWRkciwgNCwgVFJVRSk7CiAJCQlkaXNwbCArPSBhZGRyLT5vZmY7CiAJCSAgICB9CisJCSAgICBpZiggIWRiX2Rpc3BsYXkgKQorCQkgICAgICB7CisJCQlicmVhazsKKwkJICAgICAgfQogCQkgICAgZGJfdGFza19wcmludHN5bSggZGlzcGwsIHNob3J0X2FkZHIgPyBXT1JEIDogTE9ORyk7CiAJCSAgICBicmVhazsKIAogCQljYXNlIG8xOgotCQkgICAgZnByaW50ZihzdGRlcnIsIiQxIik7CisJCSAgaWYoIGRiX2Rpc3BsYXkgKQorCQkgICAgeworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwiJDEiKTsKKwkJICAgIH0KIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgbzM6Ci0JCSAgICBmcHJpbnRmKHN0ZGVyciwiJDMiKTsKKwkJICBpZiggZGJfZGlzcGxheSApCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZXJyLCIkMyIpOworCQkgICAgfQogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBPUzoKQEAgLTE0NTcsOCArMTU5MSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRfYWRkciA/IDIgOiA0LCBGQUxTRSApOwogICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X3ZhbHVlX2luYyggYWRkcmVzcy5zZWcsIGFkZHIsICAvKiBzZWdtZW50ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCBGQUxTRSApOwotICAgICAgICAgICAgICAgICAgICAgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkcmVzcywgc2hvcnRfYWRkciA/IDE2IDogMzIsIAotCQkJCQkgICAgVFJVRSApOworCQkJaWYoIGRiX2Rpc3BsYXkgKQorCQkJICB7CisJCQkgICAgREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkcmVzcywgc2hvcnRfYWRkciA/IDE2IDogMzIsIAorCQkJCQkJVFJVRSApOworCQkJICB9CisJCSAgICAgIAogICAgICAgICAgICAgICAgICAgICB9CiAJCSAgICBicmVhazsKIAkgICAgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGJnLnkgYi9kZWJ1Z2dlci9kYmcueQppbmRleCA0YmM3ZmRmLi44ZGIwODg1IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9kYmcueQorKysgYi9kZWJ1Z2dlci9kYmcueQpAQCAtMTYsMTEgKzE2LDE0IEBACiAjaW5jbHVkZSAid2luLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKIAorI2luY2x1ZGUgImV4cHIuaCIKKwogZXh0ZXJuIEZJTEUgKiB5eWluOwogdW5zaWduZWQgaW50IGRiZ19tb2RlID0gMDsKIGludCBjdXJyX2ZyYW1lID0gMDsKIAogc3RhdGljIGVudW0gZXhlY19tb2RlIGRiZ19leGVjX21vZGUgPSBFWEVDX0NPTlQ7CitzdGF0aWMgaW50IGRiZ19leGVjX2NvdW50ID0gMDsKIAogdm9pZCBpc3N1ZV9wcm9tcHQodm9pZCk7CiB2b2lkIG1vZGVfY29tbWFuZChpbnQpOwpAQCAtMzYsMTcgKzM5LDE4IEBACiAgICAgZW51bSBkZWJ1Z19yZWdzICByZWc7CiAgICAgY2hhciAqICAgICAgICAgICBzdHJpbmc7CiAgICAgaW50ICAgICAgICAgICAgICBpbnRlZ2VyOworICAgIHN0cnVjdCBsaXN0X2lkICAgbGlzdGluZzsKKyAgICBzdHJ1Y3QgZXhwciAqICAgIGV4cHJlc3Npb247CiB9CiAKICV0b2tlbiB0Q09OVCB0U1RFUCB0TElTVCB0TkVYVCB0UVVJVCB0SEVMUCB0QkFDS1RSQUNFIHRJTkZPIHRXQUxLIHRVUCB0RE9XTgotJXRva2VuIHRFTkFCTEUgdERJU0FCTEUgdEJSRUFLIHRERUxFVEUgdFNFVCB0TU9ERSB0UFJJTlQgdEVYQU0gdERFRklORSB0QUJPUlQKKyV0b2tlbiB0RU5BQkxFIHRESVNBQkxFIHRCUkVBSyB0REVMRVRFIHRTRVQgdE1PREUgdFBSSU5UIHRFWEFNIHRBQk9SVAogJXRva2VuIHRDTEFTUyB0TU9EVUxFIHRTVEFDSyB0U0VHTUVOVFMgdFJFR1MgdFdORCB0UVVFVUUgdExPQ0FMCi0ldG9rZW4gdE5PX1NZTUJPTCB0RU9MCi0ldG9rZW4gdFNZTUJPTEZJTEUKLSV0b2tlbiB0RlJBTUUKLQotCi0ldG9rZW4gPHN0cmluZz4gdElERU5USUZJRVIKKyV0b2tlbiB0RU9MIHRTVFJJTkcKKyV0b2tlbiB0RlJBTUUgdFNIQVJFIHRDT05EIHRESVNQTEFZIHRVTkRJU1BMQVkKKyV0b2tlbiB0U1RFUEkgdE5FWFRJIHRGSU5JU0ggdFNIT1cgdERJUiAKKyV0b2tlbiA8c3RyaW5nPiB0UEFUSAorJXRva2VuIDxzdHJpbmc+IHRJREVOVElGSUVSIHRTVFJJTkcKICV0b2tlbiA8aW50ZWdlcj4gdE5VTSB0Rk9STUFUCiAldG9rZW4gPHJlZz4gdFJFRwogCkBAIC02MiwxNCArNjYsMTkgQEAKICVsZWZ0ICcmJwogJWxlZnQgT1BfRVEgT1BfTkUKICVsZWZ0ICc8JyAnPicgT1BfTEUgT1BfR0UKLSVsZWZ0IE9QX1NITCBPUF9TSFIKKyVsZWZ0IE9QX1NITCBPUF9TSFIgT1BfRFJGCiAlbGVmdCAnKycgJy0nCiAlbGVmdCAnKicgJy8nICclJwogJWxlZnQgT1BfU0lHTiAnIScgJ34nIE9QX0RFUkVGIC8qIE9QX0lOQyBPUF9ERUMgT1BfQUREUiAqLworJWxlZnQgJy4nICdbJwogJW5vbmFzc29jICc6JwogCi0ldHlwZSA8aW50ZWdlcj4gZXhwcgotJXR5cGUgPGFkZHJlc3M+IGFkZHIgc2VnYWRkciBzeW1ib2wKKyV0eXBlIDxleHByZXNzaW9uPiBleHByIGx2YWwgbHZhbHVlCisldHlwZSA8YWRkcmVzcz4gZXhwcl9hZGRyIGx2YWxfYWRkcgorJXR5cGUgPGludGVnZXI+IGV4cHJfdmFsdWUKKyV0eXBlIDxzdHJpbmc+IHBhdGhuYW1lCisKKyV0eXBlIDxsaXN0aW5nPiBsaXN0X2FyZwogCiAlJQogCkBAIC04MywxNCArOTIsMjggQEAKIGNvbW1hbmQ6CiAgICAgICB0UVVJVCB0RU9MICAgICAgICAgICAgICAgeyBleGl0KDApOyB9CiAgICAgfCB0SEVMUCB0RU9MICAgICAgICAgICAgICAgeyBERUJVR19IZWxwKCk7IH0KLSAgICB8IHRDT05UIHRFT0wgICAgICAgICAgICAgICB7IGRiZ19leGVjX21vZGUgPSBFWEVDX0NPTlQ7IHJldHVybiAwOyB9Ci0gICAgfCB0U1RFUCB0RU9MICAgICAgICAgICAgICAgeyBkYmdfZXhlY19tb2RlID0gRVhFQ19TVEVQX0lOU1RSOyByZXR1cm4gMDsgfQotICAgIHwgdE5FWFQgdEVPTCAgICAgICAgICAgICAgIHsgZGJnX2V4ZWNfbW9kZSA9IEVYRUNfU1RFUF9PVkVSOyByZXR1cm4gMDsgfQotICAgIHwgdExJU1QgdEVPTCAgICAgICAgICAgICAgIHsgREVCVUdfTGlzdCggTlVMTCwgMTUgKTsgfQotICAgIHwgdExJU1QgYWRkciB0RU9MICAgICAgICAgIHsgREVCVUdfTGlzdCggJiQyLCAxNSApOyB9CisgICAgfCB0SEVMUCB0SU5GTyB0RU9MICAgICAgICAgeyBERUJVR19IZWxwSW5mbygpOyB9CisgICAgfCB0Q09OVCB0RU9MICAgICAgICAgICAgICAgeyBkYmdfZXhlY19jb3VudCA9IDE7IAorCQkJCSBkYmdfZXhlY19tb2RlID0gRVhFQ19DT05UOyByZXR1cm4gMDsgfQorICAgIHwgdENPTlQgdE5VTSB0RU9MICAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAkMjsgCisJCQkJIGRiZ19leGVjX21vZGUgPSBFWEVDX0NPTlQ7IHJldHVybiAwOyB9CisgICAgfCB0U1RFUCB0RU9MICAgICAgICAgICAgICAgeyBkYmdfZXhlY19jb3VudCA9IDE7IAorCQkJCSBkYmdfZXhlY19tb2RlID0gRVhFQ19TVEVQX0lOU1RSOyByZXR1cm4gMDsgfQorICAgIHwgdE5FWFQgdEVPTCAgICAgICAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAxOyAKKwkJCQkgZGJnX2V4ZWNfbW9kZSA9IEVYRUNfU1RFUF9PVkVSOyByZXR1cm4gMDsgfQorICAgIHwgdFNURVAgdE5VTSB0RU9MICAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAkMjsgCisJCQkJIGRiZ19leGVjX21vZGUgPSBFWEVDX1NURVBfSU5TVFI7IHJldHVybiAwOyB9CisgICAgfCB0TkVYVCB0TlVNIHRFT0wgICAgICAgICAgeyBkYmdfZXhlY19jb3VudCA9ICQyOyAKKwkJCQkgZGJnX2V4ZWNfbW9kZSA9IEVYRUNfU1RFUF9PVkVSOyByZXR1cm4gMDsgfQorICAgIHwgdFNURVBJIHRFT0wgICAgICAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAxOyAKKwkJCQkgZGJnX2V4ZWNfbW9kZSA9IEVYRUNfU1RFUElfSU5TVFI7IHJldHVybiAwOyB9CisgICAgfCB0TkVYVEkgdEVPTCAgICAgICAgICAgICAgeyBkYmdfZXhlY19jb3VudCA9IDE7IAorCQkJCSBkYmdfZXhlY19tb2RlID0gRVhFQ19TVEVQSV9PVkVSOyByZXR1cm4gMDsgfQorICAgIHwgdFNURVBJIHROVU0gdEVPTCAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAkMjsgCisJCQkJIGRiZ19leGVjX21vZGUgPSBFWEVDX1NURVBJX0lOU1RSOyByZXR1cm4gMDsgfQorICAgIHwgdE5FWFRJIHROVU0gdEVPTCAgICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAkMjsgCisJCQkJIGRiZ19leGVjX21vZGUgPSBFWEVDX1NURVBJX09WRVI7IHJldHVybiAwOyB9CiAgICAgfCB0QUJPUlQgdEVPTCAgICAgICAgICAgICAgeyBraWxsKGdldHBpZCgpLCBTSUdBQlJUKTsgfQotICAgIHwgdFNZTUJPTEZJTEUgdElERU5USUZJRVIgdEVPTCAgeyBERUJVR19SZWFkU3ltYm9sVGFibGUoICQyICk7IH0KLSAgICB8IHRERUZJTkUgdElERU5USUZJRVIgYWRkciB0RU9MIHsgREVCVUdfQWRkU3ltYm9sKCAkMiwgJiQzLCBOVUxMICk7IH0KICAgICB8IHRNT0RFIHROVU0gdEVPTCAgICAgICAgICB7IG1vZGVfY29tbWFuZCgkMik7IH0KICAgICB8IHRFTkFCTEUgdE5VTSB0RU9MICAgICAgICB7IERFQlVHX0VuYWJsZUJyZWFrcG9pbnQoICQyLCBUUlVFICk7IH0KICAgICB8IHRESVNBQkxFIHROVU0gdEVPTCAgICAgICB7IERFQlVHX0VuYWJsZUJyZWFrcG9pbnQoICQyLCBGQUxTRSApOyB9CkBAIC0xMDAsNyArMTIzLDIwIEBACiAgICAgfCB0VVAgdE5VTSB0RU9MCSAgICAgICB7IERFQlVHX1NldEZyYW1lKCBjdXJyX2ZyYW1lICsgJDIgKTsgfQogICAgIHwgdERPV04gdEVPTAkgICAgICAgeyBERUJVR19TZXRGcmFtZSggY3Vycl9mcmFtZSAtIDEgKTsgIH0KICAgICB8IHRET1dOIHROVU0gdEVPTAkgICAgICAgeyBERUJVR19TZXRGcmFtZSggY3Vycl9mcmFtZSAtICQyICk7IH0KLSAgICB8IHRGUkFNRSBleHByIHRFT0wJICAgICAgIHsgREVCVUdfU2V0RnJhbWUoICQyICk7IH0KKyAgICB8IHRGUkFNRSB0TlVNIHRFT0wgICAgICAgICB7IERFQlVHX1NldEZyYW1lKCAkMiApOyB9CisgICAgfCB0RklOSVNIIHRFT0wJICAgICAgIHsgZGJnX2V4ZWNfY291bnQgPSAwOworCQkJCSBkYmdfZXhlY19tb2RlID0gRVhFQ19GSU5JU0g7IHJldHVybiAwOyB9CisgICAgfCB0U0hPVyB0RElSIHRFT0wJICAgICAgIHsgREVCVUdfU2hvd0RpcigpOyB9CisgICAgfCB0RElSIHBhdGhuYW1lIHRFT0wgICAgICAgeyBERUJVR19BZGRQYXRoKCAkMiApOyB9CisgICAgfCB0RElSIHRFT0wJCSAgICAgICB7IERFQlVHX051a2VQYXRoKCk7IH0KKyAgICB8IHRESVNQTEFZIGV4cHIgdEVPTCAgICAgICB7IERFQlVHX0FkZERpc3BsYXkoJDIpOyB9CisgICAgfCB0REVMRVRFIHRESVNQTEFZIHROVU0gdEVPTCB7IERFQlVHX0RlbERpc3BsYXkoICQzICk7IH0KKyAgICB8IHRERUxFVEUgdERJU1BMQVkgdEVPTCAgICB7IERFQlVHX0RlbERpc3BsYXkoIC0xICk7IH0KKyAgICB8IHRVTkRJU1BMQVkgdE5VTSB0RU9MICAgICB7IERFQlVHX0RlbERpc3BsYXkoICQyICk7IH0KKyAgICB8IHRVTkRJU1BMQVkgdEVPTCAgICAgICAgICB7IERFQlVHX0RlbERpc3BsYXkoIC0xICk7IH0KKyAgICB8IHRDT05EIHROVU0gdEVPTCAgICAgICAgICB7IERFQlVHX0FkZEJQQ29uZGl0aW9uKCQyLCBOVUxMKTsgfQorICAgIHwgdENPTkQgdE5VTSBleHByIHRFT0wgICAgIHsgREVCVUdfQWRkQlBDb25kaXRpb24oJDIsICQzKTsgfQorICAgIHwgbGlzdF9jb21tYW5kCiAgICAgfCBzZXRfY29tbWFuZAogICAgIHwgeF9jb21tYW5kCiAgICAgfCBwcmludF9jb21tYW5kCkBAIC0xMDksNDcgKzE0NSwxMTAgQEAKICAgICB8IHdhbGtfY29tbWFuZAogCiBzZXRfY29tbWFuZDoKLSAgICAgIHRTRVQgdFJFRyAnPScgZXhwciB0RU9MCSAgICAgeyBERUJVR19TZXRSZWdpc3RlciggJDIsICQ0ICk7IH0KLSAgICB8IHRTRVQgJyonIGFkZHIgJz0nIGV4cHIgdEVPTCAgICB7IERFQlVHX1dyaXRlTWVtb3J5KCAmJDMsICQ1ICk7IH0KLSAgICB8IHRTRVQgdElERU5USUZJRVIgJz0nIGFkZHIgdEVPTCB7IGlmICghREVCVUdfU2V0U3ltYm9sVmFsdWUoICQyLCAmJDQgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN5bWJvbCAlcyBub3QgZm91bmRcbiIsICQyICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVlFUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICB0U0VUIHRSRUcgJz0nIGV4cHJfdmFsdWUgdEVPTAkgICB7IERFQlVHX1NldFJlZ2lzdGVyKCAkMiwgJDQgKTsgCisJCQkJCSAgICAgREVCVUdfRnJlZUV4cHJNZW0oKTsgfQorICAgIHwgdFNFVCBsdmFsX2FkZHIgJz0nIGV4cHJfdmFsdWUgdEVPTCAgIHsgREVCVUdfV3JpdGVNZW1vcnkoICYkMiwgJDQgKTsgCisgCQkJCQkgICAgIERFQlVHX0ZyZWVFeHByTWVtKCk7IH0KKworcGF0aG5hbWU6CisgICAgICB0SURFTlRJRklFUiAgICAgICAgICAgICAgICAgICAgeyAkJCA9ICQxOyB9CisgICAgfCB0UEFUSAkJCSAgICAgeyAkJCA9ICQxOyB9CisKK2xpc3RfY29tbWFuZDoKKyAgICAgIHRMSVNUIHRFT0wgICAgICAgICAgICAgICB7IERFQlVHX0xpc3QoIE5VTEwsIE5VTEwsIDEwICk7IH0KKyAgICB8IHRMSVNUICctJyB0RU9MCSAgICAgICB7IERFQlVHX0xpc3QoIE5VTEwsIE5VTEwsIC0xMCApOyB9CisgICAgfCB0TElTVCBsaXN0X2FyZyB0RU9MICAgICAgeyBERUJVR19MaXN0KCAmICQyLCBOVUxMLCAxMCApOyB9CisgICAgfCB0TElTVCAnLCcgbGlzdF9hcmcgdEVPTCAgeyBERUJVR19MaXN0KCBOVUxMLCAmICQzLCAtMTAgKTsgfQorICAgIHwgdExJU1QgbGlzdF9hcmcgJywnIGxpc3RfYXJnIHRFT0wgeyBERUJVR19MaXN0KCAmICQyLCAmICQ0LCAwICk7IH0KKworbGlzdF9hcmc6CisgICAgICB0TlVNCQkgICAgICAgeyAkJC5zb3VyY2VmaWxlID0gTlVMTDsgJCQubGluZSA9ICQxOyB9CisgICAgfCBwYXRobmFtZSAnOicgdE5VTQkgICAgICAgeyAkJC5zb3VyY2VmaWxlID0gJDE7ICQkLmxpbmUgPSAkMzsgfQorICAgIHwgdElERU5USUZJRVIJICAgICAgIHsgREVCVUdfR2V0RnVuY0luZm8oICYgJCQsIE5VTEwsICQxKTsgfQorICAgIHwgcGF0aG5hbWUgJzonIHRJREVOVElGSUVSIHsgREVCVUdfR2V0RnVuY0luZm8oICYgJCQsICQxLCAkMyk7IH0KKyAgICB8ICcqJyBleHByX2FkZHIJICAgICAgIHsgREVCVUdfRmluZE5lYXJlc3RTeW1ib2woICYgJDIsIEZBTFNFLCBOVUxMLCAKKwkJCQkJCQkwLCAmICQkICk7IAorIAkJCQkJICAgICBERUJVR19GcmVlRXhwck1lbSgpOyB9CiAKIHhfY29tbWFuZDoKLSAgICAgIHRFWEFNIGFkZHIgdEVPTCAgICAgICAgICB7IERFQlVHX0V4YW1pbmVNZW1vcnkoICYkMiwgMSwgJ3gnKTsgfQotICAgIHwgdEVYQU0gdEZPUk1BVCBhZGRyIHRFT0wgIHsgREVCVUdfRXhhbWluZU1lbW9yeSggJiQzLCAkMj4+OCwgJDImMHhmZiApOyB9CisgICAgICB0RVhBTSBleHByX2FkZHIgdEVPTCAgICAgeyBERUJVR19FeGFtaW5lTWVtb3J5KCAmJDIsIDEsICd4Jyk7IAorIAkJCQkJICAgICBERUJVR19GcmVlRXhwck1lbSgpOyB9CisgICAgfCB0RVhBTSB0Rk9STUFUIGV4cHJfYWRkciB0RU9MICB7IERFQlVHX0V4YW1pbmVNZW1vcnkoICYkMywgJDI+PjgsICQyJjB4ZmYgKTsgCisgCQkJCQkgICAgIERFQlVHX0ZyZWVFeHByTWVtKCk7IH0KIAogcHJpbnRfY29tbWFuZDoKLSAgICAgIHRQUklOVCBhZGRyIHRFT0wgICAgICAgICB7IERFQlVHX1ByaW50KCAmJDIsIDEsICd4JyApOyB9Ci0gICAgfCB0UFJJTlQgdEZPUk1BVCBhZGRyIHRFT0wgeyBERUJVR19QcmludCggJiQzLCAkMiA+PiA4LCAkMiAmIDB4ZmYgKTsgfQorICAgICAgdFBSSU5UIGV4cHJfYWRkciB0RU9MICAgIHsgREVCVUdfUHJpbnQoICYkMiwgMSwgMCwgMCApOyAKKyAJCQkJCSAgICAgREVCVUdfRnJlZUV4cHJNZW0oKTsgfQorICAgIHwgdFBSSU5UIHRGT1JNQVQgZXhwcl9hZGRyIHRFT0wgeyBERUJVR19QcmludCggJiQzLCAkMiA+PiA4LCAkMiAmIDB4ZmYsIDAgKTsgCisgCQkJCQkgICAgIERFQlVHX0ZyZWVFeHByTWVtKCk7IH0KIAogYnJlYWtfY29tbWFuZDoKLSAgICAgIHRCUkVBSyAnKicgYWRkciB0RU9MICAgICB7IERFQlVHX0FkZEJyZWFrcG9pbnQoICYkMyApOyB9Ci0gICAgfCB0QlJFQUsgc3ltYm9sIHRFT0wgICAgICAgeyBERUJVR19BZGRCcmVha3BvaW50KCAmJDIgKTsgfQotICAgIHwgdEJSRUFLIHN5bWJvbCAnKycgZXhwciB0RU9MIHsgREJHX0FERFIgYWRkciA9ICQyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkci5vZmYgKz0gJDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUJVR19BZGRCcmVha3BvaW50KCAmYWRkciApOyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfCB0QlJFQUsgdEVPTCAgICAgICAgICAgICAgeyBEQkdfQUREUiBhZGRyID0geyBDU19yZWcoJkRFQlVHX2NvbnRleHQpLAorICAgICAgdEJSRUFLICcqJyBleHByX2FkZHIgdEVPTCB7IERFQlVHX0FkZEJyZWFrcG9pbnQoICYkMyApOyAKKyAJCQkJCSAgICAgREVCVUdfRnJlZUV4cHJNZW0oKTsgfQorICAgIHwgdEJSRUFLIHRJREVOVElGSUVSIHRFT0wgIHsgREJHX0FERFIgYWRkcjsKKwkJCQkgaWYoIERFQlVHX0dldFN5bWJvbFZhbHVlKCQyLCAtMSwgJmFkZHIsIFRSVUUpICkKKwkJCQkgICB7CisJCQkJICAgICBERUJVR19BZGRCcmVha3BvaW50KCAmYWRkciApOworCQkJCSAgIH0KKwkJCQkgZWxzZQorCQkJCSAgIHsKKwkJCQkgICAgIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWRkIGJyZWFrcG9pbnRcbiIpOworCQkJCSAgIH0KKwkJCQl9CisgICAgfCB0QlJFQUsgdElERU5USUZJRVIgJzonIHROVU0gdEVPTCAgeyBEQkdfQUREUiBhZGRyOworCQkJCSBpZiggREVCVUdfR2V0U3ltYm9sVmFsdWUoJDIsICQ0LCAmYWRkciwgVFJVRSkgKQorCQkJCSAgIHsKKwkJCQkgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CisJCQkJICAgfQorCQkJCSBlbHNlCisJCQkJICAgeworCQkJCSAgICAgZnByaW50ZihzdGRlcnIsIlVuYWJsZSB0byBhZGQgYnJlYWtwb2ludFxuIik7CisJCQkJICAgfQorCQkJCX0KKyAgICB8IHRCUkVBSyB0TlVNIHRFT0wJICAgICAgIHsgc3RydWN0IG5hbWVfaGFzaCAqbmg7CisJCQkJIERCR19BRERSIGFkZHIgPSB7IE5VTEwsCisJCQkJCQkgICBDU19yZWcoJkRFQlVHX2NvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlQX3JlZygmREVCVUdfY29udGV4dCkgfTsKKworCQkJCSBEQkdfRklYX0FERFJfU0VHKCAmYWRkciwgQ1NfcmVnKCZERUJVR19jb250ZXh0KSApOworCQkJCSBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCgmYWRkciwgVFJVRSwKKwkJCQkJCQkgJm5oLCAwLCBOVUxMKTsKKwkJCQkgaWYoIG5oICE9IE5VTEwgKQorCQkJCSAgIHsKKwkJCQkgICAgIERFQlVHX0dldExpbmVOdW1iZXJBZGRyKG5oLCAKKwkJCQkJCSAgICAgICQyLCAmYWRkciwgVFJVRSk7CisJCQkJICAgICBERUJVR19BZGRCcmVha3BvaW50KCAmYWRkciApOworCQkJCSAgIH0KKwkJCQkgZWxzZQorCQkJCSAgIHsKKwkJCQkgICAgIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gYWRkIGJyZWFrcG9pbnRcbiIpOworCQkJCSAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICB8IHRCUkVBSyB0RU9MICAgICAgICAgICAgICB7IERCR19BRERSIGFkZHIgPSB7IE5VTEwsCisJCQkJCQkgICBDU19yZWcoJkRFQlVHX2NvbnRleHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlQX3JlZygmREVCVUdfY29udGV4dCkgfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBpbmZvX2NvbW1hbmQ6CiAgICAgICB0SU5GTyB0QlJFQUsgdEVPTCAgICAgICAgIHsgREVCVUdfSW5mb0JyZWFrcG9pbnRzKCk7IH0KLSAgICB8IHRJTkZPIHRDTEFTUyBleHByIHRFT0wgICAgeyBDTEFTU19EdW1wQ2xhc3MoIChDTEFTUyAqKSQzICk7IH0KLSAgICB8IHRJTkZPIHRNT0RVTEUgZXhwciB0RU9MICAgeyBNT0RVTEVfRHVtcE1vZHVsZSggJDMgKTsgfQotICAgIHwgdElORk8gdFFVRVVFIGV4cHIgdEVPTCAgICB7IFFVRVVFX0R1bXBRdWV1ZSggJDMgKTsgfQorICAgIHwgdElORk8gdENMQVNTIGV4cHJfdmFsdWUgdEVPTCAgICB7IENMQVNTX0R1bXBDbGFzcyggKENMQVNTICopJDMgKTsgCisgCQkJCQkgICAgIERFQlVHX0ZyZWVFeHByTWVtKCk7IH0KKyAgICB8IHRJTkZPIHRTSEFSRSB0RU9MCQl7IERFQlVHX0luZm9TaGFyZSgpOyB9CisgICAgfCB0SU5GTyB0TU9EVUxFIGV4cHJfdmFsdWUgdEVPTCAgIHsgTU9EVUxFX0R1bXBNb2R1bGUoICQzICk7IAorIAkJCQkJICAgICBERUJVR19GcmVlRXhwck1lbSgpOyB9CisgICAgfCB0SU5GTyB0UVVFVUUgZXhwcl92YWx1ZSB0RU9MICAgIHsgUVVFVUVfRHVtcFF1ZXVlKCAkMyApOyAKKyAJCQkJCSAgICAgREVCVUdfRnJlZUV4cHJNZW0oKTsgfQogICAgIHwgdElORk8gdFJFR1MgdEVPTCAgICAgICAgICB7IERFQlVHX0luZm9SZWdpc3RlcnMoKTsgfQotICAgIHwgdElORk8gdFNFR01FTlRTIGV4cHIgdEVPTCB7IExEVF9QcmludCggU0VMRUNUT1JfVE9fRU5UUlkoJDMpLCAxICk7IH0KKyAgICB8IHRJTkZPIHRTRUdNRU5UUyBleHByX3ZhbHVlIHRFT0wgeyBMRFRfUHJpbnQoIFNFTEVDVE9SX1RPX0VOVFJZKCQzKSwgMSApOyAKKyAJCQkJCSAgICAgREVCVUdfRnJlZUV4cHJNZW0oKTsgfQogICAgIHwgdElORk8gdFNFR01FTlRTIHRFT0wgICAgICB7IExEVF9QcmludCggMCwgLTEgKTsgfQogICAgIHwgdElORk8gdFNUQUNLIHRFT0wgICAgICAgICB7IERFQlVHX0luZm9TdGFjaygpOyB9Ci0gICAgfCB0SU5GTyB0V05EIGV4cHIgdEVPTCAgICAgIHsgV0lOX0R1bXBXaW5kb3coICQzICk7IH0gCisgICAgfCB0SU5GTyB0V05EIGV4cHJfdmFsdWUgdEVPTCAgICAgIHsgV0lOX0R1bXBXaW5kb3coICQzICk7IAorIAkJCQkJICAgICBERUJVR19GcmVlRXhwck1lbSgpOyB9CiAgICAgfCB0SU5GTyB0TE9DQUwgdEVPTCAgICAgICAgIHsgREVCVUdfSW5mb0xvY2FscygpOyB9CisgICAgfCB0SU5GTyB0RElTUExBWSB0RU9MICAgICAgIHsgREVCVUdfSW5mb0Rpc3BsYXkoKTsgfQogCiB3YWxrX2NvbW1hbmQ6CiAgICAgICB0V0FMSyB0Q0xBU1MgdEVPTCAgICAgICAgIHsgQ0xBU1NfV2Fsa0NsYXNzZXMoKTsgfQpAQCAtMTU4LDcwICsyNTcsNzggQEAKICAgICB8IHRXQUxLIHRXTkQgdEVPTCAgICAgICAgICAgeyBXSU5fV2Fsa1dpbmRvd3MoIDAsIDAgKTsgfQogICAgIHwgdFdBTEsgdFdORCB0TlVNIHRFT0wgICAgICB7IFdJTl9XYWxrV2luZG93cyggJDMsIDAgKTsgfQogCi1zeW1ib2w6Ci0gICAgdElERU5USUZJRVIgICAgICAgICAgICB7IGlmICghREVCVUdfR2V0U3ltYm9sVmFsdWUoICQxLCAtMSwgJiQkICkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTeW1ib2wgJXMgbm90IGZvdW5kXG4iLCAkMSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB8IHRJREVOVElGSUVSICc6JyB0TlVNIHsgaWYgKCFERUJVR19HZXRTeW1ib2xWYWx1ZSggJDEsICQzLCAmJCQgKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk5vIGNvZGUgYXQgJXM6JWRcbiIsICQxLCAkMyApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlZRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KK2V4cHJfYWRkcjoKKyAgICBleHByCQkJIHsgJCQgPSBERUJVR19FdmFsRXhwcigkMSkgfQogCi1hZGRyOgotICAgICAgZXhwciAgICAgICAgICAgICAgICAgICAgICAgeyAkJC5zZWcgPSAweGZmZmZmZmZmOyAkJC5vZmYgPSAkMTsgfQotICAgIHwgc2VnYWRkciAgICAgICAgICAgICAgICAgICAgeyAkJCA9ICQxOyB9Ci0KLXNlZ2FkZHI6Ci0gICAgICBleHByICc6JyBleHByICAgICAgICAgICAgICB7ICQkLnNlZyA9ICQxOyAkJC5vZmYgPSAkMzsgfQotICAgIHwgc3ltYm9sICAgICAgICAgICAgICAgICAgICAgeyAkJCA9ICQxOyB9Ci0gICAgfCBzeW1ib2wgJysnIGV4cHIgICAgICAgICAgICB7ICQkID0gJDE7ICQkLm9mZiArPSAkMzsgfQotICAgIHwgc3ltYm9sICctJyBleHByICAgICAgICAgICAgeyAkJCA9ICQxOyAkJC5vZmYgLT0gJDM7IH0KLQorZXhwcl92YWx1ZToKKyAgICAgIGV4cHIgICAgICAgIHsgREJHX0FERFIgYWRkciAgPSBERUJVR19FdmFsRXhwcigkMSk7CisJCSAgICAkJCA9ICoodW5zaWduZWQgaW50ICopIGFkZHIub2ZmOyB9CisvKgorICogVGhlIGV4cHIgcnVsZSBidWlsZHMgYW4gZXhwcmVzc2lvbiB0cmVlLiAgV2hlbiB3ZSBhcmUgZG9uZSwgd2UgY2FsbAorICogRXZhbEV4cHIgdG8gZXZhbHVhdGUgdGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiAgVGhlIGFkdmFudGFnZSBvZgorICogdGhlIHR3by1zdGVwIGFwcHJvYWNoIGlzIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gc2F2ZSBleHByZXNzaW9ucyBmb3IKKyAqIHVzZSBpbiAnZGlzcGxheScgY29tbWFuZHMsIGFuZCBpbiBjb25kaXRpb25hbCB3YXRjaHBvaW50cy4KKyAqLwogZXhwcjoKLSAgICAgIHROVU0gICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSAkMTsgfQotICAgIHwgdFJFRyAgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IERFQlVHX0dldFJlZ2lzdGVyKCQxKTsgfQotICAgIHwgZXhwciBPUF9MT1IgZXhwciAgICAgICAgICAgeyAkJCA9ICQxIHx8ICQzOyB9Ci0gICAgfCBleHByIE9QX0xBTkQgZXhwciAgICAgICAgICB7ICQkID0gJDEgJiYgJDM7IH0KLSAgICB8IGV4cHIgJ3wnIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSAkMSB8ICQzOyB9Ci0gICAgfCBleHByICcmJyBleHByICAgICAgICAgICAgICB7ICQkID0gJDEgJiAkMzsgfQotICAgIHwgZXhwciAnXicgZXhwciAgICAgICAgICAgICAgeyAkJCA9ICQxIF4gJDM7IH0KLSAgICB8IGV4cHIgT1BfRVEgZXhwciAgICAgICAgICAgIHsgJCQgPSAkMSA9PSAkMzsgfQotICAgIHwgZXhwciAnPicgZXhwciAgICAgICAgICAgICAgeyAkJCA9ICQxID4gJDM7IH0KLSAgICB8IGV4cHIgJzwnIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSAkMSA8ICQzOyB9Ci0gICAgfCBleHByIE9QX0dFIGV4cHIgICAgICAgICAgICB7ICQkID0gJDEgPj0gJDM7IH0KLSAgICB8IGV4cHIgT1BfTEUgZXhwciAgICAgICAgICAgIHsgJCQgPSAkMSA8PSAkMzsgfQotICAgIHwgZXhwciBPUF9ORSBleHByICAgICAgICAgICAgeyAkJCA9ICQxICE9ICQzOyB9Ci0gICAgfCBleHByIE9QX1NITCBleHByICAgICAgICAgICB7ICQkID0gKHVuc2lnbmVkKSQxIDw8ICQzOyB9Ci0gICAgfCBleHByIE9QX1NIUiBleHByICAgICAgICAgICB7ICQkID0gKHVuc2lnbmVkKSQxID4+ICQzOyB9Ci0gICAgfCBleHByICcrJyBleHByICAgICAgICAgICAgICB7ICQkID0gJDEgKyAkMzsgfQotICAgIHwgZXhwciAnLScgZXhwciAgICAgICAgICAgICAgeyAkJCA9ICQxIC0gJDM7IH0KLSAgICB8IGV4cHIgJyonIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSAkMSAqICQzOyB9Ci0gICAgfCBleHByICcvJyBleHByICAgICAgICAgICAgICB7IGlmICgkMykgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJDMgPT0gLTEgJiYgJDEgPT0gMHg4MDAwMDAwMGwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeXllcnJvciAoIkRpdmlzaW9uIG92ZXJmbG93Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICQkID0gJDEgLyAkMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB5eWVycm9yICgiRGl2aXNpb24gYnkgemVybyIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIHwgZXhwciAnJScgZXhwciAgICAgICAgICAgICAgeyBpZiAoJDMpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCQzID09IC0xICYmICQxID09IDB4ODAwMDAwMDBsKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQkID0gMDsgLyogQSBzZW5zaWJsZSByZXN1bHQgaW4gdGhpcyBjYXNlLiAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgJCQgPSAkMSAlICQzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHl5ZXJyb3IgKCJEaXZpc2lvbiBieSB6ZXJvIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgfCAnLScgZXhwciAlcHJlYyBPUF9TSUdOICAgICB7ICQkID0gLSQyOyB9CisgICAgICB0TlVNICAgICAgICAgICAgICAgICAgICAgICB7ICQkID0gREVCVUdfQ29uc3RFeHByKCQxKTsgfQorICAgIHwgdFNUUklORwkJCSB7ICQkID0gREVCVUdfU3RyaW5nRXhwcigkMSk7IH0KKyAgICB8IHRSRUcgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19SZWdpc3RlckV4cHIoJDEpOyB9CisgICAgfCB0SURFTlRJRklFUgkJIHsgJCQgPSBERUJVR19TeW1ib2xFeHByKCQxKTsgfQorICAgIHwgZXhwciBPUF9EUkYgdElERU5USUZJRVIJIHsgJCQgPSBERUJVR19TdHJ1Y3RQRXhwcigkMSwgJDMpOyB9IAorICAgIHwgZXhwciAnLicgdElERU5USUZJRVIJIHsgJCQgPSBERUJVR19TdHJ1Y3RFeHByKCQxLCAkMyk7IH0gCisgICAgfCB0SURFTlRJRklFUiAnKCcgJyknCSB7ICQkID0gREVCVUdfQ2FsbEV4cHIoJDEsIDApOyB9IAorICAgIHwgdElERU5USUZJRVIgJygnIGV4cHIgJyknCSB7ICQkID0gREVCVUdfQ2FsbEV4cHIoJDEsIDEsICQzKTsgfSAKKyAgICB8IHRJREVOVElGSUVSICcoJyBleHByICcsJyBleHByICcpJwkgeyAkJCA9IERFQlVHX0NhbGxFeHByKCQxLCAyLCAkMywgCisJCQkJCQkJICAgICAgICQ1KTsgfSAKKyAgICB8IHRJREVOVElGSUVSICcoJyBleHByICcsJyBleHByICcsJyBleHByICcpJwkgeyAkJCA9IERFQlVHX0NhbGxFeHByKCQxLCAzLCAkMywgJDUsICQ3KTsgfSAKKyAgICB8IHRJREVOVElGSUVSICcoJyBleHByICcsJyBleHByICcsJyBleHByICcsJyBleHByICcpJwkgeyAkJCA9IERFQlVHX0NhbGxFeHByKCQxLCAzLCAkMywgJDUsICQ3LCAkOSk7IH0gCisgICAgfCB0SURFTlRJRklFUiAnKCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnLCcgZXhwciAnKScJIHsgJCQgPSBERUJVR19DYWxsRXhwcigkMSwgMywgJDMsICQ1LCAkNywgJDksICQxMSk7IH0gCisgICAgfCBleHByICdbJyBleHByICddJwkJIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0FSUiwgJDEsICQzKTsgfSAKKyAgICB8IGV4cHIgJzonIGV4cHIJCSB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9TRUcsICQxLCAkMyk7IH0gCisgICAgfCBleHByIE9QX0xPUiBleHByICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9MT1IsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgT1BfTEFORCBleHByICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0xBTkQsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgJ3wnIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX09SLCAkMSwgJDMpOyB9CisgICAgfCBleHByICcmJyBleHByICAgICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9BTkQsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgJ14nIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX1hPUiwgJDEsICQzKTsgfQorICAgIHwgZXhwciBPUF9FUSBleHByICAgICAgICAgICAgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfRVEsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgJz4nIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0dULCAkMSwgJDMpOyB9CisgICAgfCBleHByICc8JyBleHByICAgICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9MVCwgJDEsICQzKTsgfQorICAgIHwgZXhwciBPUF9HRSBleHByICAgICAgICAgICAgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfR0UsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgT1BfTEUgZXhwciAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0xFLCAkMSwgJDMpOyB9CisgICAgfCBleHByIE9QX05FIGV4cHIgICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9ORSwgJDEsICQzKTsgfQorICAgIHwgZXhwciBPUF9TSEwgZXhwciAgICAgICAgICAgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfU0hMLCAkMSwgJDMpOyB9CisgICAgfCBleHByIE9QX1NIUiBleHByICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9TSFIsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgJysnIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0FERCwgJDEsICQzKTsgfQorICAgIHwgZXhwciAnLScgZXhwciAgICAgICAgICAgICAgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfU1VCLCAkMSwgJDMpOyB9CisgICAgfCBleHByICcqJyBleHByICAgICAgICAgICAgICB7ICQkID0gREVCVUdfQmlub3BFeHByKEVYUF9PUF9NVUwsICQxLCAkMyk7IH0KKyAgICB8IGV4cHIgJy8nIGV4cHIgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19CaW5vcEV4cHIoRVhQX09QX0RJViwgJDEsICQzKTsgfQorICAgIHwgZXhwciAnJScgZXhwciAgICAgICAgICAgICAgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfUkVNLCAkMSwgJDMpOyB9CisgICAgfCAnLScgZXhwciAlcHJlYyBPUF9TSUdOICAgICB7ICQkID0gREVCVUdfVW5vcEV4cHIoRVhQX09QX05FRywgJDIpOyB9CiAgICAgfCAnKycgZXhwciAlcHJlYyBPUF9TSUdOICAgICB7ICQkID0gJDI7IH0KLSAgICB8ICchJyBleHByICAgICAgICAgICAgICAgICAgIHsgJCQgPSAhJDI7IH0KLSAgICB8ICd+JyBleHByICAgICAgICAgICAgICAgICAgIHsgJCQgPSB+JDI7IH0KKyAgICB8ICchJyBleHByICAgICAgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19Vbm9wRXhwcihFWFBfT1BfTk9ULCAkMik7IH0KKyAgICB8ICd+JyBleHByICAgICAgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19Vbm9wRXhwcihFWFBfT1BfTE5PVCwgJDIpOyB9CiAgICAgfCAnKCcgZXhwciAnKScgICAgICAgICAgICAgICB7ICQkID0gJDI7IH0KLS8qIEZvciBwYXJzZXIgdGVjaG5pY2FsIHJlYXNvbnMgd2UgY2FuJ3QgdXNlICJhZGRyIiBoZXJlLiAgKi8KLSAgICB8ICcqJyBleHByICVwcmVjIE9QX0RFUkVGICAgIHsgREJHX0FERFIgYWRkciA9IHsgMHhmZmZmZmZmZiwgJDIgfTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCQgPSBERUJVR19SZWFkTWVtb3J5KCAmYWRkciApOyB9Ci0gICAgfCAnKicgc2VnYWRkciAlcHJlYyBPUF9ERVJFRiB7ICQkID0gREVCVUdfUmVhZE1lbW9yeSggJiQyICk7IH0KKyAgICB8ICcqJyBleHByICVwcmVjIE9QX0RFUkVGICAgIHsgJCQgPSBERUJVR19Vbm9wRXhwcihFWFBfT1BfREVSRUYsICQyKTsgfQorICAgIHwgJyYnIGV4cHIgJXByZWMgT1BfREVSRUYgICAgeyAkJCA9IERFQlVHX1Vub3BFeHByKEVYUF9PUF9BRERSLCAkMik7IH0KKwkKKy8qCisgKiBUaGUgbHZhbHVlIHJ1bGUgYnVpbGRzIGFuIGV4cHJlc3Npb24gdHJlZS4gIFRoaXMgaXMgYSBsaW1pdGVkIGZvcm0KKyAqIG9mIGV4cHJlc3Npb24gdGhhdCBpcyBzdWl0YWJsZSB0byBiZSB1c2VkIGFzIGFuIGx2YWx1ZS4KKyAqLworbHZhbF9hZGRyOgorICAgIGx2YWwJCQkgeyAkJCA9IERFQlVHX0V2YWxFeHByKCQxKSB9CisKK2x2YWw6CisgICAgICBsdmFsdWUgICAgICAgICAgICAgICAgICAgICB7ICQkID0gJDE7IH0KKyAgICB8ICcqJyBleHByCQkJIHsgJCQgPSBERUJVR19Vbm9wRXhwcihFWFBfT1BfRk9SQ0VfREVSRUYsICQyKTsgfQorCQorbHZhbHVlOgorICAgICAgdE5VTSAgICAgICAgICAgICAgICAgICAgICAgeyAkJCA9IERFQlVHX0NvbnN0RXhwcigkMSk7IH0KKyAgICB8IHRSRUcgICAgICAgICAgICAgICAgICAgICAgIHsgJCQgPSBERUJVR19SZWdpc3RlckV4cHIoJDEpOyB9CisgICAgfCB0SURFTlRJRklFUgkJIHsgJCQgPSBERUJVR19TeW1ib2xFeHByKCQxKTsgfQorICAgIHwgbHZhbHVlIE9QX0RSRiB0SURFTlRJRklFUgkgeyAkJCA9IERFQlVHX1N0cnVjdFBFeHByKCQxLCAkMyk7IH0gCisgICAgfCBsdmFsdWUgJy4nIHRJREVOVElGSUVSCSB7ICQkID0gREVCVUdfU3RydWN0RXhwcigkMSwgJDMpOyB9IAorICAgIHwgbHZhbHVlICdbJyBleHByICddJwkgeyAkJCA9IERFQlVHX0Jpbm9wRXhwcihFWFBfT1BfQVJSLCAkMSwgJDMpOyB9IAogCQogJSUKIApAQCAtMjQ5LDcgKzM1Niw3IEBACiAgICAgc3RhdGljIGludCBsb2FkZWRfc3ltYm9scyA9IDA7CiAgICAgc3RhdGljIEJPT0wzMiBpbl9kZWJ1Z2dlciA9IEZBTFNFOwogICAgIGNoYXIgU3ltYm9sVGFibGVGaWxlWzI1Nl07Ci0gICAgaW50IGluc3RyX2xlbiA9IDAsIG5ld21vZGU7CisgICAgaW50IG5ld21vZGU7CiAgICAgQk9PTDMyIHJldF9vazsKICNpZmRlZiBZWURFQlVHCiAgICAgeXlkZWJ1ZyA9IDA7CkBAIC0yNjgsNiArMzc1LDEyIEBACiAgICAgaWYgKCFsb2FkZWRfc3ltYm9scykKICAgICB7CiAgICAgICAgIGxvYWRlZF9zeW1ib2xzKys7CisKKwkvKgorCSAqIEluaXRpYWxpemUgdGhlIHR5cGUgaGFuZGxpbmcgc3R1ZmYuCisJICovCisJREVCVUdfSW5pdFR5cGVzKCk7CisKIAkvKgogCSAqIEluIHNvbWUgY2FzZXMgd2UgY2FuIHJlYWQgdGhlIHN0YWJzIGluZm9ybWF0aW9uIGRpcmVjdGx5CiAJICogZnJvbSB0aGUgZXhlY3V0YWJsZS4gIElmIHRoaXMgaXMgdGhlIGNhc2UsIHdlIGRvbid0IG5lZWQKQEAgLTI5NCwxMiArNDA3LDIyIEBACiAgICAgICAgIERFQlVHX0xvYWRFbnRyeVBvaW50cygpOwogICAgIH0KIAotICAgIGlmICgoc2lnbmFsICE9IFNJR1RSQVApIHx8ICFERUJVR19TaG91bGRDb250aW51ZSggZGJnX2V4ZWNfbW9kZSApKQorI2lmIDAKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIGRlYnVnZ2VyIAlQQz0leCwgbW9kZT0lZCwgY291bnQ9JWRcbiIsCisJICAgIEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpLAorCSAgICBkYmdfZXhlY19tb2RlLCBkYmdfZXhlY19jb3VudCk7CisgICAgCisgICAgc2xlZXAoMSk7CisjZW5kaWYKKworICAgIGlmICgoc2lnbmFsICE9IFNJR1RSQVApIHx8ICFERUJVR19TaG91bGRDb250aW51ZSggZGJnX2V4ZWNfbW9kZSwgCisJCQkJCQkgICAgICAmZGJnX2V4ZWNfY291bnQgKSkKICAgICB7CiAgICAgICAgIERCR19BRERSIGFkZHI7CiAKICAgICAgICAgYWRkci5zZWcgPSBDU19yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOworCWFkZHIudHlwZSA9IE5VTEw7CiAgICAgICAgIERCR19GSVhfQUREUl9TRUcoICZhZGRyLCAwICk7CiAKICAgICAgICAgLyogUHV0IHRoZSBkaXNwbGF5IGluIGEgY29ycmVjdCBzdGF0ZSAqLwpAQCAtMzE0LDYgKzQzNyw4IEBACiAgICAgICAgIGlmIChuZXdtb2RlICE9IGRiZ19tb2RlKQogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkluICVkIGJpdCBtb2RlLlxuIiwgZGJnX21vZGUgPSBuZXdtb2RlKTsKIAorCURFQlVHX0RvRGlzcGxheSgpOworCiAgICAgICAgIGlmIChzaWduYWwgIT0gU0lHVFJBUCkgIC8qIFRoaXMgaXMgYSByZWFsIGNyYXNoLCBkdW1wIHNvbWUgaW5mbyAqLwogICAgICAgICB7CiAgICAgICAgICAgICBERUJVR19JbmZvUmVnaXN0ZXJzKCk7CkBAIC0zMjYsNiArNDUxLDE0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBERUJVR19CYWNrVHJhY2UoKTsKICAgICAgICAgfQorCWVsc2UKKwl7CisJICAvKgorCSAgICogRG8gYSBxdWlldCBiYWNrdHJhY2Ugc28gdGhhdCB3ZSBoYXZlIGFuIGlkZWEgb2Ygd2hhdCB0aGUgc2l0dWF0aW9uCisJICAgKiBpcyBXUlQgdGhlIHNvdXJjZSBmaWxlcy4KKwkgICAqLworCSAgICBERUJVR19TaWxlbnRCYWNrVHJhY2UoKTsKKwl9CiAKICAgICAgICAgLyogU2hvdyB3aGVyZSB3ZSBjcmFzaGVkICovCiAgICAgICAgIGN1cnJfZnJhbWUgPSAwOwpAQCAtMzMzLDkgKzQ2Niw4IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICAiKTsKICAgICAgICAgaWYgKERCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIDEgKSkKICAgICAgICAgewotICAgICAgICAgICAgREVCVUdfRGlzYXNtKCAmYWRkciApOworICAgICAgICAgICAgREVCVUdfRGlzYXNtKCAmYWRkciwgVFJVRSApOwogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7Ci0gICAgICAgICAgICBpbnN0cl9sZW4gPSBhZGRyLm9mZiAtIEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0X29rID0gMDsKQEAgLTM1Miw3ICs0ODQsMTcgQEAKICAgICAgICAgfSB3aGlsZSAoIXJldF9vayk7CiAgICAgfQogCi0gICAgREVCVUdfUmVzdGFydEV4ZWN1dGlvbiggZGJnX2V4ZWNfbW9kZSwgaW5zdHJfbGVuICk7CisgICAgZGJnX2V4ZWNfbW9kZSA9IERFQlVHX1Jlc3RhcnRFeGVjdXRpb24oIGRiZ19leGVjX21vZGUsIGRiZ19leGVjX2NvdW50ICk7CisgICAgLyoKKyAgICAgKiBUaGlzIHdpbGwgaGF2ZSBnb3R0ZW4gYWJzb3JiZWQgaW50byB0aGUgYnJlYWtwb2ludCBpbmZvCisgICAgICogaWYgaXQgd2FzIHVzZWQuICBPdGhlcndpc2UgaXQgd291bGQgaGF2ZSBiZWVuIGlnbm9yZWQuCisgICAgICogSW4gYW55IGNhc2UsIHdlIGRvbid0IG1lc3Mgd2l0aCBpdCBhbnkgbW9yZS4KKyAgICAgKi8KKyAgICBpZiggZGJnX2V4ZWNfbW9kZSA9PSBFWEVDX0NPTlQgKQorICAgICAgeworCWRiZ19leGVjX2NvdW50ID0gMDsKKyAgICAgIH0KKwogICAgIGluX2RlYnVnZ2VyID0gRkFMU0U7CiB9CiAKQEAgLTM3NSw2ICs1MTcsNyBAQAogewogICAgIGNvbnN0IGNoYXIgKm1vZHVsZSA9IE1PRFVMRV9HZXRNb2R1bGVOYW1lKCBHZXRFeGVQdHIoR2V0Q3VycmVudFRhc2soKSkgKTsKICAgICBmcHJpbnRmKCBzdGRlcnIsICIlcyBjYWxsZWQgRGVidWdCcmVha1xuIiwgbW9kdWxlID8gbW9kdWxlIDogIj8/PyIgKTsKKyAgICBERUJVR19jb250ZXh0ID0gKnJlZ3M7CiAgICAgREVCVUdfTWFpbiggU0lHVFJBUCApOwogfQogCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9kYmdtYWluLmMgYi9kZWJ1Z2dlci9kYmdtYWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzZmI4YwotLS0gL2Rldi9udWxsCisrKyBiL2RlYnVnZ2VyL2RiZ21haW4uYwpAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIEZpbGUgZGJnbWFpbi5jIC0gbWFpbiB3cmFwcGVyIGZvciBpbnRlcm5hbCBkZWJ1Z2dlciB0ZXN0IGJlZC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIEVyaWMgWW91bmdkYWxlLgorICovCisjaW5jbHVkZSA8c2lnbmFsLmg+CisKKyNpbmNsdWRlIDxsZHQuaD4KKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjaW5jbHVkZSA8dG9vbGhlbHAuaD4KKyNpbmNsdWRlIDxtb2R1bGUuaD4KKyNpbmNsdWRlIDxkZWJ1Z2dlci5oPgorI2luY2x1ZGUgPGNsYXNzLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKworI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjaW5jbHVkZSAicGVleGUuaCIKKworbGR0X2NvcHlfZW50cnkgbGR0X2NvcHlbTERUX1NJWkVdOwordW5zaWduZWQgY2hhciBsZHRfZmxhZ3NfY29weVtMRFRfU0laRV07CisKK0Rpc3BsYXkgKiBkaXNwbGF5OworCitpbnQKK1hVbmdyYWJQb2ludGVyKCBEaXNwbGF5ICogZCwgVGltZSB0KQoreworICByZXR1cm4oMCk7Cit9CisKK2ludAorWFVuZ3JhYlNlcnZlciggRGlzcGxheSAqIGQgKQoreworICByZXR1cm4oMCk7Cit9CisKK2ludAorWEZsdXNoKERpc3BsYXkgKiBkICkKK3sKKyAgcmV0dXJuKDApOworfQorCitIVEFTSzE2ICAgIEdldEN1cnJlbnRUYXNrKCkKK3sKKyAgZXhpdCgwKTsKK30KKworSE1PRFVMRTE2ICBHZXRFeGVQdHIoSEFORExFMTYgaCkKK3sKKyAgZXhpdCgwKTsKK30KKworTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUxNiBoTW9kdWxlICkKK3sKKyAgZXhpdCgwKTsKK30KKworaW50IFBST0ZJTEVfR2V0V2luZUluaVN0cmluZyggY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqa2V5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVmLCBjaGFyICpidWZmZXIsIGludCBsZW4gKQoreworICBleGl0KDApOworfQorCisKK3ZvaWQgQ0xBU1NfRHVtcENsYXNzKCBDTEFTUyAqY2xhc3MgKQoreworICBleGl0KDApOworfQorCit2b2lkIE1PRFVMRV9EdW1wTW9kdWxlKCBITU9EVUxFMTYgaG1vZHVsZSApCit7CisgIGV4aXQoMCk7Cit9CisKK3ZvaWQgUVVFVUVfRHVtcFF1ZXVlKCBIUVVFVUUxNiBoUXVldWUgKQoreworICBleGl0KDApOworfQorCit2b2lkIFdJTl9EdW1wV2luZG93KCBIV05EMzIgaHduZCApCit7CisgIGV4aXQoMCk7Cit9CisKKwordm9pZCBDTEFTU19XYWxrQ2xhc3NlcygpCit7CisgIGV4aXQoMCk7Cit9CisKK3ZvaWQgTU9EVUxFX1dhbGtNb2R1bGVzKCkKK3sKKyAgZXhpdCgwKTsKK30KKwordm9pZCBRVUVVRV9XYWxrUXVldWVzKCkKK3sKKyAgZXhpdCgwKTsKK30KKwordm9pZCBXSU5fV2Fsa1dpbmRvd3MoIEhXTkQzMiBod25kLCBpbnQgaW5kZW50ICkKK3sKKyAgZXhpdCgwKTsKK30KKworTkVfTU9EVUxFICpNT0RVTEVfR2V0UHRyKCBITU9EVUxFMTYgaE1vZHVsZSApCit7CisgIGV4aXQoMCk7Cit9CisKK0ZBUlBST0MxNiBNT0RVTEVfR2V0RW50cnlQb2ludCggSE1PRFVMRTE2IGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApCit7CisgIGV4aXQoMCk7Cit9CisKK3ZvaWQgTERUX1ByaW50KCBpbnQgc3RhcnQsIGludCBsZW5ndGggKQoreworICBleGl0KDApOworfQorCitMUFZPSUQgICAgIEdsb2JhbExvY2sxNihIR0xPQkFMMTYgaCkKK3sKKyAgZXhpdCgwKTsKK30KKworQk9PTDE2IE1vZHVsZUZpcnN0KE1PRFVMRUVOVFJZICpscE1vZHVsZSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK0JPT0wxNiBNb2R1bGVOZXh0KE1PRFVMRUVOVFJZICpscE1vZHVsZSkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK0JPT0wxNiAgICAgSXNCYWRSZWFkUHRyMTYoU0VHUFRSIHMsVUlOVDE2IG8pCit7CisgIGV4aXQoMCk7Cit9CisKK0JPT0wzMiAgICAgSXNCYWRSZWFkUHRyMzIoTFBDVk9JRCBzLFVJTlQzMiBvKQoreworICBleGl0KDApOworfQorCitzdHJ1Y3QgcXdlcnQKK3sKKyAgdW5zaWduZWQgZmxhZzE6MTsKKyAgdW5zaWduZWQgZmxhZzM6MzsKKyAgc2lnbmVkIHJlbWFpbjoxMTsKKyAgdW5zaWduZWQgd2hhdHN1cDoxNzsKK30gdnZ2OworCitpbnQgeHl6enkoY29uc3QgY2hhciAqIHF3ZSwgaW50IGlqaykKK3sKKyAgcmV0dXJuIHN0cmxlbihxd2UpICsgaWprOworfQorCit1bnNpZ25lZCBpbnQgKiB4eHg7Cit1bnNpZ25lZCBpbnQgKiB5eXk7CisKK2ludCB4eHgzWzEwXTsKKworY2hhciB2ZHZbMTAwXTsKKworc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8KK3sKKwlzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbwkqIG5leHQ7CisJY2hhcgkJCQkqIGxvYWRfYWRkcjsKKwljaGFyCQkJCSogbW9kdWxlX25hbWU7CisJY2hhcgkJCQkqIGRiZ19pbmZvOworCWludAkJCQkgIGRiZ19zaXplOworCXN0cnVjdCBQRV9EZWJ1Z19kaXIJCSogZGJnZGlyOworCXN0cnVjdCBwZV9kYXRhCQkJKiBwZTsKKyAgICAgICAgc3RydWN0IHBlX3NlZ21lbnRfdGFibGUgICAgICAgICAqIHNlY3RwOworCWludAkJCQkgIG5zZWN0OworCXNob3J0IGludAkJCSAgZGJnX2luZGV4OwkJCQorCWNoYXIJCQkJICBsb2FkZWQ7Cit9OworCitzdHJ1Y3QgQ29kZVZpZXdEZWJ1ZworeworCWNoYXIJCSAgICBjdl9uYnR5cGVbOF07CisJdW5zaWduZWQgaW50CSAgICBjdl90aW1lc3RhbXA7CisJY2hhcgkJICAgIGN2X3Vua25vd25bNF07CisJY2hhcgkJICAgIGN2X25hbWVbMV07Cit9OworCit0ZXN0X3BkYnN0dWZmKCkKK3sKKyAgc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8gZGVlZmVyOworICBzdHJ1Y3QgUEVfRGVidWdfZGlyCWRpbmZvOworICBzdHJ1Y3QgQ29kZVZpZXdEZWJ1ZyBjZGVidWc7CisgIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlIHNlY3RzWzEwXTsKKworICBtZW1zZXQoJmRlZWZlciwgMCwgc2l6ZW9mKGRlZWZlcikpOworICBtZW1zZXQoJmRpbmZvLCAwLCBzaXplb2YoZGluZm8pKTsKKyAgbWVtc2V0KCZjZGVidWcsIDAsIHNpemVvZihjZGVidWcpKTsKKyAgbWVtc2V0KCZzZWN0cywgMCwgc2l6ZW9mKHNlY3RzKSk7CisKKyAgZGVlZmVyLmRiZ19pbmZvID0gKGNoYXIgKikgJmNkZWJ1ZzsKKyAgZGluZm8udGltZXN0YW1wID0gODEyOTMyMzk1OworICBjZGVidWcuY3ZfdGltZXN0YW1wID0gODMzMzkyMTM3ICAvKiA4NDE5NTEzOTcgKi87CisgIGRlZWZlci5kYmdkaXIgPSAmZGluZm87CisgIGRlZWZlci5zZWN0cCA9ICZzZWN0czsKKyAgZGVlZmVyLm5zZWN0ID0gMTA7CisKKyAgREVCVUdfSW5pdFR5cGVzKCk7CisgIERFQlVHX1Byb2Nlc3NQREJGaWxlKCZkZWVmZXIsICIuLi9kdW1wZXhlLnBkYiIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiBhcmd2W10pCit7CisgIGV4dGVybiBjaGFyICogREVCVUdfYXJndjA7CisgIFNJR0NPTlRFWFQgIHJlZzsKKyAgCisgIHN0cmNweSh2ZHYsICJUaGlzIGlzIGEgdGVzdCIpOworICBtZW1zZXQoJnZ2diwgMHhmZiwgc2l6ZW9mKHZ2dikpOworICB2dnYud2hhdHN1cCA9IDA7CisgIHZ2di5mbGFnMyA9IDA7CisgIHZ2di5yZW1haW4gPSAweDQwMTsKKyAgREVCVUdfYXJndjAgPSBhcmd2WzBdOworICB4eHggPSAodW5zaWduZWQgaW50KikgJnZ2djsKKyAgeXl5ID0geHh4ICsgNTsKKyAgeHh4M1s1XSA9IDc7CisKKyAgdGVzdF9wZGJzdHVmZigpOworCisgIG1lbXNldCgmcmVnLCAwLCBzaXplb2YocmVnKSk7CisgIHdpbmVfZGVidWcoU0lHU0VHViwgJnJlZyk7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZGVidWcubCBiL2RlYnVnZ2VyL2RlYnVnLmwKaW5kZXggMWZjMzc3MC4uNWY2Y2NlMiAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGVidWcubAorKysgYi9kZWJ1Z2dlci9kZWJ1Zy5sCkBAIC0zNCwxMSArMzQsMjMgQEAKIERJR0lUCSAgIFswLTldCiBIRVhESUdJVCAgIFswLTlhLWZBLUZdCiBGT1JNQVQgICAgIFtiY2Rpc3d4XQotSURFTlRJRklFUiBbX2EtekEtWlwufl1bX2EtekEtWjAtOVwufkBdKgorSURFTlRJRklFUiBbX2EtekEtWn5dW19hLXpBLVowLTl+QF0qCitQQVRITkFNRSAgIFsvX2EtekEtWlwufl1bL19hLXpBLVowLTlcLn5AXSoKK1NUUklORyAgICAgXCJbXlxuIl0rXCIKKworJXMgRk9STUFUX0VYUEVDVEVECislcyBQQVRIX0VYUEVDVEVECislcyBJTkZPX0NNRAorJXMgSEVMUF9DTUQKKyVzIERFTF9DTUQKKyVzIFdBTEtfQ01ECislcyBTSE9XX0NNRAorJXMgTk9DTUQKIAogJSUKIAotXG4JCXsgc3ludGF4X2Vycm9yID0gMDsgcmV0dXJuIHRFT0w7IH0gLypJbmRpY2F0ZXMgZW5kIG9mIGNvbW1hbmQqLworXG4JCXsgQkVHSU4oMCk7IHN5bnRheF9lcnJvciA9IDA7IAorCQkgIHJldHVybiB0RU9MOyB9IC8qSW5kaWNhdGVzIGVuZCBvZiBjb21tYW5kLiAgUmVzZXQgc3RhdGUuICovCiAKICJ8fCIJCXsgcmV0dXJuIE9QX0xPUjsgfQogIiYmIgkJeyByZXR1cm4gT1BfTEFORDsgfQpAQCAtNDgsMTYgKzYwLDI0IEBACiAiPj0iCQl7IHJldHVybiBPUF9HRTsgfQogIjw8IgkJeyByZXR1cm4gT1BfU0hMOyB9CiAiPj4iCQl7IHJldHVybiBPUF9TSFI7IH0KLVstKzw9PnwmXigpKi8lOiF+XQl7IHJldHVybiAqeXl0ZXh0OyB9CisiLT4iCQl7IHJldHVybiBPUF9EUkY7IH0KK1stKzw9PnwmXigpKi8lOiF+LFwuXQl7IHJldHVybiAqeXl0ZXh0OyB9CisiWyIJCXsgcmV0dXJuICp5eXRleHQ7IH0KKyJdIgkJeyByZXR1cm4gKnl5dGV4dDsgfQogCiAiMHgie0hFWERJR0lUfSsgICAgICB7IHNzY2FuZih5eXRleHQsICIleCIsICZ5eWx2YWwuaW50ZWdlcik7IHJldHVybiB0TlVNOyB9CiB7RElHSVR9KyAgICAgICAgICAgICB7IHNzY2FuZih5eXRleHQsICIlZCIsICZ5eWx2YWwuaW50ZWdlcik7IHJldHVybiB0TlVNOyB9CiAKLSIvIntESUdJVH0re0ZPUk1BVH0gIHsgY2hhciAqIGxhc3Q7CisKKzxGT1JNQVRfRVhQRUNURUQ+Ii8ie0RJR0lUfSt7Rk9STUFUfSAgeyBjaGFyICogbGFzdDsKICAgICAgICAgICAgICAgICAgICAgICAgeXlsdmFsLmludGVnZXIgPSBzdHJ0b2woIHl5dGV4dCsxLCAmbGFzdCwgTlVMTCApOwogICAgICAgICAgICAgICAgICAgICAgICB5eWx2YWwuaW50ZWdlciA9ICh5eWx2YWwuaW50ZWdlciA8PCA4KSB8ICpsYXN0OwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdEZPUk1BVDsgfQotIi8ie0ZPUk1BVH0gICAgICAgICAgeyB5eWx2YWwuaW50ZWdlciA9ICgxIDw8IDgpIHwgeXl0ZXh0WzFdOyByZXR1cm4gdEZPUk1BVDsgfQorCisKKzxGT1JNQVRfRVhQRUNURUQ+Ii8ie0ZPUk1BVH0gICAgICAgICAgeyB5eWx2YWwuaW50ZWdlciA9ICgxIDw8IDgpIHwgeXl0ZXh0WzFdOyByZXR1cm4gdEZPUk1BVDsgfQorCit7U1RSSU5HfSB7IHl5bHZhbC5zdHJpbmcgPSBtYWtlX3N5bWJvbCh5eXRleHQpOyByZXR1cm4gdFNUUklORzsgfQogCiAkcGMgICAgIHsgeXlsdmFsLnJlZyA9IFJFR19FSVA7IHJldHVybiB0UkVHOyB9CiAkZmxhZ3MgIHsgeXlsdmFsLnJlZyA9IFJFR19FRkw7IHJldHVybiB0UkVHOyB9CkBAIC04Niw0OSArMTA2LDYwIEBACiAkZnMgICAgIHsgeXlsdmFsLnJlZyA9IFJFR19GUzsgIHJldHVybiB0UkVHOyB9CiAkZ3MgICAgIHsgeXlsdmFsLnJlZyA9IFJFR19HUzsgIHJldHVybiB0UkVHOyB9CiAKLXVwCQkJCXsgcmV0dXJuIHRVUDsgfQotZG93bnxkb3d8ZG8JCQl7IHJldHVybiB0RE9XTjsgfQotZnJhbWV8ZnJhbXxmcmF8ZnIJCXsgcmV0dXJuIHRGUkFNRTsgfQotbG9jYWxzfGxvY2FsfGxvY2F8bG9jCQl7IHJldHVybiB0TE9DQUw7IH0KLWluZm98aW5mfGluCQkJeyByZXR1cm4gdElORk87IH0KLXNob3d8c2hvfHNoCQkJeyByZXR1cm4gdElORk87IH0KLWxpc3R8bGlzfGxpfGwJCQl7IHJldHVybiB0TElTVDsgfQotYnJlYWt8YnJlYXxicmV8YnJ8YgkJeyByZXR1cm4gdEJSRUFLOyB9Ci1lbmFibGV8ZW5hYmx8ZW5hYnxlbmEJCXsgcmV0dXJuIHRFTkFCTEU7fQotZGlzYWJsZXxkaXNhYmx8ZGlzYWJ8ZGlzYXxkaXMJeyByZXR1cm4gdERJU0FCTEU7IH0KLWRlbGV0ZXxkZWxldHxkZWxlfGRlbAkJeyByZXR1cm4gdERFTEVURTsgfQotcXVpdHxxdWl8cXV8cQkJCXsgcmV0dXJuIHRRVUlUOyB9Ci1zZXR8c2UJCQkJeyByZXR1cm4gdFNFVDsgfQotd2Fsa3x3CQkJCXsgcmV0dXJuIHRXQUxLOyB9Ci14CQkJCXsgcmV0dXJuIHRFWEFNOyB9Cis8SU5JVElBTD5pbmZvfGluZnxpbgkJCXsgQkVHSU4oSU5GT19DTUQpOyByZXR1cm4gdElORk87IH0KKzxJTklUSUFMPnVwCQkJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdFVQOyB9Cis8SU5JVElBTD5kb3dufGRvd3xkbwkJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdERPV047IH0KKzxJTklUSUFMPmZyYW1lfGZyYW18ZnJhfGZyCQl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRGUkFNRTsgfQorPElOSVRJQUw+bGlzdHxsaXN8bGl8bAkJCXsgQkVHSU4oUEFUSF9FWFBFQ1RFRCk7IHJldHVybiB0TElTVDsgfQorPElOSVRJQUw+ZW5hYmxlfGVuYWJsfGVuYWJ8ZW5hCQl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRFTkFCTEU7fQorPElOSVRJQUw+ZGlzYWJsZXxkaXNhYmx8ZGlzYWJ8ZGlzYXxkaXMJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0RElTQUJMRTsgfQorPElOSVRJQUwsSU5GT19DTUQsREVMX0NNRD5kaXNwbGF5fGRpc3BsYXxkaXNwbHxkaXNwCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdERJU1BMQVk7IH0KKzxJTklUSUFMPnVuZGlzcGxheXx1bmRpc3BsYXx1bmRpc3BsfHVuZGlzcHx1bmRpc3x1bmRpfHVuZAl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRVTkRJU1BMQVk7IH0KKzxJTklUSUFMPmRlbGV0ZXxkZWxldHxkZWxlfGRlbAkJeyBCRUdJTihERUxfQ01EKTsgcmV0dXJuIHRERUxFVEU7IH0KKzxJTklUSUFMPnF1aXR8cXVpfHF1fHEJCQl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRRVUlUOyB9Cis8SU5JVElBTD5zZXR8c2UJCQkJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0U0VUOyB9Cis8SU5JVElBTD53YWxrfHcJCQkJeyBCRUdJTihXQUxLX0NNRCk7IHJldHVybiB0V0FMSzsgfQorPElOSVRJQUw+eAkJCQl7IEJFR0lOKEZPUk1BVF9FWFBFQ1RFRCk7IHJldHVybiB0RVhBTTsgfQorPElOSVRJQUw+aGVscHxoZWx8aGV8Ij8iCQl7IEJFR0lOKEhFTFBfQ01EKTsgcmV0dXJuIHRIRUxQOyB9CiAKLWNsYXNzfGNsYXN8Y2xhICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdENMQVNTOyB9Ci1tb2R1bGV8bW9kdWx8bW9kdXxtb2QgICAgICAgICAgIHsgcmV0dXJuIHRNT0RVTEU7IH0KLXF1ZXVlfHF1ZXV8cXVlCQkJeyByZXR1cm4gdFFVRVVFOyB9Ci1yZWdpc3RlcnN8cmVnc3xyZWd8cmUJCXsgcmV0dXJuIHRSRUdTOyB9Ci1zZWdtZW50c3xzZWdtZW50fHNlZ218c2VnfHNlCXsgcmV0dXJuIHRTRUdNRU5UUzsgfQotc3RhY2t8c3RhY3xzdGF8c3QgICAgIAkJeyByZXR1cm4gdFNUQUNLOyB9Ci13aW5kb3d8d2luZG98d2luZHx3aW58d25kCXsgcmV0dXJuIHRXTkQ7IH0KKzxJTklUSUFMPmJhY2t0cmFjZXxiYWNrdHJhY3xiYWNrdHJhfGJhY2t0fGJhY2t8YmFjfGJhfGJ0IHsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdEJBQ0tUUkFDRTsgfQorPElOSVRJQUw+d2hlcmV8d2hlcnx3aGUgICAgICAgICAgICAgICAgICB7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRCQUNLVFJBQ0U7IH0KIAotaGVscHxoZWx8aGV8Ij8iCQkJeyByZXR1cm4gdEhFTFA7IH0KKzxJTklUSUFMPmNvbnR8Y29ufGNvfGMgICAJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdENPTlQ7IH0KKzxJTklUSUFMPmNvbmRpdGlvbnxjb25kaXRpb3xjb25kaXRpfGNvbmRpdHxjb25kaXxjb25kCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdENPTkQ7IH0KKzxJTklUSUFMPnN0ZXB8c3RlfHN0fHMgICAJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdFNURVA7IH0KKzxJTklUSUFMPm5leHR8bmV4fG5lfG4gICAJCXsgQkVHSU4oTk9DTUQpOyByZXR1cm4gdE5FWFQ7IH0KKzxJTklUSUFMPnN0ZXBpfHNpCSAgIAkJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0U1RFUEk7IH0KKzxJTklUSUFMPm5leHRpfG5pCSAgIAkJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0TkVYVEk7IH0KKzxJTklUSUFMPmZpbmlzaHxmaW5pc3xmaW5pfGZpbnxmaQl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRGSU5JU0g7IH0KIAotYmFja3RyYWNlfGJhY2t0cmFjfGJhY2t0cmF8YmFja3R8YmFja3xiYWN8YmF8YnQgeyByZXR1cm4gdEJBQ0tUUkFDRTsgfQotd2hlcmV8d2hlcnx3aGUgICAgICAgICAgICAgICAgICB7IHJldHVybiB0QkFDS1RSQUNFOyB9Cis8SU5JVElBTD5hYm9ydHxhYm9yfGFibyAgICAgICAgIAl7IEJFR0lOKE5PQ01EKTsgcmV0dXJuIHRBQk9SVDsgfQorPElOSVRJQUw+cHJpbnR8cHJpbnxwcml8cHJ8cAkJeyBCRUdJTihGT1JNQVRfRVhQRUNURUQpOyByZXR1cm4gdFBSSU5UOyB9CiAKLWNvbnR8Y29ufGNvfGMgICAJCXsgcmV0dXJuIHRDT05UOyB9Ci1zdGVwfHN0ZXxzdHxzICAgCQl7IHJldHVybiB0U1RFUDsgfQotbmV4dHxuZXh8bmV8biAgIAkJeyByZXR1cm4gdE5FWFQ7IH0KKzxJTklUSUFMPm1vZGUJCQkJeyBCRUdJTihOT0NNRCk7IHJldHVybiB0TU9ERTsgfQorPElOSVRJQUw+c2hvd3xzaG98c2gJCQl7IEJFR0lOKFNIT1dfQ01EKTsgcmV0dXJuIHRTSE9XOyB9CiAKLXN5bWJvbGZpbGV8c3ltYm9sZmlsfHN5bWJvbGZpfHN5bWJvbGZ8c3ltYm9sfHN5bWJvfHN5bWIgeyByZXR1cm4gdFNZTUJPTEZJTEU7IH0KKzxJTkZPX0NNRCxJTklUSUFMPmJyZWFrfGJyZWF8YnJlfGJyfGIJeyBCRUdJTihQQVRIX0VYUEVDVEVEKTsgcmV0dXJuIHRCUkVBSzsgfQogCi1kZWZpbmV8ZGVmaW58ZGVmaXxkZWZ8ZGUgICAgICAgIHsgcmV0dXJuIHRERUZJTkU7IH0KLWFib3J0fGFib3J8YWJvICAgICAgICAgCSAgICAgICAgeyByZXR1cm4gdEFCT1JUOyB9Ci1wcmludHxwcmlufHByaXxwcnxwCQl7IHJldHVybiB0UFJJTlQ7IH0KKzxJTkZPX0NNRD5zaGFyZXxzaGFyfHNoYQkJeyByZXR1cm4gdFNIQVJFOyB9Cis8SU5GT19DTUQ+bG9jYWxzfGxvY2FsfGxvY2F8bG9jCQl7IHJldHVybiB0TE9DQUw7IH0KKzxJTkZPX0NNRCxXQUxLX0NNRD5jbGFzc3xjbGFzfGNsYSAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRDTEFTUzsgfQorPElORk9fQ01ELFdBTEtfQ01EPm1vZHVsZXxtb2R1bHxtb2R1fG1vZCAgeyByZXR1cm4gdE1PRFVMRTsgfQorPElORk9fQ01ELFdBTEtfQ01EPnF1ZXVlfHF1ZXV8cXVlCQkJeyByZXR1cm4gdFFVRVVFOyB9Cis8SU5GT19DTUQ+cmVnaXN0ZXJzfHJlZ3N8cmVnfHJlCQl7IHJldHVybiB0UkVHUzsgfQorPElORk9fQ01EPnNlZ21lbnRzfHNlZ21lbnR8c2VnbXxzZWd8c2UJeyByZXR1cm4gdFNFR01FTlRTOyB9Cis8SU5GT19DTUQ+c3RhY2t8c3RhY3xzdGF8c3QgICAgIAkJeyByZXR1cm4gdFNUQUNLOyB9Cis8SU5GT19DTUQsV0FMS19DTUQ+d2luZG93fHdpbmRvfHdpbmR8d2lufHduZAl7IHJldHVybiB0V05EOyB9Cis8SEVMUF9DTUQ+aW5mb3xpbmZ8aW4gICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdElORk87IH0KIAotbW9kZQkJCQl7IHJldHVybiB0TU9ERTsgfQorPElOSVRJQUwsU0hPV19DTUQ+ZGlyZWN0b3JpZXN8ZGlyZWN0b3JpZXxkaXJlY3Rvcml8ZGlyZWN0b3J8ZGlyZWN0b3xkaXJlY3R8ZGlyZWN8ZGlyZWN8ZGlyIHsgCisJCQlCRUdJTihQQVRIX0VYUEVDVEVEKTsgcmV0dXJuIHRESVI7IH0KIAoge0lERU5USUZJRVJ9CXsgeXlsdmFsLnN0cmluZyA9IG1ha2Vfc3ltYm9sKHl5dGV4dCk7IHJldHVybiB0SURFTlRJRklFUjsgfQogCis8UEFUSF9FWFBFQ1RFRD57UEFUSE5BTUV9CXsgeXlsdmFsLnN0cmluZyA9IG1ha2Vfc3ltYm9sKHl5dGV4dCk7IHJldHVybiB0UEFUSDsgfQorCisKIFsgXHRdKyAgICAgICAgLyogRWF0IHVwIHdoaXRlc3BhY2UgKi8KIAogLgkJeyBpZiAoc3ludGF4X2Vycm9yID09IDApCkBAIC0xMzcsNiArMTY4LDcgQEAKICAgICAgICAgICAgICAgICAgIH0KIAkJfQogCisKICUlCiAKICNpZm5kZWYgeXl3cmFwCkBAIC0yMTcsNyArMjQ5LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBjaGFyICpsb2NhbF9zeW1ib2xzWzEwXTsKK3N0YXRpYyBjaGFyICpsb2NhbF9zeW1ib2xzWzMwXTsKIHN0YXRpYyBpbnQgbmV4dF9zeW1ib2w7CiAKIGNoYXIgKiBtYWtlX3N5bWJvbChjaGFyICogc3ltYm9sKXsKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2Rpc3BsYXkuYyBiL2RlYnVnZ2VyL2Rpc3BsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTcwMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvZGlzcGxheS5jCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogRmlsZSBkaXNwbGF5LmMgLSBkaXNwbGF5IGhhbmRsaW5nIGZvciBXaW5lIGludGVybmFsIGRlYnVnZ2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgRXJpYyBZb3VuZ2RhbGUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5lZXhlLmg+CisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKKyNpbmNsdWRlICJ0b29saGVscC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisjZGVmaW5lIE1BWF9ESVNQTEFZIDI1CitzdGF0aWMgc3RydWN0IGV4cHIgKiBkaXNwbGF5cG9pbnRzW01BWF9ESVNQTEFZXTsKKworaW50CitERUJVR19BZGREaXNwbGF5KHN0cnVjdCBleHByICogZXhwKQoreworICBpbnQgaTsKKworICAvKgorICAgKiBGaXJzdCBmaW5kIGEgc2xvdCB3aGVyZSB3ZSBjYW4gc3RvcmUgdGhpcyBkaXNwbGF5LgorICAgKi8KKyAgZm9yKGk9MDsgaSA8IE1BWF9ESVNQTEFZOyBpKysgKQorICAgIHsKKyAgICAgIGlmKCBkaXNwbGF5cG9pbnRzW2ldID09IE5VTEwgKQorCXsKKwkgIGRpc3BsYXlwb2ludHNbaV0gPSBERUJVR19DbG9uZUV4cHIoZXhwKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorREVCVUdfSW5mb0Rpc3BsYXkoKQoreworICBpbnQgaTsKKworICAvKgorICAgKiBGaXJzdCBmaW5kIGEgc2xvdCB3aGVyZSB3ZSBjYW4gc3RvcmUgdGhpcyBkaXNwbGF5LgorICAgKi8KKyAgZm9yKGk9MDsgaSA8IE1BWF9ESVNQTEFZOyBpKysgKQorICAgIHsKKyAgICAgIGlmKCBkaXNwbGF5cG9pbnRzW2ldICE9IE5VTEwgKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiJWQgOiAiLCBpKzEpOworCSAgREVCVUdfRGlzcGxheUV4cHIoZGlzcGxheXBvaW50c1tpXSk7CisJICBmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJfQorICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworaW50CitERUJVR19Eb0Rpc3BsYXkoKQoreworICBEQkdfQUREUglhZGRyOworICBpbnQgaTsKKworICAvKgorICAgKiBGaXJzdCBmaW5kIGEgc2xvdCB3aGVyZSB3ZSBjYW4gc3RvcmUgdGhpcyBkaXNwbGF5LgorICAgKi8KKyAgZm9yKGk9MDsgaSA8IE1BWF9ESVNQTEFZOyBpKysgKQorICAgIHsKKyAgICAgIGlmKCBkaXNwbGF5cG9pbnRzW2ldICE9IE5VTEwgKQorCXsKKwkgIGFkZHIgPSBERUJVR19FdmFsRXhwcihkaXNwbGF5cG9pbnRzW2ldKTsKKwkgIGlmKCBhZGRyLnR5cGUgPT0gTlVMTCApCisJICAgIHsKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBldmFsdWF0ZSBleHByZXNzaW9uICIpOworCSAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGRpc3BsYXlwb2ludHNbaV0pOworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiXG5EaXNhYmxpbmcuLi5cbiIpOworCSAgICAgIERFQlVHX0RlbERpc3BsYXkoaSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiJWQgIDogIiwgaSArIDEpOworCSAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGRpc3BsYXlwb2ludHNbaV0pOworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiID0gIik7CisJICAgICAgREVCVUdfUHJpbnQoICZhZGRyLCAxLCAwLCAwKTsKKwkgICAgfQorCX0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorREVCVUdfRGVsRGlzcGxheShpbnQgZGlzcGxheW51bSkKK3sKKyAgaW50IGk7CisgIAorICBpZiggZGlzcGxheW51bSA+PSBNQVhfRElTUExBWSB8fCBkaXNwbGF5bnVtID09IDAgfHwgZGlzcGxheW51bSA8IC0xICkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkludmFsaWQgZGlzcGxheSBudW1iZXJcbiIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICBpZiggZGlzcGxheW51bSA9PSAtMSApCisgICAgeworICAgICAgZm9yKGk9MDsgaSA8IE1BWF9ESVNQTEFZOyBpKysgKQorCXsKKwkgIGlmKCBkaXNwbGF5cG9pbnRzW2ldICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgREVCVUdfRnJlZUV4cHIoZGlzcGxheXBvaW50c1tpXSk7CisJICAgICAgZGlzcGxheXBvaW50c1tpXSA9IE5VTEw7CisJICAgIH0KKwl9CisgICAgfQorICBlbHNlIGlmKCBkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXSAhPSBOVUxMICkKKyAgICB7CisgICAgICBERUJVR19GcmVlRXhwcihkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXSk7CisgICAgICBkaXNwbGF5cG9pbnRzW2Rpc3BsYXludW0gLSAxXSA9IE5VTEw7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2V4cHIuYyBiL2RlYnVnZ2VyL2V4cHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmY3OGVmCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvZXhwci5jCkBAIC0wLDAgKzEsODc4IEBACisvKgorICogRmlsZSBleHByLmMgLSBleHByZXNzaW9uIGhhbmRsaW5nIGZvciBXaW5lIGludGVybmFsIGRlYnVnZ2VyLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NywgRXJpYyBZb3VuZ2RhbGUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5lZXhlLmg+CisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAic2VsZWN0b3JzLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKKyNpbmNsdWRlICJ0b29saGVscC5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworI2luY2x1ZGUgImV4cHIuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCitzdHJ1Y3QgZXhwcgoreworICB1bnNpZ25lZCBpbnQJcGVybTsKKyAgdW5zaWduZWQgaW50CXR5cGU6MzE7CisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgdmFsdWU7CisgICAgfSBjb25zdGFudDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIGNvbnN0IGNoYXIgKiBzdHI7CisgICAgfSBzdHJpbmc7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICB1bnNpZ25lZCBpbnQgdmFsdWU7CisgICAgfSB1X2NvbnN0OworCisgICAgc3RydWN0CisgICAgeworICAgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgfSBzeW1ib2w7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBlbnVtIGRlYnVnX3JlZ3MgcmVnOworICAgICAgaW50CSAgICAgIHJlc3VsdDsKKyAgICB9IHJnaXN0ZXI7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgdW5vcF90eXBlOworICAgICAgc3RydWN0IGV4cHIgKiBleHAxOworICAgICAgaW50CSAgICAgIHJlc3VsdDsKKyAgICB9IHVub3A7CisKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQgYmlub3BfdHlwZTsKKyAgICAgIGludCByZXN1bHQ7CisgICAgICBzdHJ1Y3QgZXhwciAqIGV4cDE7CisgICAgICBzdHJ1Y3QgZXhwciAqIGV4cDI7CisgICAgfSBiaW5vcDsKKworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHN0cnVjdCBleHByICogZXhwMTsKKyAgICAgIGNvbnN0IGNoYXIgKiBlbGVtZW50X25hbWU7CisgICAgICBpbnQgcmVzdWx0OworICAgIH0gc3RydWN0dXJlOworCisgICAgc3RydWN0CisgICAgeworICAgICAgc3RydWN0IGV4cHIgKiBiYXNlOworICAgICAgc3RydWN0IGV4cHIgKiBpbmRleDsKKyAgICB9IGFycmF5OworCisgICAgc3RydWN0CisgICAgeworICAgICAgY29uc3QgY2hhciAgKiBmdW5jbmFtZTsKKyAgICAgIGludAkgICAgbmFyZ3M7CisgICAgICBpbnQJICAgIHJlc3VsdDsKKyAgICAgIHN0cnVjdCBleHByICogYXJnWzVdOworICAgIH0gY2FsbDsKKworICB9IHVuOworfTsKKworI2RlZmluZSBFWFBSX1RZUEVfQ09OU1QJCTAKKyNkZWZpbmUgRVhQUl9UWVBFX1VTX0NPTlNUCTEKKyNkZWZpbmUgRVhQUl9UWVBFX1NZTUJPTAkyCisjZGVmaW5lIEVYUFJfVFlQRV9SRUdJU1RFUgkzCisjZGVmaW5lIEVYUFJfVFlQRV9CSU5PUAkJNAorI2RlZmluZSBFWFBSX1RZUEVfVU5PUAkJNQorI2RlZmluZSBFWFBSX1RZUEVfU1RSVUNUCTYKKyNkZWZpbmUgRVhQUl9UWVBFX1BTVFJVQ1QJNworI2RlZmluZSBFWFBSX1RZUEVfQVJSQVkJCTgKKyNkZWZpbmUgRVhQUl9UWVBFX0NBTEwJCTkKKyNkZWZpbmUgRVhQUl9UWVBFX1NUUklORwkxMAorCitzdGF0aWMgY2hhciBleHByX2xpc3RbNDA5Nl07CitzdGF0aWMgaW50IG5leHRfZXhwcl9mcmVlID0gMDsKKworLyoKKyAqIFRoaXMgaXMgaG93IHdlIHR1cm4gYW4gZXhwcmVzc2lvbiBhZGRyZXNzIGludG8gdGhlIGFjdHVhbCB2YWx1ZS4KKyAqIFRoaXMgd29ya3Mgd2VsbCBpbiB0aGUgMzIgYml0IGRvbWFpbiAtIG5vdCBzdXJlIGF0IGFsbCBhYm91dCB0aGUKKyAqIDE2IGJpdCB3b3JsZC4KKyAqLworI2RlZmluZSBWQUwoX2V4cCkJREVCVUdfR2V0RXhwclZhbHVlKCZfZXhwLCBOVUxMKQorCitzdGF0aWMKK3N0cnVjdCBleHByICoKK0RFQlVHX0dldEZyZWVFeHByKCkKK3sKKyAgc3RydWN0IGV4cHIgKiBydG47CisKKyAgcnRuID0gIChzdHJ1Y3QgZXhwciAqKSAmZXhwcl9saXN0W25leHRfZXhwcl9mcmVlXTsKKworICBuZXh0X2V4cHJfZnJlZSArPSBzaXplb2Yoc3RydWN0IGV4cHIpOworICByZXR1cm4gcnRuOworfQorCit2b2lkCitERUJVR19GcmVlRXhwck1lbSgpCit7CisgIG5leHRfZXhwcl9mcmVlID0gMDsKK30KKworCitzdHJ1Y3QgZXhwciAqCitERUJVR19SZWdpc3RlckV4cHIoZW51bSBkZWJ1Z19yZWdzIHJlZ25vKQoreworICBzdHJ1Y3QgZXhwciAqIGV4OworCisgIGV4ID0gREVCVUdfR2V0RnJlZUV4cHIoKTsKKworICBleC0+dHlwZSAgICAgICAgPSBFWFBSX1RZUEVfUkVHSVNURVI7CisgIGV4LT51bi5yZ2lzdGVyLnJlZyA9IHJlZ25vOworICByZXR1cm4gZXg7Cit9CisKK3N0cnVjdCBleHByICoKK0RFQlVHX1N5bWJvbEV4cHIoY29uc3QgY2hhciAqIG5hbWUpCit7CisgIHN0cnVjdCBleHByICogZXg7CisKKyAgZXggPSBERUJVR19HZXRGcmVlRXhwcigpOworCisgIGV4LT50eXBlICAgICAgICA9IEVYUFJfVFlQRV9TWU1CT0w7CisgIGV4LT51bi5zeW1ib2wubmFtZSA9IG5hbWU7CisgIHJldHVybiBleDsKK30KKworc3RydWN0IGV4cHIgKgorREVCVUdfQ29uc3RFeHByKGludCB2YWx1ZSkKK3sKKyAgc3RydWN0IGV4cHIgKiBleDsKKworICBleCA9IERFQlVHX0dldEZyZWVFeHByKCk7CisKKyAgZXgtPnR5cGUgICAgICAgID0gRVhQUl9UWVBFX0NPTlNUOworICBleC0+dW4uY29uc3RhbnQudmFsdWUgPSB2YWx1ZTsKKyAgcmV0dXJuIGV4OworfQorCitzdHJ1Y3QgZXhwciAqCitERUJVR19TdHJpbmdFeHByKGNvbnN0IGNoYXIgKiBzdHIpCit7CisgIHN0cnVjdCBleHByICogZXg7CisgIGNoYXIgKiBwbnQ7CisgIGV4ID0gREVCVUdfR2V0RnJlZUV4cHIoKTsKKworICBleC0+dHlwZSAgICAgICAgPSBFWFBSX1RZUEVfU1RSSU5HOworICBleC0+dW4uc3RyaW5nLnN0ciA9IHN0cisxOworICBwbnQgPSBzdHJyY2hyKGV4LT51bi5zdHJpbmcuc3RyLCAnIicpOworICBpZiggcG50ICE9IE5VTEwgKQorICAgIHsKKyAgICAgICpwbnQgPSAgJ1wwJzsKKyAgICB9CisgIHJldHVybiBleDsKK30KKworc3RydWN0IGV4cHIgKgorREVCVUdfVVNDb25zdEV4cHIodW5zaWduZWQgaW50IHZhbHVlKQoreworICBzdHJ1Y3QgZXhwciAqIGV4OworCisgIGV4ID0gREVCVUdfR2V0RnJlZUV4cHIoKTsKKworICBleC0+dHlwZSAgICAgICAgICAgPSBFWFBSX1RZUEVfQ09OU1Q7CisgIGV4LT51bi51X2NvbnN0LnZhbHVlID0gdmFsdWU7CisgIHJldHVybiBleDsKK30KKworc3RydWN0IGV4cHIgKgorREVCVUdfQmlub3BFeHByKGludCBvcGVyYXRvcl90eXBlLCBzdHJ1Y3QgZXhwciAqIGV4cDEsIHN0cnVjdCBleHByICogZXhwMikKK3sKKyAgc3RydWN0IGV4cHIgKiBleDsKKworICBleCA9IERFQlVHX0dldEZyZWVFeHByKCk7CisKKyAgZXgtPnR5cGUgICAgICAgICAgID0gRVhQUl9UWVBFX0JJTk9QOworICBleC0+dW4uYmlub3AuYmlub3BfdHlwZSA9IG9wZXJhdG9yX3R5cGU7CisgIGV4LT51bi5iaW5vcC5leHAxICAgICA9IGV4cDE7CisgIGV4LT51bi5iaW5vcC5leHAyICAgICA9IGV4cDI7CisgIHJldHVybiBleDsKK30KKworc3RydWN0IGV4cHIgKgorREVCVUdfVW5vcEV4cHIoaW50IG9wZXJhdG9yX3R5cGUsIHN0cnVjdCBleHByICogZXhwMSkKK3sKKyAgc3RydWN0IGV4cHIgKiBleDsKKworICBleCA9IERFQlVHX0dldEZyZWVFeHByKCk7CisKKyAgZXgtPnR5cGUgICAgICAgICAgID0gRVhQUl9UWVBFX1VOT1A7CisgIGV4LT51bi51bm9wLnVub3BfdHlwZSA9IG9wZXJhdG9yX3R5cGU7CisgIGV4LT51bi51bm9wLmV4cDEgICAgICA9IGV4cDE7CisgIHJldHVybiBleDsKK30KKworc3RydWN0IGV4cHIgKgorREVCVUdfU3RydWN0RXhwcihzdHJ1Y3QgZXhwciAqIGV4cCwgY29uc3QgY2hhciAqIGVsZW1lbnQpCit7CisgIHN0cnVjdCBleHByICogZXg7CisKKyAgZXggPSBERUJVR19HZXRGcmVlRXhwcigpOworCisgIGV4LT50eXBlICAgICAgICAgICA9IEVYUFJfVFlQRV9TVFJVQ1Q7CisgIGV4LT51bi5zdHJ1Y3R1cmUuZXhwMSA9IGV4cDsKKyAgZXgtPnVuLnN0cnVjdHVyZS5lbGVtZW50X25hbWUgPSBlbGVtZW50OworICByZXR1cm4gZXg7Cit9CisKK3N0cnVjdCBleHByICoKK0RFQlVHX1N0cnVjdFBFeHByKHN0cnVjdCBleHByICogZXhwLCBjb25zdCBjaGFyICogZWxlbWVudCkKK3sKKyAgc3RydWN0IGV4cHIgKiBleDsKKworICBleCA9IERFQlVHX0dldEZyZWVFeHByKCk7CisKKyAgZXgtPnR5cGUgICAgICAgICAgID0gRVhQUl9UWVBFX1BTVFJVQ1Q7CisgIGV4LT51bi5zdHJ1Y3R1cmUuZXhwMSA9IGV4cDsKKyAgZXgtPnVuLnN0cnVjdHVyZS5lbGVtZW50X25hbWUgPSBlbGVtZW50OworICByZXR1cm4gZXg7Cit9CisKK3N0cnVjdCBleHByICoKK0RFQlVHX0NhbGxFeHByKGNvbnN0IGNoYXIgKiBmdW5jbmFtZSwgaW50IG5hcmdzLCAuLi4pCit7CisgIHN0cnVjdCBleHByICogZXg7CisgIHZhX2xpc3QgYXA7CisgIGludCBpOworCisgIGV4ID0gREVCVUdfR2V0RnJlZUV4cHIoKTsKKworICBleC0+dHlwZSAgICAgICAgICAgPSBFWFBSX1RZUEVfQ0FMTDsKKyAgZXgtPnVuLmNhbGwuZnVuY25hbWUgPSBmdW5jbmFtZTsKKyAgZXgtPnVuLmNhbGwubmFyZ3MgPSBuYXJnczsKKworICB2YV9zdGFydChhcCwgbmFyZ3MpOworICBmb3IoaT0wOyBpIDwgbmFyZ3M7IGkrKykKKyAgICB7CisgICAgICBleC0+dW4uY2FsbC5hcmdbaV0gPSB2YV9hcmcoYXAsIHN0cnVjdCBleHByICopOworICAgIH0KKyAgdmFfZW5kKGFwKTsKKyAgcmV0dXJuIGV4OworfQorCitEQkdfQUREUgorREVCVUdfRXZhbEV4cHIoc3RydWN0IGV4cHIgKiBleHApCit7CisgIERCR19BRERSCXJ0bjsKKyAgaW50CQlpOworICBEQkdfQUREUglleHAxOworICBEQkdfQUREUglleHAyOworICB1bnNpZ25lZCBpbnQJY2V4cFs1XTsKKyAgaW50CQkoKmZwdHIpKCk7CisgIGludAkJICAgIHNjYWxlMTsKKyAgaW50CQkgICAgc2NhbGUyOworICBpbnQJCSAgICBzY2FsZTM7CisgIHN0cnVjdCBkYXRhdHlwZSAqIHR5cGUxOworICBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlMjsKKworICBydG4udHlwZSA9IE5VTEw7CisgIHJ0bi5vZmYgPSBOVUxMOworICBydG4uc2VnID0gTlVMTDsKKworICBzd2l0Y2goZXhwLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEVYUFJfVFlQRV9TVFJJTkc6CisgICAgICBydG4udHlwZSA9IERFQlVHX1R5cGVTdHJpbmc7CisgICAgICBydG4ub2ZmID0gKHVuc2lnbmVkIGludCkgJmV4cC0+dW4uc3RyaW5nLnN0cjsKKyAgICAgIHJ0bi5zZWcgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQ09OU1Q6CisgICAgICBydG4udHlwZSA9IERFQlVHX1R5cGVJbnRDb25zdDsKKyAgICAgIHJ0bi5vZmYgPSAodW5zaWduZWQgaW50KSAmZXhwLT51bi5jb25zdGFudC52YWx1ZTsKKyAgICAgIHJ0bi5zZWcgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfVVNfQ09OU1Q6CisgICAgICBydG4udHlwZSA9IERFQlVHX1R5cGVVU0ludDsKKyAgICAgIHJ0bi5vZmYgPSAodW5zaWduZWQgaW50KSAmZXhwLT51bi51X2NvbnN0LnZhbHVlOworICAgICAgcnRuLnNlZyA9IDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9TWU1CT0w6CisgICAgICBpZiggIURFQlVHX0dldFN5bWJvbFZhbHVlKGV4cC0+dW4uc3ltYm9sLm5hbWUsIC0xLCAmcnRuLCBGQUxTRSApICkKKwl7CisJICBydG4udHlwZSA9IE5VTEw7CisJICBydG4ub2ZmID0gMDsKKwkgIHJ0bi5zZWcgPSAwOworCX07CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9QU1RSVUNUOgorICAgICAgZXhwMSA9ICBERUJVR19FdmFsRXhwcihleHAtPnVuLnN0cnVjdHVyZS5leHAxKTsKKyAgICAgIGlmKCBleHAxLnR5cGUgPT0gTlVMTCApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcnRuLm9mZiA9IERFQlVHX1R5cGVEZXJlZlBvaW50ZXIoJmV4cDEsICZ0eXBlMSk7CisgICAgICBpZiggdHlwZTEgPT0gTlVMTCApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcnRuLnR5cGUgPSB0eXBlMTsKKyAgICAgIERFQlVHX0ZpbmRTdHJ1Y3RFbGVtZW50KCZydG4sIGV4cC0+dW4uc3RydWN0dXJlLmVsZW1lbnRfbmFtZSwKKwkJCSAgICAgICZleHAtPnVuLnN0cnVjdHVyZS5yZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfU1RSVUNUOgorICAgICAgZXhwMSA9ICBERUJVR19FdmFsRXhwcihleHAtPnVuLnN0cnVjdHVyZS5leHAxKTsKKyAgICAgIGlmKCBleHAxLnR5cGUgPT0gTlVMTCApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcnRuID0gZXhwMTsKKyAgICAgIERFQlVHX0ZpbmRTdHJ1Y3RFbGVtZW50KCZydG4sIGV4cC0+dW4uc3RydWN0dXJlLmVsZW1lbnRfbmFtZSwKKwkJCSAgICAgICZleHAtPnVuLnN0cnVjdHVyZS5yZXN1bHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQ0FMTDoKKyAgICAgIC8qCisgICAgICAgKiBGaXJzdCwgZXZhbHVhdGUgYWxsIG9mIHRoZSBhcmd1bWVudHMuICBJZiBhbnkgb2YgdGhlbSBhcmUgbm90CisgICAgICAgKiBldmFsdWFibGUsIHRoZW4gYmFpbC4KKyAgICAgICAqLworICAgICAgZm9yKGk9MDsgaSA8IGV4cC0+dW4uY2FsbC5uYXJnczsgaSsrKQorCXsKKwkgIGV4cDEgID0gREVCVUdfRXZhbEV4cHIoZXhwLT51bi5jYWxsLmFyZ1tpXSk7CisJICBpZiggZXhwMS50eXBlID09IE5VTEwgKQorCSAgICB7CisJICAgICAgcmV0dXJuIHJ0bjsKKwkgICAgfQorCSAgY2V4cFtpXSA9IERFQlVHX0dldEV4cHJWYWx1ZSgmZXhwMSwgTlVMTCk7CisJfQorCisgICAgICAvKgorICAgICAgICogTm93IGxvb2sgdXAgdGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGl0c2VsZi4KKyAgICAgICAqLworICAgICAgaWYoICFERUJVR19HZXRTeW1ib2xWYWx1ZShleHAtPnVuLmNhbGwuZnVuY25hbWUsIC0xLCAmcnRuLCBGQUxTRSApICkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBmaW5kIHN5bWJvbFxuIik7CisJICBicmVhazsKKwl9OworCisgICAgICBmcHRyID0gKGludCAoKikoKSkgcnRuLm9mZjsKKyAgICAgIHN3aXRjaChleHAtPnVuLmNhbGwubmFyZ3MpCisJeworCWNhc2UgMDoKKwkgIGV4cC0+dW4uY2FsbC5yZXN1bHQgPSAoKmZwdHIpKCk7CisJICBicmVhazsKKwljYXNlIDE6CisJICBleHAtPnVuLmNhbGwucmVzdWx0ID0gKCpmcHRyKShjZXhwWzBdKTsKKwkgIGJyZWFrOworCWNhc2UgMjoKKwkgIGV4cC0+dW4uY2FsbC5yZXN1bHQgPSAoKmZwdHIpKGNleHBbMF0sIGNleHBbMV0pOworCSAgYnJlYWs7CisJY2FzZSAzOgorCSAgZXhwLT51bi5jYWxsLnJlc3VsdCA9ICgqZnB0cikoY2V4cFswXSwgY2V4cFsxXSwgY2V4cFsyXSk7CisJICBicmVhazsKKwljYXNlIDQ6CisJICBleHAtPnVuLmNhbGwucmVzdWx0ID0gKCpmcHRyKShjZXhwWzBdLCBjZXhwWzFdLCBjZXhwWzJdLCBjZXhwWzNdKTsKKwkgIGJyZWFrOworCWNhc2UgNToKKwkgIGV4cC0+dW4uY2FsbC5yZXN1bHQgPSAoKmZwdHIpKGNleHBbMF0sIGNleHBbMV0sIGNleHBbMl0sIGNleHBbM10sIGNleHBbNF0pOworCSAgYnJlYWs7CisJfQorICAgICAgcnRuLnR5cGUgPSBERUJVR19UeXBlSW50OworICAgICAgcnRuLm9mZiA9ICh1bnNpZ25lZCBpbnQpICZleHAtPnVuLmNhbGwucmVzdWx0OworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfUkVHSVNURVI6CisgICAgICBydG4udHlwZSA9IERFQlVHX1R5cGVJbnRDb25zdDsKKyAgICAgIGV4cC0+dW4ucmdpc3Rlci5yZXN1bHQgPSBERUJVR19HZXRSZWdpc3RlcihleHAtPnVuLnJnaXN0ZXIucmVnKTsKKyAgICAgIHJ0bi5vZmYgPSAodW5zaWduZWQgaW50KSAmZXhwLT51bi5yZ2lzdGVyLnJlc3VsdDsKKyAgICAgIHJ0bi5zZWcgPSAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQklOT1A6CisgICAgICBleHAxID0gREVCVUdfRXZhbEV4cHIoZXhwLT51bi5iaW5vcC5leHAxKTsKKyAgICAgIGV4cDIgPSBERUJVR19FdmFsRXhwcihleHAtPnVuLmJpbm9wLmV4cDIpOworICAgICAgaWYoIGV4cDEudHlwZSA9PSBOVUxMIHx8IGV4cDIudHlwZSA9PSBOVUxMICkKKwl7CisJICBicmVhazsKKwl9CisgICAgICBpZiggZXhwMS50eXBlID09IERFQlVHX1R5cGVJbnRDb25zdCAmJiBleHAyLnR5cGUgPT0gREVCVUdfVHlwZUludENvbnN0ICkKKwl7CisJICBydG4udHlwZSA9IGV4cDEudHlwZTsKKwl9CisgICAgICBlbHNlCisJeworCSAgcnRuLnR5cGUgPSBERUJVR19UeXBlSW50OworCX0KKyAgICAgIHJ0bi5vZmYgPSAodW5zaWduZWQgaW50KSAmZXhwLT51bi5iaW5vcC5yZXN1bHQ7CisgICAgICBzd2l0Y2goZXhwLT51bi5iaW5vcC5iaW5vcF90eXBlKQorCXsKKwljYXNlIEVYUF9PUF9BREQ6CisJICB0eXBlMSA9IERFQlVHX0dldFBvaW50ZXJUeXBlKGV4cDEudHlwZSk7CisJICB0eXBlMiA9IERFQlVHX0dldFBvaW50ZXJUeXBlKGV4cDIudHlwZSk7CisJICBzY2FsZTEgPSAxOworCSAgc2NhbGUyID0gMTsKKwkgIGlmKCB0eXBlMSAhPSBOVUxMICYmIHR5cGUyICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGVsc2UgaWYoIHR5cGUxICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgc2NhbGUyID0gREVCVUdfR2V0T2JqZWN0U2l6ZSh0eXBlMSk7CisJICAgICAgcnRuLnR5cGUgPSBleHAxLnR5cGU7CisJICAgIH0KKwkgIGVsc2UgaWYoIHR5cGUyICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgc2NhbGUxID0gREVCVUdfR2V0T2JqZWN0U2l6ZSh0eXBlMik7CisJICAgICAgcnRuLnR5cGUgPSBleHAyLnR5cGU7CisJICAgIH0KKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpICogc2NhbGUxICArIHNjYWxlMiAqIFZBTChleHAyKSk7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9TVUI6CisJICB0eXBlMSA9IERFQlVHX0dldFBvaW50ZXJUeXBlKGV4cDEudHlwZSk7CisJICB0eXBlMiA9IERFQlVHX0dldFBvaW50ZXJUeXBlKGV4cDIudHlwZSk7CisJICBzY2FsZTEgPSAxOworCSAgc2NhbGUyID0gMTsKKwkgIHNjYWxlMyA9IDE7CisJICBpZiggdHlwZTEgIT0gTlVMTCAmJiB0eXBlMiAhPSBOVUxMICkKKwkgICAgeworCSAgICAgIGlmKCB0eXBlMSAhPSB0eXBlMiApCisJCXsKKwkJICBicmVhazsKKwkJfQorCSAgICAgIHNjYWxlMyA9IERFQlVHX0dldE9iamVjdFNpemUodHlwZTEpOworCSAgICB9CisJICBlbHNlIGlmKCB0eXBlMSAhPSBOVUxMICkKKwkgICAgeworCSAgICAgIHNjYWxlMiA9IERFQlVHX0dldE9iamVjdFNpemUodHlwZTEpOworCSAgICAgIHJ0bi50eXBlID0gZXhwMS50eXBlOworCSAgICB9CisKKwkgIGVsc2UgaWYoIHR5cGUyICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgc2NhbGUxID0gREVCVUdfR2V0T2JqZWN0U2l6ZSh0eXBlMik7CisJICAgICAgcnRuLnR5cGUgPSBleHAyLnR5cGU7CisJICAgIH0KKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpIC0gVkFMKGV4cDIpKSAvIHNjYWxlMzsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX1NFRzoKKwkgIHJ0bi5zZWcgPSBWQUwoZXhwMSk7CisgICAgICAgICAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSBWQUwoZXhwMik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9MT1I6CisJICBydG4uc2VnID0gMDsKKwkgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSB8fCBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTEFORDoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpICYmIFZBTChleHAyKSk7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9PUjoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpIHwgVkFMKGV4cDIpKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0FORDoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpICYgVkFMKGV4cDIpKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX1hPUjoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpIF4gVkFMKGV4cDIpKTsKKyAJICBicmVhazsKKwljYXNlIEVYUF9PUF9FUToKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpID09IFZBTChleHAyKSk7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9HVDoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi5iaW5vcC5yZXN1bHQgPSAoVkFMKGV4cDEpID4gVkFMKGV4cDIpKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0xUOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLmJpbm9wLnJlc3VsdCA9IChWQUwoZXhwMSkgPCBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfR0U6CisJICBydG4uc2VnID0gMDsKKwkgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSA+PSBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTEU6CisJICBydG4uc2VnID0gMDsKKwkgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSA8PSBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTkU6CisJICBydG4uc2VnID0gMDsKKwkgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSAhPSBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfU0hMOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLmJpbm9wLnJlc3VsdCA9ICgodW5zaWduZWQpIFZBTChleHAxKSA8PCBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfU0hSOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLmJpbm9wLnJlc3VsdCA9ICgodW5zaWduZWQpIFZBTChleHAxKSA8PCBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTVVMOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLmJpbm9wLnJlc3VsdCA9IChWQUwoZXhwMSkgKiBWQUwoZXhwMikpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfRElWOgorCSAgaWYoIFZBTChleHAyKSAhPSAwICkKKwkgICAgeworCSAgICAgIHJ0bi5zZWcgPSAwOworCSAgICAgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSAvIFZBTChleHAyKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJ0bi5zZWcgPSAwOworCSAgICAgIHJ0bi50eXBlID0gTlVMTDsKKwkgICAgICBydG4ub2ZmID0gMDsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfUkVNOgorCSAgaWYoIFZBTChleHAyKSAhPSAwICkKKwkgICAgeworCSAgICAgIHJ0bi5zZWcgPSAwOworCSAgICAgIGV4cC0+dW4uYmlub3AucmVzdWx0ID0gKFZBTChleHAxKSAlIFZBTChleHAyKSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHJ0bi5zZWcgPSAwOworCSAgICAgIHJ0bi50eXBlID0gTlVMTDsKKwkgICAgICBydG4ub2ZmID0gMDsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfQVJSOgorCSAgREVCVUdfQXJyYXlJbmRleCgmZXhwMSwgJnJ0biwgVkFMKGV4cDIpKTsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9VTk9QOgorICAgICAgZXhwMSA9IERFQlVHX0V2YWxFeHByKGV4cC0+dW4udW5vcC5leHAxKTsKKyAgICAgIGlmKCBleHAxLnR5cGUgPT0gTlVMTCApCisJeworCSAgYnJlYWs7CisJfQorICAgICAgcnRuLm9mZiA9ICh1bnNpZ25lZCBpbnQpICZleHAtPnVuLnVub3AucmVzdWx0OworICAgICAgaWYoIGV4cDEudHlwZSA9PSBERUJVR19UeXBlSW50Q29uc3QgKQorCXsKKwkgIHJ0bi50eXBlID0gZXhwMS50eXBlOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBydG4udHlwZSA9IERFQlVHX1R5cGVJbnQ7CisJfQorICAgICAgc3dpdGNoKGV4cC0+dW4uYmlub3AuYmlub3BfdHlwZSkKKwl7CisJY2FzZSBFWFBfT1BfTkVHOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLnVub3AucmVzdWx0ID0gLVZBTChleHAxKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX05PVDoKKwkgIHJ0bi5zZWcgPSAwOworCSAgZXhwLT51bi51bm9wLnJlc3VsdCA9ICFWQUwoZXhwMSk7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9MTk9UOgorCSAgcnRuLnNlZyA9IDA7CisJICBleHAtPnVuLnVub3AucmVzdWx0ID0gflZBTChleHAxKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0RFUkVGOgorCSAgcnRuLnNlZyA9IDA7CisJICBydG4ub2ZmID0gKHVuc2lnbmVkIGludCkgREVCVUdfVHlwZURlcmVmUG9pbnRlcigmZXhwMSwgJnJ0bi50eXBlKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0ZPUkNFX0RFUkVGOgorCSAgcnRuLnNlZyA9IDA7CisJICBydG4ub2ZmID0gKih1bnNpZ25lZCBpbnQgKikgZXhwMS5vZmY7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9BRERSOgorCSAgcnRuLnNlZyA9IDA7CisJICBydG4udHlwZSA9IERFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZShleHAxLnR5cGUpOworCSAgZXhwLT51bi51bm9wLnJlc3VsdCA9IGV4cDEub2ZmOworCSAgYnJlYWs7CisJfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCJVbmV4cGVjdGVkIGV4cHJlc3Npb24uXG4iKTsKKyAgICAgIGV4aXQoMTIzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICByZXR1cm4gcnRuOworfQorCisKK2ludAorREVCVUdfRGlzcGxheUV4cHIoc3RydWN0IGV4cHIgKiBleHApCit7CisgIGludAkJaTsKKworCisgIHN3aXRjaChleHAtPnR5cGUpCisgICAgeworICAgIGNhc2UgRVhQUl9UWVBFX1JFR0lTVEVSOgorICAgICAgREVCVUdfUHJpbnRSZWdpc3RlcihleHAtPnVuLnJnaXN0ZXIucmVnKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX1VTX0NPTlNUOgorICAgICAgZnByaW50ZihzdGRlcnIsICIldWQiLCBleHAtPnVuLnVfY29uc3QudmFsdWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQ09OU1Q6CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVkIiwgZXhwLT51bi51X2NvbnN0LnZhbHVlKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX1NUUklORzoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXCIlc1wiIiwgZXhwLT51bi5zdHJpbmcuc3RyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX1NZTUJPTDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMiICwgZXhwLT51bi5zeW1ib2wubmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9QU1RSVUNUOgorICAgICAgREVCVUdfRGlzcGxheUV4cHIoZXhwLT51bi5zdHJ1Y3R1cmUuZXhwMSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIi0+JXMiLCBleHAtPnVuLnN0cnVjdHVyZS5lbGVtZW50X25hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfU1RSVUNUOgorICAgICAgREVCVUdfRGlzcGxheUV4cHIoZXhwLT51bi5zdHJ1Y3R1cmUuZXhwMSk7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIi4lcyIsIGV4cC0+dW4uc3RydWN0dXJlLmVsZW1lbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9DQUxMOgorICAgICAgLyoKKyAgICAgICAqIEZpcnN0LCBldmFsdWF0ZSBhbGwgb2YgdGhlIGFyZ3VtZW50cy4gIElmIGFueSBvZiB0aGVtIGFyZSBub3QKKyAgICAgICAqIGV2YWx1YWJsZSwgdGhlbiBiYWlsLgorICAgICAgICovCisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzKCIsZXhwLT51bi5jYWxsLmZ1bmNuYW1lKTsKKyAgICAgIGZvcihpPTA7IGkgPCBleHAtPnVuLmNhbGwubmFyZ3M7IGkrKykKKwl7CisJICBERUJVR19EaXNwbGF5RXhwcihleHAtPnVuLmNhbGwuYXJnW2ldKTsKKwkgIGlmKCBpICE9IGV4cC0+dW4uY2FsbC5uYXJncyAtIDEgKQorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsICIsICIpOworCSAgICB9CisJfQorICAgICAgZnByaW50ZihzdGRlcnIsICIpIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9CSU5PUDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiKCAiKTsKKyAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGV4cC0+dW4uYmlub3AuZXhwMSk7CisgICAgICBzd2l0Y2goZXhwLT51bi5iaW5vcC5iaW5vcF90eXBlKQorCXsKKwljYXNlIEVYUF9PUF9BREQ6CisgCSAgZnByaW50ZihzdGRlcnIsICIgKyAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX1NVQjoKKyAJICBmcHJpbnRmKHN0ZGVyciwgIiAtICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfU0VHOgorIAkgIGZwcmludGYoc3RkZXJyLCAiOiIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTE9SOgorIAkgIGZwcmludGYoc3RkZXJyLCAiIHx8ICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTEFORDoKKyAJICBmcHJpbnRmKHN0ZGVyciwgIiAmJiAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX09SOgorIAkgIGZwcmludGYoc3RkZXJyLCAiIHwgIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9BTkQ6CisgCSAgZnByaW50ZihzdGRlcnIsICIgJiAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX1hPUjoKKyAJICBmcHJpbnRmKHN0ZGVyciwgIiBeICIpOworIAkgIGJyZWFrOworCWNhc2UgRVhQX09QX0VROgorIAkgIGZwcmludGYoc3RkZXJyLCAiID09ICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfR1Q6CisgCSAgZnByaW50ZihzdGRlcnIsICIgPiAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0xUOgorIAkgIGZwcmludGYoc3RkZXJyLCAiIDwgIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9HRToKKyAJICBmcHJpbnRmKHN0ZGVyciwgIiA+PSAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0xFOgorIAkgIGZwcmludGYoc3RkZXJyLCAiIDw9ICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTkU6CisgCSAgZnByaW50ZihzdGRlcnIsICIgIT0gIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9TSEw6CisgCSAgZnByaW50ZihzdGRlcnIsICIgPDwgIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9TSFI6CisgCSAgZnByaW50ZihzdGRlcnIsICIgPj4gIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9NVUw6CisgCSAgZnByaW50ZihzdGRlcnIsICIgKiAiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0RJVjoKKyAJICBmcHJpbnRmKHN0ZGVyciwgIiAvICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfUkVNOgorIAkgIGZwcmludGYoc3RkZXJyLCAiICUlICIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfQVJSOgorIAkgIGZwcmludGYoc3RkZXJyLCAiWyIpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGV4cC0+dW4uYmlub3AuZXhwMik7CisgICAgICBpZiggZXhwLT51bi5iaW5vcC5iaW5vcF90eXBlID09IEVYUF9PUF9BUlIgKQorCXsKKyAJICBmcHJpbnRmKHN0ZGVyciwgIl0iKTsKKwl9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIiApIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9VTk9QOgorICAgICAgc3dpdGNoKGV4cC0+dW4uYmlub3AuYmlub3BfdHlwZSkKKwl7CisJY2FzZSBFWFBfT1BfTkVHOgorIAkgIGZwcmludGYoc3RkZXJyLCAiLSIpOworCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfTk9UOgorCSAgZnByaW50ZihzdGRlcnIsICIhIik7CisJICBicmVhazsKKwljYXNlIEVYUF9PUF9MTk9UOgorCSAgZnByaW50ZihzdGRlcnIsICJ+Iik7CisgCSAgYnJlYWs7CisJY2FzZSBFWFBfT1BfREVSRUY6CisJICBmcHJpbnRmKHN0ZGVyciwgIioiKTsKKwkgIGJyZWFrOworCWNhc2UgRVhQX09QX0FERFI6CisJICBmcHJpbnRmKHN0ZGVyciwgIiYiKTsKKwkgIGJyZWFrOworCX0KKyAgICAgIERFQlVHX0Rpc3BsYXlFeHByKGV4cC0+dW4udW5vcC5leHAxKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwiVW5leHBlY3RlZCBleHByZXNzaW9uLlxuIik7CisgICAgICBleGl0KDEyMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0cnVjdCBleHByICoKK0RFQlVHX0Nsb25lRXhwcihzdHJ1Y3QgZXhwciAqIGV4cCkKK3sKKyAgaW50CQlpOworICBzdHJ1Y3QgZXhwciAqIHJ0bjsKKworICBydG4gPSAoc3RydWN0IGV4cHIgKikgeG1hbGxvYyhzaXplb2Yoc3RydWN0IGV4cHIpKTsKKworICAvKgorICAgKiBGaXJzdCBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgZXhwcmVzc2lvbiBpdHNlbGYuCisgICAqLworICAqcnRuID0gKmV4cDsKKworCisgIHN3aXRjaChleHAtPnR5cGUpCisgICAgeworICAgIGNhc2UgRVhQUl9UWVBFX1JFR0lTVEVSOgorICAgIGNhc2UgRVhQUl9UWVBFX1VTX0NPTlNUOgorICAgIGNhc2UgRVhQUl9UWVBFX0NPTlNUOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfU1RSSU5HOgorICAgICAgcnRuLT51bi5zdHJpbmcuc3RyID0geHN0cmR1cChleHAtPnVuLnN0cmluZy5zdHIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfU1lNQk9MOgorICAgICAgcnRuLT51bi5zeW1ib2wubmFtZSA9IHhzdHJkdXAoZXhwLT51bi5zeW1ib2wubmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9QU1RSVUNUOgorICAgIGNhc2UgRVhQUl9UWVBFX1NUUlVDVDoKKyAgICAgIHJ0bi0+dW4uc3RydWN0dXJlLmV4cDEgPSBERUJVR19DbG9uZUV4cHIoZXhwLT51bi5zdHJ1Y3R1cmUuZXhwMSk7CisgICAgICBydG4tPnVuLnN0cnVjdHVyZS5lbGVtZW50X25hbWUgPSB4c3RyZHVwKGV4cC0+dW4uc3RydWN0dXJlLmVsZW1lbnRfbmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9DQUxMOgorICAgICAgLyoKKyAgICAgICAqIEZpcnN0LCBldmFsdWF0ZSBhbGwgb2YgdGhlIGFyZ3VtZW50cy4gIElmIGFueSBvZiB0aGVtIGFyZSBub3QKKyAgICAgICAqIGV2YWx1YWJsZSwgdGhlbiBiYWlsLgorICAgICAgICovCisgICAgICBmb3IoaT0wOyBpIDwgZXhwLT51bi5jYWxsLm5hcmdzOyBpKyspCisJeworCSAgcnRuLT51bi5jYWxsLmFyZ1tpXSAgPSBERUJVR19DbG9uZUV4cHIoZXhwLT51bi5jYWxsLmFyZ1tpXSk7CisJfQorICAgICAgcnRuLT51bi5jYWxsLmZ1bmNuYW1lID0geHN0cmR1cChleHAtPnVuLmNhbGwuZnVuY25hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQklOT1A6CisgICAgICBydG4tPnVuLmJpbm9wLmV4cDEgPSBERUJVR19DbG9uZUV4cHIoZXhwLT51bi5iaW5vcC5leHAxKTsKKyAgICAgIHJ0bi0+dW4uYmlub3AuZXhwMiA9IERFQlVHX0Nsb25lRXhwcihleHAtPnVuLmJpbm9wLmV4cDIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfVU5PUDoKKyAgICAgIHJ0bi0+dW4udW5vcC5leHAxID0gREVCVUdfQ2xvbmVFeHByKGV4cC0+dW4udW5vcC5leHAxKTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBmcHJpbnRmKHN0ZGVyciwiVW5leHBlY3RlZCBleHByZXNzaW9uLlxuIik7CisgICAgICBleGl0KDEyMyk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgcmV0dXJuIHJ0bjsKK30KKworCisvKgorICogUmVjdXJzaXZlbHkgZ28gdGhyb3VnaCBhbiBleHByZXNzaW9uIHRyZWUgYW5kIGZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkCisgKiB3aXRoIGl0LgorICovCitpbnQKK0RFQlVHX0ZyZWVFeHByKHN0cnVjdCBleHByICogZXhwKQoreworICBpbnQgaTsKKworICBzd2l0Y2goZXhwLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEVYUFJfVFlQRV9SRUdJU1RFUjoKKyAgICBjYXNlIEVYUFJfVFlQRV9VU19DT05TVDoKKyAgICBjYXNlIEVYUFJfVFlQRV9DT05TVDoKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX1NUUklORzoKKyAgICAgIGZyZWUoKGNoYXIgKikgZXhwLT51bi5zdHJpbmcuc3RyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX1NZTUJPTDoKKyAgICAgIGZyZWUoKGNoYXIgKikgZXhwLT51bi5zeW1ib2wubmFtZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9QU1RSVUNUOgorICAgIGNhc2UgRVhQUl9UWVBFX1NUUlVDVDoKKyAgICAgIERFQlVHX0ZyZWVFeHByKGV4cC0+dW4uc3RydWN0dXJlLmV4cDEpOworICAgICAgZnJlZSgoY2hhciAqKSBleHAtPnVuLnN0cnVjdHVyZS5lbGVtZW50X25hbWUpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFWFBSX1RZUEVfQ0FMTDoKKyAgICAgIC8qCisgICAgICAgKiBGaXJzdCwgZXZhbHVhdGUgYWxsIG9mIHRoZSBhcmd1bWVudHMuICBJZiBhbnkgb2YgdGhlbSBhcmUgbm90CisgICAgICAgKiBldmFsdWFibGUsIHRoZW4gYmFpbC4KKyAgICAgICAqLworICAgICAgZm9yKGk9MDsgaSA8IGV4cC0+dW4uY2FsbC5uYXJnczsgaSsrKQorCXsKKwkgIERFQlVHX0ZyZWVFeHByKGV4cC0+dW4uY2FsbC5hcmdbaV0pOworCX0KKyAgICAgIGZyZWUoKGNoYXIgKikgZXhwLT51bi5jYWxsLmZ1bmNuYW1lKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRVhQUl9UWVBFX0JJTk9QOgorICAgICAgREVCVUdfRnJlZUV4cHIoZXhwLT51bi5iaW5vcC5leHAxKTsKKyAgICAgIERFQlVHX0ZyZWVFeHByKGV4cC0+dW4uYmlub3AuZXhwMik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEVYUFJfVFlQRV9VTk9QOgorICAgICAgREVCVUdfRnJlZUV4cHIoZXhwLT51bi51bm9wLmV4cDEpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGZwcmludGYoc3RkZXJyLCJVbmV4cGVjdGVkIGV4cHJlc3Npb24uXG4iKTsKKyAgICAgIGV4aXQoMTIzKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBmcmVlKGV4cCk7CisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvZXhwci5oIGIvZGVidWdnZXIvZXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyZDE5YmQKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9leHByLmgKQEAgLTAsMCArMSwyNiBAQAorI2RlZmluZSBFWFBfT1BfTE9SCQkweDAxCisjZGVmaW5lIEVYUF9PUF9MQU5ECQkweDAyCisjZGVmaW5lIEVYUF9PUF9PUgkJMHgwMworI2RlZmluZSBFWFBfT1BfQU5ECQkweDA0CisjZGVmaW5lIEVYUF9PUF9YT1IJCTB4MDUKKyNkZWZpbmUgRVhQX09QX0VRCQkweDA2CisjZGVmaW5lIEVYUF9PUF9HVAkJMHgwNworI2RlZmluZSBFWFBfT1BfTFQJCTB4MDgKKyNkZWZpbmUgRVhQX09QX0dFCQkweDA5CisjZGVmaW5lIEVYUF9PUF9MRQkJMHgwYQorI2RlZmluZSBFWFBfT1BfTkUJCTB4MGIKKyNkZWZpbmUgRVhQX09QX1NITAkJMHgwYworI2RlZmluZSBFWFBfT1BfU0hSCQkweDBkCisjZGVmaW5lIEVYUF9PUF9BREQJCTB4MGUKKyNkZWZpbmUgRVhQX09QX1NVQgkJMHgwZgorI2RlZmluZSBFWFBfT1BfTVVMCQkweDEwCisjZGVmaW5lIEVYUF9PUF9ESVYJCTB4MTEKKyNkZWZpbmUgRVhQX09QX1JFTQkJMHgxMgorI2RlZmluZSBFWFBfT1BfTkVHCQkweDEzCisjZGVmaW5lIEVYUF9PUF9OT1QJCTB4MjQKKyNkZWZpbmUgRVhQX09QX0xOT1QJCTB4MjUKKyNkZWZpbmUgRVhQX09QX0RFUkVGCQkweDI2CisjZGVmaW5lIEVYUF9PUF9BRERSCQkweDI3CisjZGVmaW5lIEVYUF9PUF9BUlIJCTB4MjgKKyNkZWZpbmUgRVhQX09QX1NFRwkJMHgyOQorI2RlZmluZSBFWFBfT1BfRk9SQ0VfREVSRUYJMHgyYQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaGFzaC5jIGIvZGVidWdnZXIvaGFzaC5jCmluZGV4IDBhOWRmMDEuLjI2ODRlYTAgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2hhc2guYworKysgYi9kZWJ1Z2dlci9oYXNoLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxuZWV4ZS5oPgogI2luY2x1ZGUgIm1vZHVsZS5oIgpAQCAtMTYsMjEgKzE3LDE0NyBAQAogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCi0jZGVmaW5lIE5SX05BTUVfSEFTSCAxMjgKKyNkZWZpbmUgTlJfTkFNRV9IQVNIIDE2Mzg0CisKK3N0YXRpYyBjaGFyICogcmVnX25hbWVbXSA9Cit7CisgICJlYXgiLCAiZWN4IiwgImVkeCIsICJlYngiLCAiZXNwIiwgImVicCIsICJlc2kiLCAiZWRpIgorfTsKKworCitzdHJ1Y3QgbmFtZV9oYXNoCit7CisgICAgc3RydWN0IG5hbWVfaGFzaCAqIG5leHQ7CQkvKiBVc2VkIHRvIGxvb2sgdXAgd2l0aGluIG5hbWUgaGFzaCAqLworICAgIGNoYXIgKiAgICAgICAgICAgICBuYW1lOworICAgIGNoYXIgKiAgICAgICAgICAgICBzb3VyY2VmaWxlOworCisgICAgaW50CQkgICAgICAgbl9sb2NhbHM7CisgICAgaW50CQkgICAgICAgbG9jYWxzX2FsbG9jOworICAgIFdpbmVMb2NhbHMgICAgICAgKiBsb2NhbF92YXJzOworICAKKyAgICBpbnQJCSAgICAgICBuX2xpbmVzOworICAgIGludAkJICAgICAgIGxpbmVzX2FsbG9jOworICAgIFdpbmVMaW5lTm8gICAgICAgKiBsaW5ldGFiOworCisgICAgREJHX0FERFIgICAgICAgICAgIGFkZHI7CisgICAgdW5zaWduZWQgc2hvcnQgICAgIGZsYWdzOworICAgIHVuc2lnbmVkIHNob3J0ICAgICBicmVha3BvaW50X29mZnNldDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgc3ltYm9sX3NpemU7Cit9OworCisKK3N0YXRpYyBCT09MMzIgREVCVUdfR2V0U3RhY2tTeW1ib2xWYWx1ZSggY29uc3QgY2hhciAqIG5hbWUsIERCR19BRERSICphZGRyICk7CitzdGF0aWMgaW50IHNvcnRsaXN0X3ZhbGlkID0gRkFMU0U7CisKK3N0YXRpYyBpbnQgc29ydHRhYl9uc3ltOworc3RhdGljIHN0cnVjdCBuYW1lX2hhc2ggKiogYWRkcl9zb3J0dGFiID0gTlVMTDsKIAogc3RhdGljIHN0cnVjdCBuYW1lX2hhc2ggKiBuYW1lX2hhc2hfdGFibGVbTlJfTkFNRV9IQVNIXTsKIAogc3RhdGljIHVuc2lnbmVkIGludCBuYW1lX2hhc2goIGNvbnN0IGNoYXIgKiBuYW1lICkKIHsKICAgICB1bnNpZ25lZCBpbnQgaGFzaCA9IDA7CisgICAgdW5zaWduZWQgaW50IHRtcDsKICAgICBjb25zdCBjaGFyICogcDsKIAogICAgIHAgPSBuYW1lOwogCi0gICAgd2hpbGUgKCpwKSBoYXNoID0gKGhhc2ggPDwgMTUpICsgKGhhc2ggPDwgMykgKyAoaGFzaCA+PiAzKSArICpwKys7CisgICAgd2hpbGUgKCpwKSAKKyAgICAgIHsKKwloYXNoID0gKGhhc2ggPDwgNCkgKyAqcCsrOworCisJaWYoICh0bXAgPSAoaGFzaCAmIDB4ZjAwMDAwMDApKSApCisJICB7CisJICAgIGhhc2ggXj0gdG1wID4+IDI0OworCSAgfQorCWhhc2ggJj0gfnRtcDsKKyAgICAgIH0KICAgICByZXR1cm4gaGFzaCAlIE5SX05BTUVfSEFTSDsKIH0KIAoraW50CitERUJVR19jbXBfc3ltKGNvbnN0IHZvaWQgKiBwMSwgY29uc3Qgdm9pZCAqIHAyKQoreworICBzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUxID0gKHN0cnVjdCBuYW1lX2hhc2ggKiopIHAxOworICBzdHJ1Y3QgbmFtZV9oYXNoICoqIG5hbWUyID0gKHN0cnVjdCBuYW1lX2hhc2ggKiopIHAyOworCisgIGlmKCAoKCpuYW1lMSktPmZsYWdzICYgU1lNX0lOVkFMSUQpICE9IDAgKQorICAgIHsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgaWYoICgoKm5hbWUyKS0+ZmxhZ3MgJiBTWU1fSU5WQUxJRCkgIT0gMCApCisgICAgeworICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgIGlmKCAoKm5hbWUxKS0+YWRkci5zZWcgPiAoKm5hbWUyKS0+YWRkci5zZWcgKQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiggKCpuYW1lMSktPmFkZHIuc2VnIDwgKCpuYW1lMiktPmFkZHIuc2VnICkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIGlmKCAoKm5hbWUxKS0+YWRkci5vZmYgPiAoKm5hbWUyKS0+YWRkci5vZmYgKQorICAgIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKworICBpZiggKCpuYW1lMSktPmFkZHIub2ZmIDwgKCpuYW1lMiktPmFkZHIub2ZmICkKKyAgICB7CisgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgIHJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19SZXNvcnRTeW1ib2xzCisgKgorICogUmVidWlsZCBzb3J0ZWQgbGlzdCBvZiBzeW1ib2xzLgorICovCitzdGF0aWMKK3ZvaWQKK0RFQlVHX1Jlc29ydFN5bWJvbHMoKQoreworICAgIHN0cnVjdCBuYW1lX2hhc2ggKm5oOworICAgIGludAkJbnN5bSA9IDA7CisgICAgaW50CQlpOworCisgICAgZm9yKGk9MDsgaTxOUl9OQU1FX0hBU0g7IGkrKykKKyAgICB7CisgICAgICAgIGZvciAobmggPSBuYW1lX2hhc2hfdGFibGVbaV07IG5oOyBuaCA9IG5oLT5uZXh0KQorCSAgeworCSAgICBuc3ltKys7CisJICB9CisgICAgfQorCisgICAgc29ydHRhYl9uc3ltID0gbnN5bTsKKyAgICBpZiggbnN5bSA9PSAwICkKKyAgICAgIHsKKwlyZXR1cm47CisgICAgICB9CisKKyAgICBhZGRyX3NvcnR0YWIgPSAoc3RydWN0IG5hbWVfaGFzaCAqKikgeHJlYWxsb2MoYWRkcl9zb3J0dGFiLCAKKwkJCQkJIG5zeW0gKiBzaXplb2Yoc3RydWN0IG5hbWVfaGFzaCAqKSk7CisKKyAgICBuc3ltID0gMDsKKyAgICBmb3IoaT0wOyBpPE5SX05BTUVfSEFTSDsgaSsrKQorICAgIHsKKyAgICAgICAgZm9yIChuaCA9IG5hbWVfaGFzaF90YWJsZVtpXTsgbmg7IG5oID0gbmgtPm5leHQpCisJICB7CisJICAgIGFkZHJfc29ydHRhYltuc3ltKytdID0gbmg7CisJICB9CisgICAgfQorCisgICAgcXNvcnQoYWRkcl9zb3J0dGFiLCBuc3ltLAorCSAgc2l6ZW9mKHN0cnVjdCBuYW1lX2hhc2ggKiksIERFQlVHX2NtcF9zeW0pOworICAgIHNvcnRsaXN0X3ZhbGlkID0gVFJVRTsKKworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBERUJVR19BZGRTeW1ib2wKQEAgLTM4LDQyICsxNjUsMTQzIEBACiAgKiBBZGQgYSBzeW1ib2wgdG8gdGhlIHRhYmxlLgogICovCiBzdHJ1Y3QgbmFtZV9oYXNoICoKLURFQlVHX0FkZFN5bWJvbCggY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IERCR19BRERSICphZGRyLCBjb25zdCBjaGFyICogc291cmNlICkKK0RFQlVHX0FkZFN5bWJvbCggY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IERCR19BRERSICphZGRyLCBjb25zdCBjaGFyICogc291cmNlLAorCQkgaW50IGZsYWdzKQogewogICAgIHN0cnVjdCBuYW1lX2hhc2ggICogbmV3OworICAgIHN0cnVjdCBuYW1lX2hhc2ggKm5oOworICAgIHN0YXRpYyBjaGFyICBwcmV2X3NvdXJjZVtQQVRIX01BWF0gPSB7J1wwJywgfTsKKyAgICBzdGF0aWMgY2hhciAqIHByZXZfZHVwZWRfc291cmNlID0gTlVMTDsKKyAgICBjaGFyICogYzsKICAgICBpbnQgaGFzaDsKIAorICAgIGhhc2ggPSBuYW1lX2hhc2gobmFtZSk7CisgICAgZm9yIChuaCA9IG5hbWVfaGFzaF90YWJsZVtoYXNoXTsgbmg7IG5oID0gbmgtPm5leHQpCisgICAgeworIAlpZiggKChuaC0+ZmxhZ3MgJiBTWU1fSU5WQUxJRCkgIT0gMCkgJiYgc3RyY21wKG5hbWUsIG5oLT5uYW1lKSA9PSAwICkKKyAgICAgICAgeworIAkgICAgbmgtPmFkZHIub2ZmID0gYWRkci0+b2ZmOworIAkgICAgbmgtPmFkZHIuc2VnID0gYWRkci0+c2VnOworIAkgICAgaWYoIG5oLT5hZGRyLnR5cGUgPT0gTlVMTCAmJiBhZGRyLT50eXBlICE9IE5VTEwgKQorICAgICAgICAgICAgeworIAkJbmgtPmFkZHIudHlwZSA9IGFkZHItPnR5cGU7CisgICAgICAgICAgICB9CisgCSAgICBuaC0+ZmxhZ3MgJj0gflNZTV9JTlZBTElEOworIAkgICAgcmV0dXJuIG5oOworICAgICAgICB9CisgCWlmIChuaC0+YWRkci5zZWcgPT0gYWRkci0+c2VnICYmCisgCSAgICBuaC0+YWRkci5vZmYgPT0gYWRkci0+b2ZmICYmCisgCSAgICBzdHJjbXAobmFtZSwgbmgtPm5hbWUpID09IDAgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbmg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpcnN0IHNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gZW50cnkgZm9yIHRoaXMgc3ltYm9sLiAgSWYgc28KKyAgICAgKiByZXR1cm4gaXQsIHNvIHdlIGRvbid0IGVuZCB1cCB3aXRoIGR1cGxpY2F0ZXMuCisgICAgICovCisgICAgCiAgICAgbmV3ID0gKHN0cnVjdCBuYW1lX2hhc2ggKikgeG1hbGxvYyhzaXplb2Yoc3RydWN0IG5hbWVfaGFzaCkpOwogICAgIG5ldy0+YWRkciA9ICphZGRyOwogICAgIG5ldy0+bmFtZSA9IHhzdHJkdXAobmFtZSk7CiAKICAgICBpZiggc291cmNlICE9IE5VTEwgKQogICAgICAgewotCW5ldy0+c291cmNlZmlsZSA9IHhzdHJkdXAoc291cmNlKTsKKwkvKgorCSAqIFRoaXMgaXMgYW4gZW5oYW5jZW1lbnQgdG8gcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi4gIFRoZSBpZGVhCisJICogaXMgdGhhdCB3ZSBkdXBsaWNhdGUgYSBnaXZlbiBzdHJpbmcgb25seSBvbmNlLiAgVGhpcyBpcyBhIGJpZworCSAqIHdpbiBpZiB0aGVyZSBhcmUgbG90cyBvZiBzeW1ib2xzIGRlZmluZWQgaW4gYSBnaXZlbiBzb3VyY2UgZmlsZS4KKwkgKi8KKwlpZiggc3RyY21wKHNvdXJjZSwgcHJldl9zb3VyY2UpID09IDAgKQorCSAgeworCSAgICBuZXctPnNvdXJjZWZpbGUgPSBwcmV2X2R1cGVkX3NvdXJjZTsKKwkgIH0KKwllbHNlCisJICB7CisJICAgIHN0cmNweShwcmV2X3NvdXJjZSwgc291cmNlKTsKKwkgICAgcHJldl9kdXBlZF9zb3VyY2UgPSBuZXctPnNvdXJjZWZpbGUgPSB4c3RyZHVwKHNvdXJjZSk7CisJICB9CiAgICAgICB9CiAgICAgZWxzZQogICAgICAgewogCW5ldy0+c291cmNlZmlsZSA9IE5VTEw7CiAgICAgICB9CiAKLSAgICBuZXctPm5fbGluZXMgPSAwOwotICAgIG5ldy0+bGluZXNfYWxsb2MgPSAwOwotICAgIG5ldy0+bGluZXRhYiA9IE5VTEw7CisgICAgbmV3LT5uX2xpbmVzCT0gMDsKKyAgICBuZXctPmxpbmVzX2FsbG9jCT0gMDsKKyAgICBuZXctPmxpbmV0YWIJPSBOVUxMOwogCi0gICAgbmV3LT5uX2xvY2FscyA9IDA7Ci0gICAgbmV3LT5sb2NhbHNfYWxsb2MgPSAwOwotICAgIG5ldy0+bG9jYWxfdmFycyA9IE5VTEw7CisgICAgbmV3LT5uX2xvY2Fscwk9IDA7CisgICAgbmV3LT5sb2NhbHNfYWxsb2MJPSAwOworICAgIG5ldy0+bG9jYWxfdmFycwk9IE5VTEw7CiAKLSAgICBuZXctPm5leHQgPSBOVUxMOwotICAgIGhhc2ggPSBuYW1lX2hhc2gobmFtZSk7CisgICAgbmV3LT5mbGFncwkJPSBmbGFnczsKKyAgICBuZXctPm5leHQJCT0gTlVMTDsKIAogICAgIC8qIE5vdyBpbnNlcnQgaW50byB0aGUgaGFzaCB0YWJsZSAqLwogICAgIG5ldy0+bmV4dCA9IG5hbWVfaGFzaF90YWJsZVtoYXNoXTsKICAgICBuYW1lX2hhc2hfdGFibGVbaGFzaF0gPSBuZXc7CiAKKyAgICAvKgorICAgICAqIENoZWNrIHNvbWUgaGV1cmlzdGljcyBiYXNlZCB1cG9uIHRoZSBmaWxlIG5hbWUgdG8gc2VlIHdoZXRoZXIKKyAgICAgKiB3ZSB3YW50IHRvIHN0ZXAgdGhyb3VnaCB0aGlzIGd1eSBvciBub3QuICBUaGVzZSBhcmUgbWFjaGluZSBnZW5lcmF0ZWQKKyAgICAgKiBhc3NlbWJseSBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIHRyYW5zbGF0ZSBiZXR3ZWVuIHRoZSBNUyB3YXkgb2YKKyAgICAgKiBjYWxsaW5nIHRoaW5ncyBhbmQgdGhlIEdDQyB3YXkgb2YgY2FsbGluZyB0aGluZ3MuICBJbiBnZW5lcmFsIHdlCisgICAgICogYWx3YXlzIHdhbnQgdG8gc3RlcCB0aHJvdWdoLgorICAgICAqLworICAgIGlmKCBzb3VyY2UgIT0gTlVMTCApCisgICAgICB7CisJYyA9IHN0cnJjaHIoc291cmNlLCAnLicpOworCWlmKCBjICE9IE5VTEwgJiYgc3RyY21wKGMsICIucyIpID09IDAgKQorCSAgeworCSAgICBjID0gc3RycmNocihzb3VyY2UsICcvJyk7CisJICAgIGlmKCBjICE9IE5VTEwgKQorCSAgICAgIHsKKwkJYysrOworCQlpZiggICAgKHN0cmNtcChjLCAiY2FsbGZyb20xNi5zIikgPT0gMCkKKwkJICAgIHx8IChzdHJjbXAoYywgImNhbGx0bzE2LnMiKSA9PSAwKQorCQkgICAgfHwgKHN0cmNtcChjLCAiY2FsbGZyb20zMi5zIikgPT0gMCkKKwkJICAgIHx8IChzdHJjbXAoYywgImNhbGx0bzMyLnMiKSA9PSAwKSApCisJCSAgeworCQkgICAgbmV3LT5mbGFncyB8PSBTWU1fVFJBTVBPTElORTsKKwkJICB9CisJICAgICAgfQorCSAgfQorICAgICAgfQorCisgICAgc29ydGxpc3RfdmFsaWQgPSBGQUxTRTsKICAgICByZXR1cm4gbmV3OwogfQogCitCT09MMzIgREVCVUdfTm9ybWFsaXplKHN0cnVjdCBuYW1lX2hhc2ggKiBuaCApCit7CisKKyAgLyoKKyAgICogV2UgYXJlbid0IGFkZGluZyBhbnkgbW9yZSBsb2NhbHMgb3IgbGluZW51bWJlcnMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICogRnJlZSBhbnkgc3BhcmUgbWVtb3J5IHRoYXQgd2UgbWlnaHQgaGF2ZSBhbGxvY2F0ZWQuCisgICAqLworICBpZiggbmggPT0gTlVMTCApCisgICAgeworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgIGlmKCBuaC0+bl9sb2NhbHMgIT0gbmgtPmxvY2Fsc19hbGxvYyApCisgICAgeworICAgICAgbmgtPmxvY2Fsc19hbGxvYyA9IG5oLT5uX2xvY2FsczsKKyAgICAgIG5oLT5sb2NhbF92YXJzID0geHJlYWxsb2MobmgtPmxvY2FsX3ZhcnMsCisJCQkJICBuaC0+bG9jYWxzX2FsbG9jICogc2l6ZW9mKFdpbmVMb2NhbHMpKTsKKyAgICB9CisKKyAgaWYoIG5oLT5uX2xpbmVzICE9IG5oLT5saW5lc19hbGxvYyApCisgICAgeworICAgICAgbmgtPmxpbmVzX2FsbG9jID0gbmgtPm5fbGluZXM7CisgICAgICBuaC0+bGluZXRhYiA9IHhyZWFsbG9jKG5oLT5saW5ldGFiLAorCQkJICAgICAgbmgtPmxpbmVzX2FsbG9jICogc2l6ZW9mKFdpbmVMaW5lTm8pKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFQlVHX0dldFN5bWJvbFZhbHVlCkBAIC04MSwyMSArMzA5LDMzIEBACiAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgYSBuYW1lZCBzeW1ib2wuCiAgKi8KIEJPT0wzMiBERUJVR19HZXRTeW1ib2xWYWx1ZSggY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGludCBsaW5lbm8sIAotCQkJICAgICBEQkdfQUREUiAqYWRkciApCisJCQkgICAgIERCR19BRERSICphZGRyLCBpbnQgYnBfZmxhZyApCiB7CiAgICAgY2hhciBidWZmZXJbMjU2XTsKLSAgICBpbnQgaTsKICAgICBzdHJ1Y3QgbmFtZV9oYXNoICpuaDsKIAogICAgIGZvcihuaCA9IG5hbWVfaGFzaF90YWJsZVtuYW1lX2hhc2gobmFtZSldOyBuaDsgbmggPSBuaC0+bmV4dCkKKyAgICAgIHsKKwlpZiggKG5oLT5mbGFncyAmIFNZTV9JTlZBTElEKSAhPSAwICkKKwkgIHsKKwkgICAgY29udGludWU7CisJICB9CisKICAgICAgICAgaWYgKCFzdHJjbXAobmgtPm5hbWUsIG5hbWUpKSBicmVhazsKKyAgICAgIH0KIAogICAgIGlmICghbmggJiYgKG5hbWVbMF0gIT0gJ18nKSkKICAgICB7CiAgICAgICAgIGJ1ZmZlclswXSA9ICdfJzsKICAgICAgICAgc3RyY3B5KGJ1ZmZlcisxLCBuYW1lKTsKICAgICAgICAgZm9yKG5oID0gbmFtZV9oYXNoX3RhYmxlW25hbWVfaGFzaChidWZmZXIpXTsgbmg7IG5oID0gbmgtPm5leHQpCisJICB7CisJICAgIGlmKCAobmgtPmZsYWdzICYgU1lNX0lOVkFMSUQpICE9IDAgKQorCSAgICAgIHsKKwkJY29udGludWU7CisJICAgICAgfQogICAgICAgICAgICAgaWYgKCFzdHJjbXAobmgtPm5hbWUsIGJ1ZmZlcikpIGJyZWFrOworCSAgfQogICAgIH0KIAogICAgIC8qCkBAIC0xMDQsMTIgKzM0NCwzMSBAQAogICAgICAqIHdoYXQsIHdlIGhhdmUgbm90aGluZyBtb3JlIHRvIGRvLCBzbyB3ZSBsZXQgdGhhdCBmdW5jdGlvbgogICAgICAqIGRlY2lkZSB3aGF0IHdlIHVsdGltYXRlbHkgcmV0dXJuLgogICAgICAqLwotICAgIGlmICghbmgpIHJldHVybiBERUJVR19HZXRTdGFja1N5bWJvbFZhbHVlKG5hbWUsIGFkZHIpOworICAgIGlmICghbmgpIAorICAgICAgeworCXJldHVybiBERUJVR19HZXRTdGFja1N5bWJvbFZhbHVlKG5hbWUsIGFkZHIpOworICAgICAgfQogCisgICAgcmV0dXJuIERFQlVHX0dldExpbmVOdW1iZXJBZGRyKCBuaCwgbGluZW5vLCBhZGRyLCBicF9mbGFnICk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0dldExpbmVOdW1iZXJBZGRyCisgKgorICogR2V0IHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgc3ltYm9sLgorICovCitCT09MMzIgREVCVUdfR2V0TGluZU51bWJlckFkZHIoIHN0cnVjdCBuYW1lX2hhc2ggKiBuaCwgY29uc3QgaW50IGxpbmVubywgCisJCQkJREJHX0FERFIgKmFkZHIsIGludCBicF9mbGFnICkKK3sKKyAgICBpbnQgaTsKIAogICAgIGlmKCBsaW5lbm8gPT0gLTEgKQogICAgICAgewogCSphZGRyID0gbmgtPmFkZHI7CisJaWYoIGJwX2ZsYWcgKQorCSAgeworCSAgICBhZGRyLT5vZmYgKz0gbmgtPmJyZWFrcG9pbnRfb2Zmc2V0OworCSAgfQogICAgICAgfQogICAgIGVsc2UKICAgICAgIHsKQEAgLTE2NCw2ICs0MjMsNyBAQAogCiAgICAgaWYgKCFuaCkgcmV0dXJuIEZBTFNFOwogICAgIG5oLT5hZGRyID0gKmFkZHI7CisgICAgbmgtPmZsYWdzICY9IFNZTV9JTlZBTElEOwogICAgIERCR19GSVhfQUREUl9TRUcoICZuaC0+YWRkciwgRFNfcmVnKCZERUJVR19jb250ZXh0KSApOwogICAgIHJldHVybiBUUlVFOwogfQpAQCAtMTc4LDM5ICs0MzgsMTU2IEBACiAgKi8KIGNvbnN0IGNoYXIgKiBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBmbGFnLAogCQkJCSAgICAgIHN0cnVjdCBuYW1lX2hhc2ggKiogcnRuLAotCQkJCSAgICAgIHVuc2lnbmVkIGludCBlYnApCisJCQkJICAgICAgdW5zaWduZWQgaW50IGVicCwKKwkJCQkgICAgICBzdHJ1Y3QgbGlzdF9pZCAqIHNvdXJjZSkKIHsKICAgICBzdGF0aWMgY2hhciBuYW1lX2J1ZmZlcltNQVhfUEFUSCArIDI1Nl07CiAgICAgc3RhdGljIGNoYXIgYXJnbGlzdFsxMDI0XTsKICAgICBzdGF0aWMgY2hhciBhcmd0bXBbMjU2XTsKICAgICBzdHJ1Y3QgbmFtZV9oYXNoICogbmVhcmVzdCA9IE5VTEw7Ci0gICAgc3RydWN0IG5hbWVfaGFzaCAqIG5oOwotICAgIHVuc2lnbmVkIGludCBuZWFyZXN0X2FkZHJlc3MgPSAwOworICAgIGludCBtaWQsIGhpZ2gsIGxvdzsKICAgICB1bnNpZ25lZAlpbnQgKiBwdHI7CiAgICAgaW50IGxpbmVubzsKICAgICBjaGFyICogbGluZWluZm8sICpzb3VyY2VmaWxlOwogICAgIGludCBpOwogICAgIGNoYXIgbGluZWJ1ZmZbMTZdOwogCi0gICAgKnJ0biA9IE5VTEw7CisgICAgaWYoIHJ0biAhPSBOVUxMICkKKyAgICAgIHsKKwkqcnRuID0gTlVMTDsKKyAgICAgIH0KIAotICAgIGZvcihpPTA7IGk8TlJfTkFNRV9IQVNIOyBpKyspCi0gICAgewotICAgICAgICBmb3IgKG5oID0gbmFtZV9oYXNoX3RhYmxlW2ldOyBuaDsgbmggPSBuaC0+bmV4dCkKLSAgICAgICAgICAgIGlmIChuaC0+YWRkci5zZWcgPT0gYWRkci0+c2VnICYmCi0gICAgICAgICAgICAgICAgbmgtPmFkZHIub2ZmIDw9IGFkZHItPm9mZiAmJgotICAgICAgICAgICAgICAgIG5oLT5hZGRyLm9mZiA+PSBuZWFyZXN0X2FkZHJlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmVhcmVzdF9hZGRyZXNzID0gbmgtPmFkZHIub2ZmOwotICAgICAgICAgICAgICAgIG5lYXJlc3QgPSBuaDsKLSAgICAgICAgICAgIH0KLSAgICB9CisgICAgaWYoIHNvdXJjZSAhPSBOVUxMICkKKyAgICAgIHsKKyAJc291cmNlLT5zb3VyY2VmaWxlID0gTlVMTDsKKwlzb3VyY2UtPmxpbmUgPSAtMTsKKyAgICAgIH0KKworICAgIGlmKCBzb3J0bGlzdF92YWxpZCA9PSBGQUxTRSApCisgICAgICB7CisJREVCVUdfUmVzb3J0U3ltYm9scygpOworICAgICAgfQorCisgICAgaWYoIHNvcnRsaXN0X3ZhbGlkID09IEZBTFNFICkKKyAgICAgIHsKKwlyZXR1cm4gTlVMTDsKKyAgICAgIH0KKworICAgIC8qCisgICAgICogRklYTUUgIC0gdXNlIHRoZSBiaW5hcnkgc2VhcmNoIHRoYXQgd2UgYWRkZWQgdG8KKyAgICAgKiB0aGUgZnVuY3Rpb24gREVCVUdfQ2hlY2tMaW5lbm9TdGF0dXMuICBCZXR0ZXIgeWV0LCB3ZSBzaG91bGQKKyAgICAgKiBwcm9iYWJseSBrZWVwIHNvbWUgbm90aW9uIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHNvIHdlIGRvbid0CisgICAgICogaGF2ZSB0byBzZWFyY2ggZXZlcnkgdGltZS4KKyAgICAgKi8KKyAgICAvKgorICAgICAqIEJpbmFyeSBzZWFyY2ggdG8gZmluZCBjbG9zZXN0IHN5bWJvbC4KKyAgICAgKi8KKyAgICBsb3cgPSAwOworICAgIGhpZ2ggPSBzb3J0dGFiX25zeW07CisgICAgaWYoIGFkZHJfc29ydHRhYlswXS0+YWRkci5zZWcgPiBhZGRyLT5zZWcKKwl8fCAoICAgYWRkcl9zb3J0dGFiWzBdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJICAgICYmIGFkZHJfc29ydHRhYlswXS0+YWRkci5vZmYgPiBhZGRyLT5vZmYpICkKKyAgICAgIHsKKwluZWFyZXN0ID0gTlVMTDsKKyAgICAgIH0KKyAgICBlbHNlIGlmKCBhZGRyX3NvcnR0YWJbaGlnaCAtIDFdLT5hZGRyLnNlZyA8IGFkZHItPnNlZworCXx8ICggICBhZGRyX3NvcnR0YWJbaGlnaCAtIDFdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJICAgICYmIGFkZHJfc29ydHRhYltoaWdoIC0gMV0tPmFkZHIub2ZmIDwgYWRkci0+b2ZmKSApCisgICAgICB7CisJbmVhcmVzdCA9IGFkZHJfc29ydHRhYltoaWdoIC0gMV07CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXdoaWxlKDE9PTEpCisJICB7CisJICAgIG1pZCA9IChoaWdoICsgbG93KS8yOworCSAgICBpZiggbWlkID09IGxvdyApCisJICAgICAgeworCQkvKiAKKwkJICogU2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgZW50cmllcyB0aGF0IG1pZ2h0IGFsc28KKwkJICogaGF2ZSB0aGUgc2FtZSBhZGRyZXNzLCBhbmQgd291bGQgYWxzbyBoYXZlIGEgbGluZQorCQkgKiBudW1iZXIgdGFibGUuICAKKwkJICovCisJCWlmKCBtaWQgPiAwICYmIGFkZHJfc29ydHRhYlttaWRdLT5saW5ldGFiID09IE5VTEwgKQorCQkgIHsKKwkJICAgIGlmKCAgICAoYWRkcl9zb3J0dGFiW21pZCAtIDFdLT5hZGRyLnNlZyA9PQorCQkJICAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZykKKwkJCSYmIChhZGRyX3NvcnR0YWJbbWlkIC0gMV0tPmFkZHIub2ZmID09CisJCQkgICAgYWRkcl9zb3J0dGFiW21pZF0tPmFkZHIub2ZmKQorCQkgICAgICAgICYmIChhZGRyX3NvcnR0YWJbbWlkIC0gMV0tPmxpbmV0YWIgIT0gTlVMTCkgKQorCQkgICAgICB7CisJCQltaWQtLTsKKwkJICAgICAgfQorCQkgIH0KKworCQlpZiggICAgKG1pZCA8IHNvcnR0YWJfbnN5bSAtIDEpCisJCSAgICAmJiAoYWRkcl9zb3J0dGFiW21pZF0tPmxpbmV0YWIgPT0gTlVMTCkgKQorCQkgIHsKKwkJICAgIGlmKCAgICAoYWRkcl9zb3J0dGFiW21pZCArIDFdLT5hZGRyLnNlZyA9PQorCQkJICAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZykKKwkJCSYmIChhZGRyX3NvcnR0YWJbbWlkICsgMV0tPmFkZHIub2ZmID09CisJCQkgICAgYWRkcl9zb3J0dGFiW21pZF0tPmFkZHIub2ZmKQorCQkgICAgICAgICYmIChhZGRyX3NvcnR0YWJbbWlkICsgMV0tPmxpbmV0YWIgIT0gTlVMTCkgKQorCQkgICAgICB7CisJCQltaWQrKzsKKwkJICAgICAgfQorCQkgIH0KKwkJbmVhcmVzdCA9IGFkZHJfc29ydHRhYlttaWRdOworI2lmIDAKKwkJZnByaW50ZihzdGRlcnIsICJGb3VuZCAleDoleCB3aGVuIGxvb2tpbmcgZm9yICV4OiV4ICV4ICVzXG4iLAorCQkJYWRkcl9zb3J0dGFiW21pZCBdLT5hZGRyLnNlZywKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+YWRkci5vZmYsCisJCQlhZGRyLT5zZWcsIGFkZHItPm9mZiwKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+bGluZXRhYiwKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+bmFtZSk7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBpZiggICAgKGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZyA8IGFkZHItPnNlZykKKwkJfHwgKCAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJCSAgICAmJiBhZGRyX3NvcnR0YWJbbWlkXS0+YWRkci5vZmYgPD0gYWRkci0+b2ZmKSApCisJICAgICAgeworCQlsb3cgPSBtaWQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQloaWdoID0gbWlkOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKwogICAgIGlmICghbmVhcmVzdCkgcmV0dXJuIE5VTEw7CiAKLSAgICAqcnRuID0gbmVhcmVzdDsKKyAgICBpZiggcnRuICE9IE5VTEwgKQorICAgICAgeworCSpydG4gPSBuZWFyZXN0OworICAgICAgfQorCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSByZWxldmFudCBiaXRzIHRvIHRoZSBzdHJ1Y3R1cmUgc28gdGhhdCB3ZSBjYW4KKyAgICAgKiBsb2NhdGUgdGhlIHNvdXJjZSBhbmQgbGluZSBmb3IgdGhpcyBiaXQgb2YgY29kZS4KKyAgICAgKi8KKyAgICBpZiggc291cmNlICE9IE5VTEwgKQorICAgICAgeworCXNvdXJjZS0+c291cmNlZmlsZSA9IG5lYXJlc3QtPnNvdXJjZWZpbGU7CisJaWYoIG5lYXJlc3QtPmxpbmV0YWIgPT0gTlVMTCApCisJICB7CisJICAgIHNvdXJjZS0+bGluZSA9IC0xOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgc291cmNlLT5saW5lID0gbmVhcmVzdC0+bGluZXRhYlswXS5saW5lX251bWJlcjsKKwkgIH0KKyAgICAgIH0KKwogICAgIGxpbmVpbmZvID0gIiI7CiAgICAgbGluZW5vID0gLTE7CiAKKyAgICAvKgorICAgICAqIFByZXBhcmUgdG8gZGlzcGxheSB0aGUgYXJndW1lbnQgbGlzdC4gIElmIGVicCBpcyBzcGVjaWZpZWQsIGl0IGlzCisgICAgICogdGhlIGZyYW1lcG9pbnRlciBmb3IgdGhlIGZ1bmN0aW9uIGluIHF1ZXN0aW9uLiAgSWYgbm90IHNwZWNpZmllZCwKKyAgICAgKiB3ZSBkb24ndCB3YW50IHRoZSBhcmdsaXN0LgorICAgICAqLwogICAgIG1lbXNldChhcmdsaXN0LCAnXDAnLCBzaXplb2YoYXJnbGlzdCkpOwogICAgIGlmKCBlYnAgIT0gMCApCiAgICAgICB7CkBAIC0yNzMsNiArNjUwLDEwIEBACiAJICB7CiAJICAgIHNwcmludGYobGluZWJ1ZmYsICI6JWQiLCBsaW5lbm8pOwogCSAgICBsaW5laW5mbyA9IGxpbmVidWZmOworCSAgICBpZiggc291cmNlICE9IE5VTEwgKQorCSAgICAgIHsKKwkJc291cmNlLT5saW5lID0gbGluZW5vOworCSAgICAgIH0KIAkgIH0KIAogICAgICAgICAvKiBSZW1vdmUgdGhlIHBhdGggZnJvbSB0aGUgZmlsZSBuYW1lICovCkBAIC0zNDMsNyArNzI0LDcgQEAKICAgICAgICAgaWYgKCEoKmNwbnQpIHx8ICpjcG50ID09ICdcbicpIGNvbnRpbnVlOwogCQkKICAgICAgICAgbmFyZ3MgPSBzc2NhbmYoYnVmZmVyLCAiJWx4ICVjICVzIiwgJmFkZHIub2ZmLCAmdHlwZSwgbmFtZSk7Ci0gICAgICAgIERFQlVHX0FkZFN5bWJvbCggbmFtZSwgJmFkZHIsIE5VTEwgKTsKKyAgICAgICAgREVCVUdfQWRkU3ltYm9sKCBuYW1lLCAmYWRkciwgTlVMTCwgU1lNX1dJTkUgKTsKICAgICB9CiAgICAgZmNsb3NlKHN5bWJvbGZpbGUpOwogfQpAQCAtMzgzLDcgKzc2NCw4IEBACiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgYWRkci5zZWcgPSBISVdPUkQoYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgYWRkci5vZmYgPSBMT1dPUkQoYWRkcmVzcyk7Ci0gICAgICAgICAgICAgICAgREVCVUdfQWRkU3ltYm9sKCBidWZmZXIsICZhZGRyLCBOVUxMICk7CisJCWFkZHIudHlwZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgREVCVUdfQWRkU3ltYm9sKCBidWZmZXIsICZhZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fRlVOQyApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTQwMSw3ICs3ODMsOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGFkZHIuc2VnID0gSElXT1JEKGFkZHJlc3MpOwogICAgICAgICAgICAgICAgIGFkZHIub2ZmID0gTE9XT1JEKGFkZHJlc3MpOwotICAgICAgICAgICAgICAgIERFQlVHX0FkZFN5bWJvbCggYnVmZmVyLCAmYWRkciwgTlVMTCk7CisJCWFkZHIudHlwZSA9IE5VTEw7CisgICAgICAgICAgICAgICAgREVCVUdfQWRkU3ltYm9sKCBidWZmZXIsICZhZGRyLCBOVUxMLCBTWU1fV0lOMzIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE4LDE5ICs4MDEsMjAgQEAKIAogICBpZiggZnVuYy0+bl9saW5lcyArIDEgPj0gZnVuYy0+bGluZXNfYWxsb2MgKQogICAgIHsKLSAgICAgIGZ1bmMtPmxpbmVzX2FsbG9jICs9IDMyOwotICAgICAgZnVuYy0+bGluZXRhYiA9IHJlYWxsb2MoZnVuYy0+bGluZXRhYiwKKyAgICAgIGZ1bmMtPmxpbmVzX2FsbG9jICs9IDY0OworICAgICAgZnVuYy0+bGluZXRhYiA9IHhyZWFsbG9jKGZ1bmMtPmxpbmV0YWIsCiAJCQkgICAgICBmdW5jLT5saW5lc19hbGxvYyAqIHNpemVvZihXaW5lTGluZU5vKSk7CiAgICAgfQogCiAgIGZ1bmMtPmxpbmV0YWJbZnVuYy0+bl9saW5lc10ubGluZV9udW1iZXIgPSBsaW5lX251bTsKICAgZnVuYy0+bGluZXRhYltmdW5jLT5uX2xpbmVzXS5wY19vZmZzZXQuc2VnID0gZnVuYy0+YWRkci5zZWc7CiAgIGZ1bmMtPmxpbmV0YWJbZnVuYy0+bl9saW5lc10ucGNfb2Zmc2V0Lm9mZiA9IGZ1bmMtPmFkZHIub2ZmICsgb2Zmc2V0OworICBmdW5jLT5saW5ldGFiW2Z1bmMtPm5fbGluZXNdLnBjX29mZnNldC50eXBlID0gTlVMTDsKICAgZnVuYy0+bl9saW5lcysrOwogfQogCiAKLXZvaWQKK3N0cnVjdCB3aW5lX2xvY2FscyAqCiBERUJVR19BZGRMb2NhbCggc3RydWN0IG5hbWVfaGFzaCAqIGZ1bmMsIGludCByZWdubywgCiAJCWludCBvZmZzZXQsCiAJCWludCBwY19zdGFydCwKQEAgLTQzOSwxMyArODIzLDEzIEBACiB7CiAgIGlmKCBmdW5jID09IE5VTEwgKQogICAgIHsKLSAgICAgIHJldHVybjsKKyAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICBpZiggZnVuYy0+bl9sb2NhbHMgKyAxID49IGZ1bmMtPmxvY2Fsc19hbGxvYyApCiAgICAgewogICAgICAgZnVuYy0+bG9jYWxzX2FsbG9jICs9IDMyOwotICAgICAgZnVuYy0+bG9jYWxfdmFycyA9IHJlYWxsb2MoZnVuYy0+bG9jYWxfdmFycywKKyAgICAgIGZ1bmMtPmxvY2FsX3ZhcnMgPSB4cmVhbGxvYyhmdW5jLT5sb2NhbF92YXJzLAogCQkJICAgICAgZnVuYy0+bG9jYWxzX2FsbG9jICogc2l6ZW9mKFdpbmVMb2NhbHMpKTsKICAgICB9CiAKQEAgLTQ1NCw2ICs4MzgsNDI2IEBACiAgIGZ1bmMtPmxvY2FsX3ZhcnNbZnVuYy0+bl9sb2NhbHNdLnBjX3N0YXJ0ID0gcGNfc3RhcnQ7CiAgIGZ1bmMtPmxvY2FsX3ZhcnNbZnVuYy0+bl9sb2NhbHNdLnBjX2VuZCA9IHBjX2VuZDsKICAgZnVuYy0+bG9jYWxfdmFyc1tmdW5jLT5uX2xvY2Fsc10ubmFtZSA9IHhzdHJkdXAobmFtZSk7CisgIGZ1bmMtPmxvY2FsX3ZhcnNbZnVuYy0+bl9sb2NhbHNdLnR5cGUgPSBOVUxMOwogICBmdW5jLT5uX2xvY2FscysrOworCisgIHJldHVybiAmZnVuYy0+bG9jYWxfdmFyc1tmdW5jLT5uX2xvY2FscyAtIDFdOwogfQogCit2b2lkCitERUJVR19EdW1wSGFzaEluZm8oKQoreworICBpbnQgaTsKKyAgaW50IGRlcHRoOworICBzdHJ1Y3QgbmFtZV9oYXNoICpuaDsKKworICAvKgorICAgKiBVdGlsaXR5IGZ1bmN0aW9uIHRvIGR1bXAgc3RhdHMgYWJvdXQgdGhlIGhhc2ggdGFibGUuCisgICAqLworICAgIGZvcihpPTA7IGk8TlJfTkFNRV9IQVNIOyBpKyspCisgICAgeworICAgICAgZGVwdGggPSAwOworICAgICAgZm9yIChuaCA9IG5hbWVfaGFzaF90YWJsZVtpXTsgbmg7IG5oID0gbmgtPm5leHQpCisJeworCSAgZGVwdGgrKzsKKwl9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkJ1Y2tldCAlZDogJWRcbiIsIGksIGRlcHRoKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0NoZWNrTGluZW5vU3RhdHVzCisgKgorICogRmluZCB0aGUgc3ltYm9sIG5lYXJlc3QgdG8gYSBnaXZlbiBhZGRyZXNzLgorICogSWYgZWJwIGlzIHNwZWNpZmllZCBhcyBub24temVybywgaXQgbWVhbnMgd2Ugc2hvdWxkIGR1bXAgdGhlIGFyZ3VtZW50CisgKiBsaXN0IGludG8gdGhlIHN0cmluZyB3ZSByZXR1cm4gYXMgd2VsbC4KKyAqLworaW50IERFQlVHX0NoZWNrTGluZW5vU3RhdHVzKCBjb25zdCBEQkdfQUREUiAqYWRkcikKK3sKKyAgICBzdHJ1Y3QgbmFtZV9oYXNoICogbmVhcmVzdCA9IE5VTEw7CisgICAgaW50IG1pZCwgaGlnaCwgbG93OworICAgIGludCBpOworCisgICAgaWYoIHNvcnRsaXN0X3ZhbGlkID09IEZBTFNFICkKKyAgICAgIHsKKwlERUJVR19SZXNvcnRTeW1ib2xzKCk7CisgICAgICB9CisKKyAgICAvKgorICAgICAqIEJpbmFyeSBzZWFyY2ggdG8gZmluZCBjbG9zZXN0IHN5bWJvbC4KKyAgICAgKi8KKyAgICBsb3cgPSAwOworICAgIGhpZ2ggPSBzb3J0dGFiX25zeW07CisgICAgaWYoIGFkZHJfc29ydHRhYlswXS0+YWRkci5zZWcgPiBhZGRyLT5zZWcKKwl8fCAoICAgYWRkcl9zb3J0dGFiWzBdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJICAgICYmIGFkZHJfc29ydHRhYlswXS0+YWRkci5vZmYgPiBhZGRyLT5vZmYpICkKKyAgICAgIHsKKwluZWFyZXN0ID0gTlVMTDsKKyAgICAgIH0KKyAgICBlbHNlIGlmKCBhZGRyX3NvcnR0YWJbaGlnaCAtIDFdLT5hZGRyLnNlZyA8IGFkZHItPnNlZworCXx8ICggICBhZGRyX3NvcnR0YWJbaGlnaCAtIDFdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJICAgICYmIGFkZHJfc29ydHRhYltoaWdoIC0gMV0tPmFkZHIub2ZmIDwgYWRkci0+b2ZmKSApCisgICAgICB7CisJbmVhcmVzdCA9IGFkZHJfc29ydHRhYltoaWdoIC0gMV07CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCXdoaWxlKDE9PTEpCisJICB7CisJICAgIG1pZCA9IChoaWdoICsgbG93KS8yOworCSAgICBpZiggbWlkID09IGxvdyApCisJICAgICAgeworCQkvKiAKKwkJICogU2VlIGlmIHRoZXJlIGFyZSBhbnkgb3RoZXIgZW50cmllcyB0aGF0IG1pZ2h0IGFsc28KKwkJICogaGF2ZSB0aGUgc2FtZSBhZGRyZXNzLCBhbmQgd291bGQgYWxzbyBoYXZlIGEgbGluZQorCQkgKiBudW1iZXIgdGFibGUuICAKKwkJICovCisJCWlmKCBtaWQgPiAwICYmIGFkZHJfc29ydHRhYlttaWRdLT5saW5ldGFiID09IE5VTEwgKQorCQkgIHsKKwkJICAgIGlmKCAgICAoYWRkcl9zb3J0dGFiW21pZCAtIDFdLT5hZGRyLnNlZyA9PQorCQkJICAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZykKKwkJCSYmIChhZGRyX3NvcnR0YWJbbWlkIC0gMV0tPmFkZHIub2ZmID09CisJCQkgICAgYWRkcl9zb3J0dGFiW21pZF0tPmFkZHIub2ZmKQorCQkgICAgICAgICYmIChhZGRyX3NvcnR0YWJbbWlkIC0gMV0tPmxpbmV0YWIgIT0gTlVMTCkgKQorCQkgICAgICB7CisJCQltaWQtLTsKKwkJICAgICAgfQorCQkgIH0KKworCQlpZiggICAgKG1pZCA8IHNvcnR0YWJfbnN5bSAtIDEpCisJCSAgICAmJiAoYWRkcl9zb3J0dGFiW21pZF0tPmxpbmV0YWIgPT0gTlVMTCkgKQorCQkgIHsKKwkJICAgIGlmKCAgICAoYWRkcl9zb3J0dGFiW21pZCArIDFdLT5hZGRyLnNlZyA9PQorCQkJICAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZykKKwkJCSYmIChhZGRyX3NvcnR0YWJbbWlkICsgMV0tPmFkZHIub2ZmID09CisJCQkgICAgYWRkcl9zb3J0dGFiW21pZF0tPmFkZHIub2ZmKQorCQkgICAgICAgICYmIChhZGRyX3NvcnR0YWJbbWlkICsgMV0tPmxpbmV0YWIgIT0gTlVMTCkgKQorCQkgICAgICB7CisJCQltaWQrKzsKKwkJICAgICAgfQorCQkgIH0KKwkJbmVhcmVzdCA9IGFkZHJfc29ydHRhYlttaWRdOworI2lmIDAKKwkJZnByaW50ZihzdGRlcnIsICJGb3VuZCAleDoleCB3aGVuIGxvb2tpbmcgZm9yICV4OiV4ICV4ICVzXG4iLAorCQkJYWRkcl9zb3J0dGFiW21pZCBdLT5hZGRyLnNlZywKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+YWRkci5vZmYsCisJCQlhZGRyLT5zZWcsIGFkZHItPm9mZiwKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+bGluZXRhYiwKKwkJCWFkZHJfc29ydHRhYlttaWQgXS0+bmFtZSk7CisjZW5kaWYKKwkJYnJlYWs7CisJICAgICAgfQorCSAgICBpZiggICAgKGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZyA8IGFkZHItPnNlZykKKwkJfHwgKCAgIGFkZHJfc29ydHRhYlttaWRdLT5hZGRyLnNlZyA9PSBhZGRyLT5zZWcgCisJCSAgICAmJiBhZGRyX3NvcnR0YWJbbWlkXS0+YWRkci5vZmYgPD0gYWRkci0+b2ZmKSApCisJICAgICAgeworCQlsb3cgPSBtaWQ7CisJICAgICAgfQorCSAgICBlbHNlCisJICAgICAgeworCQloaWdoID0gbWlkOworCSAgICAgIH0KKwkgIH0KKyAgICAgIH0KKworICAgIGlmICghbmVhcmVzdCkgcmV0dXJuIEZVTkNfSEFTX05PX0xJTkVTOworCisgICAgaWYoIG5lYXJlc3QtPmZsYWdzICYgU1lNX1NURVBfVEhST1VHSCApCisgICAgICB7CisJLyoKKwkgKiBUaGlzIHdpbGwgY2F1c2UgdXMgdG8ga2VlcCBzaW5nbGUgc3RlcHBpbmcgdW50aWwKKwkgKiB3ZSBnZXQgdG8gdGhlIG90aGVyIHNpZGUgc29tZXdoZXJlLgorCSAqLworCXJldHVybiBOT1RfT05fTElORU5VTUJFUjsKKyAgICAgIH0KKworICAgIGlmKCAobmVhcmVzdC0+ZmxhZ3MgJiBTWU1fVFJBTVBPTElORSkgKQorICAgICAgeworCS8qCisJICogVGhpcyB3aWxsIGNhdXNlIHVzIHRvIGtlZXAgc2luZ2xlIHN0ZXBwaW5nIHVudGlsCisJICogd2UgZ2V0IHRvIHRoZSBvdGhlciBzaWRlIHNvbWV3aGVyZS4KKwkgKi8KKwlyZXR1cm4gRlVOQ19JU19UUkFNUE9MSU5FOworICAgICAgfQorCisgICAgaWYoIG5lYXJlc3QtPmxpbmV0YWIgPT0gTlVMTCApCisgICAgICB7CisJcmV0dXJuIEZVTkNfSEFTX05PX0xJTkVTOworICAgICAgfQorCisKKyAgICAvKgorICAgICAqIFdlIG5ldmVyIHdhbnQgdG8gc3RvcCBvbiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gb2YgYSBmdW5jdGlvbgorICAgICAqIGV2ZW4gaWYgaXQgaGFzIGl0J3Mgb3duIGxpbmVudW1iZXIuICBMZXQgdGhlIHRoaW5nIGtlZXAgcnVubmluZworICAgICAqIHVudGlsIGl0IGdldHMgcGFzdCB0aGUgZnVuY3Rpb24gcHJvbG9ndWUuICBXZSBvbmx5IGRvIHRoaXMgaWYgdGhlcmUKKyAgICAgKiBpcyBtb3JlIHRoYW4gb25lIGxpbmUgbnVtYmVyIGZvciB0aGUgZnVuY3Rpb24sIG9mIGNvdXJzZS4KKyAgICAgKi8KKyAgICBpZiggbmVhcmVzdC0+YWRkci5vZmYgPT0gYWRkci0+b2ZmICYmIG5lYXJlc3QtPm5fbGluZXMgPiAxICkKKyAgICAgIHsKKwlyZXR1cm4gTk9UX09OX0xJTkVOVU1CRVI7CisgICAgICB9CisKKyAgICBpZiggKG5lYXJlc3QtPnNvdXJjZWZpbGUgIT0gTlVMTCkKKwkmJiAoYWRkci0+b2ZmIC0gbmVhcmVzdC0+YWRkci5vZmYgPCAweDEwMDAwMCkgKQorICAgICAgeworCS8qCisJICogRklYTUUgLSB0aGlzIGlzIGFuIGluZWZmaWNpZW50IGxpbmVhciBzZWFyY2guICBBIGJpbmFyeQorCSAqIHNlYXJjaCB3b3VsZCBiZSBiZXR0ZXIgaWYgdGhpcyBnZXRzIHRvIGJlIGEgcGVyZm9ybWFuY2UKKwkgKiBib3R0bGVuZWNrLgorCSAqLworCWZvcihpPTA7IGkgPCBuZWFyZXN0LT5uX2xpbmVzOyBpKyspCisJICB7CisJICAgIGlmKCBhZGRyLT5vZmYgPT0gbmVhcmVzdC0+bGluZXRhYltpXS5wY19vZmZzZXQub2ZmICkKKwkgICAgICB7CisJCXJldHVybiBBVF9MSU5FTlVNQkVSOworCSAgICAgIH0KKwkgICAgaWYoIGFkZHItPm9mZiA8IG5lYXJlc3QtPmxpbmV0YWJbaV0ucGNfb2Zmc2V0Lm9mZiApCisJICAgICAgeworCQlicmVhazsKKwkgICAgICB9CisJICB9CisKKwlyZXR1cm4gTk9UX09OX0xJTkVOVU1CRVI7CisgICAgICB9CisKKyAgICByZXR1cm4gRlVOQ19IQVNfTk9fTElORVM7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0dldEZ1bmNJbmZvCisgKgorICogRmluZCB0aGUgc3ltYm9sIG5lYXJlc3QgdG8gYSBnaXZlbiBhZGRyZXNzLgorICogUmV0dXJucyBzb3VyY2VmaWxlIG5hbWUgYW5kIGxpbmUgbnVtYmVyIGluIGEgZm9ybWF0IHRoYXQgdGhlIGxpc3RpbmcKKyAqIGhhbmRsZXIgY2FuIGRlYWwgd2l0aC4KKyAqLwordm9pZAorREVCVUdfR2V0RnVuY0luZm8oIHN0cnVjdCBsaXN0X2lkICogcmV0LCBjb25zdCBjaGFyICogZmlsZW5hbWUsIAorCQkgICBjb25zdCBjaGFyICogbmFtZSkKK3sKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIGNoYXIgKiBwbnQ7CisgICAgc3RydWN0IG5hbWVfaGFzaCAqbmg7CisKKyAgICBmb3IobmggPSBuYW1lX2hhc2hfdGFibGVbbmFtZV9oYXNoKG5hbWUpXTsgbmg7IG5oID0gbmgtPm5leHQpCisgICAgICB7CisJaWYoIGZpbGVuYW1lICE9IE5VTEwgKQorCSAgeworCisJICAgIGlmKCBuaC0+c291cmNlZmlsZSA9PSBOVUxMICkKKwkgICAgICB7CisJCWNvbnRpbnVlOworCSAgICAgIH0KKworCSAgICBwbnQgPSBzdHJyY2hyKG5oLT5zb3VyY2VmaWxlLCAnLycpOworCSAgICBpZiggc3RyY21wKG5oLT5zb3VyY2VmaWxlLCBmaWxlbmFtZSkgIT0gMAorCQkmJiAocG50ID09IE5VTEwgfHwgc3RyY21wKHBudCArIDEsIGZpbGVuYW1lKSAhPSAwKSApCisJICAgICAgeworCQljb250aW51ZTsKKwkgICAgICB9CisJICB9CisgICAgICAgIGlmICghc3RyY21wKG5oLT5uYW1lLCBuYW1lKSkgYnJlYWs7CisgICAgICB9CisKKyAgICBpZiAoIW5oICYmIChuYW1lWzBdICE9ICdfJykpCisgICAgeworICAgICAgICBidWZmZXJbMF0gPSAnXyc7CisgICAgICAgIHN0cmNweShidWZmZXIrMSwgbmFtZSk7CisgICAgICAgIGZvcihuaCA9IG5hbWVfaGFzaF90YWJsZVtuYW1lX2hhc2goYnVmZmVyKV07IG5oOyBuaCA9IG5oLT5uZXh0KQorCSAgeworCSAgICBpZiggZmlsZW5hbWUgIT0gTlVMTCApCisJICAgICAgeworCQlpZiggbmgtPnNvdXJjZWZpbGUgPT0gTlVMTCApCisJCSAgeworCQkgICAgY29udGludWU7CisJCSAgfQorCisJCXBudCA9IHN0cnJjaHIobmgtPnNvdXJjZWZpbGUsICcvJyk7CisJCWlmKCBzdHJjbXAobmgtPnNvdXJjZWZpbGUsIGZpbGVuYW1lKSAhPSAwCisJCSAgICAmJiAocG50ID09IE5VTEwgfHwgc3RyY21wKHBudCArIDEsIGZpbGVuYW1lKSAhPSAwKSApCisJCSAgeworCQkgICAgY29udGludWU7CisJCSAgfQorCSAgICAgIH0KKyAgICAgICAgICAgIGlmICghc3RyY21wKG5oLT5uYW1lLCBidWZmZXIpKSBicmVhazsKKwkgIH0KKyAgICB9CisKKyAgICBpZiggIW5oICkKKyAgICAgIHsKKwlpZiggZmlsZW5hbWUgIT0gTlVMTCApCisJICB7CisJICAgIGZwcmludGYoc3RkZXJyLCAiTm8gc3VjaCBmdW5jdGlvbiAlcyBpbiAlc1xuIiwgbmFtZSwgZmlsZW5hbWUpOworCSAgfQorCWVsc2UKKwkgIHsKKwkgICAgZnByaW50ZihzdGRlcnIsICJObyBzdWNoIGZ1bmN0aW9uICVzXG4iLCBuYW1lKTsKKwkgIH0KKwlyZXQtPnNvdXJjZWZpbGUgPSBOVUxMOworCXJldC0+bGluZSA9IC0xOworCXJldHVybjsKKyAgICAgIH0KKworICAgIHJldC0+c291cmNlZmlsZSA9IG5oLT5zb3VyY2VmaWxlOworCisgICAgLyoKKyAgICAgKiBTZWFyY2ggZm9yIHRoZSBzcGVjaWZpYyBsaW5lIG51bWJlci4gIElmIHdlIGRvbid0IGZpbmQgaXQsCisgICAgICogdGhlbiByZXR1cm4gRkFMU0UuCisgICAgICovCisgICAgaWYoIG5oLT5saW5ldGFiID09IE5VTEwgKQorICAgICAgeworCXJldC0+bGluZSA9IC0xOworICAgICAgfQorICAgIGVsc2UKKyAgICAgIHsKKwlyZXQtPmxpbmUgPSBuaC0+bGluZXRhYlswXS5saW5lX251bWJlcjsKKyAgICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgREVCVUdfR2V0U3RhY2tTeW1ib2xWYWx1ZQorICoKKyAqIEdldCB0aGUgYWRkcmVzcyBvZiBhIG5hbWVkIHN5bWJvbCBmcm9tIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgorICovCitzdGF0aWMKK0JPT0wzMiBERUJVR19HZXRTdGFja1N5bWJvbFZhbHVlKCBjb25zdCBjaGFyICogbmFtZSwgREJHX0FERFIgKmFkZHIgKQoreworICBzdHJ1Y3QgbmFtZV9oYXNoICogY3Vycl9mdW5jOworICB1bnNpZ25lZCBpbnQJICAgICBlYnA7CisgIHVuc2lnbmVkIGludAkgICAgIGVpcDsKKyAgaW50CQkgICAgIGk7CisKKyAgaWYoIERFQlVHX0dldEN1cnJlbnRGcmFtZSgmY3Vycl9mdW5jLCAmZWlwLCAmZWJwKSA9PSBGQUxTRSApCisgICAgeworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmb3IoaT0wOyBpIDwgY3Vycl9mdW5jLT5uX2xvY2FsczsgaSsrICkKKyAgICB7CisgICAgICAvKgorICAgICAgICogVGVzdCB0aGUgcmFuZ2Ugb2YgdmFsaWRpdHkgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLiAgVGhpcworICAgICAgICogY29tZXMgdXAgd2l0aCBSQlJBQy9MQlJBQyBzdGFicyBpbiBwYXJ0aWN1bGFyLgorICAgICAgICovCisgICAgICBpZiggICAgKGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19zdGFydCAhPSAwKQorCSAgJiYgKChlaXAgLSBjdXJyX2Z1bmMtPmFkZHIub2ZmKSAKKwkgICAgICA8IGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19zdGFydCkgKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYoICAgIChjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ucGNfZW5kICE9IDApCisJICAmJiAoKGVpcCAtIGN1cnJfZnVuYy0+YWRkci5vZmYpIAorCSAgICAgID4gY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnBjX2VuZCkgKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYoIHN0cmNtcChuYW1lLCBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ubmFtZSkgPT0gMCApCisJeworCSAgLyoKKwkgICAqIE9LLCB3ZSBmb3VuZCBpdC4gIE5vdyBmaWd1cmUgb3V0IHdoYXQgdG8gZG8gd2l0aCB0aGlzLgorCSAgICovCisJICBpZiggY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnJlZ25vICE9IDAgKQorCSAgICB7CisJICAgICAgLyoKKwkgICAgICAgKiBSZWdpc3RlciB2YXJpYWJsZS4gIFdlIGRvbid0IGtub3cgaG93IHRvIHRyZWF0CisJICAgICAgICogdGhpcyB5ZXQuCisJICAgICAgICovCisJICAgICAgcmV0dXJuIEZBTFNFOworCSAgICB9CisKKwkgIGFkZHItPnNlZyA9IDA7CisJICBhZGRyLT5vZmYgPSBlYnAgKyBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ub2Zmc2V0OworCSAgYWRkci0+dHlwZSA9IGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS50eXBlOworCisJICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorREVCVUdfSW5mb0xvY2FscygpCit7CisgIHN0cnVjdCBuYW1lX2hhc2ggICogY3Vycl9mdW5jOworICB1bnNpZ25lZCBpbnQJICAgICAgZWJwOworICB1bnNpZ25lZCBpbnQJICAgICAgZWlwOworICBpbnQJCSAgICAgIGk7CisgIHVuc2lnbmVkIGludCAgICAgICogcHRyOworICBpbnQJCSAgICAgIHJ0biA9IEZBTFNFOworCisgIGlmKCBERUJVR19HZXRDdXJyZW50RnJhbWUoJmN1cnJfZnVuYywgJmVpcCwgJmVicCkgPT0gRkFMU0UgKQorICAgIHsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgZm9yKGk9MDsgaSA8IGN1cnJfZnVuYy0+bl9sb2NhbHM7IGkrKyApCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFRlc3QgdGhlIHJhbmdlIG9mIHZhbGlkaXR5IG9mIHRoZSBsb2NhbCB2YXJpYWJsZS4gIFRoaXMKKyAgICAgICAqIGNvbWVzIHVwIHdpdGggUkJSQUMvTEJSQUMgc3RhYnMgaW4gcGFydGljdWxhci4KKyAgICAgICAqLworICAgICAgaWYoICAgIChjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ucGNfc3RhcnQgIT0gMCkKKwkgICYmICgoZWlwIC0gY3Vycl9mdW5jLT5hZGRyLm9mZikgCisJICAgICAgPCBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ucGNfc3RhcnQpICkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmKCAgICAoY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnBjX2VuZCAhPSAwKQorCSAgJiYgKChlaXAgLSBjdXJyX2Z1bmMtPmFkZHIub2ZmKSAKKwkgICAgICA+IGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19lbmQpICkKKwl7CisJICBjb250aW51ZTsKKwl9CisgICAgICAKKyAgICAgIGlmKCBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ub2Zmc2V0ID09IDAgKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6JXMgb3B0aW1pemVkIGludG8gcmVnaXN0ZXIgJCVzIFxuIiwKKwkJICBjdXJyX2Z1bmMtPm5hbWUsIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5uYW1lLAorCQkgIHJlZ19uYW1lW2N1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5yZWdub10pOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwdHIgPSAodW5zaWduZWQgaW50ICopIChlYnAgKyBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ub2Zmc2V0KTsKKwkgIGZwcmludGYoc3RkZXJyLCAiJXM6JXMgPT0gMHglOC44eFxuIiwKKwkJICBjdXJyX2Z1bmMtPm5hbWUsIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5uYW1lLAorCQkgICpwdHIpOworCX0KKyAgICB9CisKKyAgcnRuID0gVFJVRTsKKworICByZXR1cm4gKHJ0bik7Cit9CisKK2ludAorREVCVUdfU2V0U3ltYm9sU2l6ZShzdHJ1Y3QgbmFtZV9oYXNoICogc3ltLCB1bnNpZ25lZCBpbnQgbGVuKQoreworICBzeW0tPnN5bWJvbF9zaXplID0gbGVuOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK0RFQlVHX1NldFN5bWJvbEJQT2ZmKHN0cnVjdCBuYW1lX2hhc2ggKiBzeW0sIHVuc2lnbmVkIGludCBvZmYpCit7CisgIHN5bS0+YnJlYWtwb2ludF9vZmZzZXQgPSBvZmY7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorREVCVUdfR2V0U3ltYm9sQWRkcihzdHJ1Y3QgbmFtZV9oYXNoICogc3ltLCBEQkdfQUREUiAqIGFkZHIpCit7CisKKyAgKmFkZHIgPSBzeW0tPmFkZHI7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBERUJVR19TZXRMb2NhbFN5bWJvbFR5cGUoc3RydWN0IHdpbmVfbG9jYWxzICogc3ltLCBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlKQoreworICBzeW0tPnR5cGUgPSB0eXBlOworCisgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvaW5mby5jIGIvZGVidWdnZXIvaW5mby5jCmluZGV4IGVlNmNlMjkuLjZjNWY0ZGUgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2luZm8uYworKysgYi9kZWJ1Z2dlci9pbmZvLmMKQEAgLTgsNjYgKzgsNTYgQEAKICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjaW5jbHVkZSAiZXhwci5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBERUJVR19QcmludAogICoKICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSAncHJpbnQnIGNvbW1hbmQuCiAgKi8KLXZvaWQgREVCVUdfUHJpbnQoIGNvbnN0IERCR19BRERSICphZGRyLCBpbnQgY291bnQsIGNoYXIgZm9ybWF0ICkKK3ZvaWQgREVCVUdfUHJpbnRCYXNpYyggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQgKQogewotICAgIGlmIChjb3VudCAhPSAxKQorICBjaGFyICogZGVmYXVsdF9mb3JtYXQ7CisgIGxvbmcgbG9uZyBpbnQgdmFsdWU7CisKKyAgICBpZiggYWRkci0+dHlwZSA9PSBOVUxMICkKICAgICB7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkNvdW50IG90aGVyIHRoYW4gMSBpcyBtZWFuaW5nbGVzcyBpbiAncHJpbnQnIGNvbW1hbmRcbiIgKTsKLSAgICAgICAgcmV0dXJuOworICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gZXZhbHVhdGUgZXhwcmVzc2lvblxuIik7CisgICAgICByZXR1cm47CiAgICAgfQorICAKKyAgZGVmYXVsdF9mb3JtYXQgPSBOVUxMOworICB2YWx1ZSA9IERFQlVHX0dldEV4cHJWYWx1ZSgoREJHX0FERFIgKikgYWRkciwgJmRlZmF1bHRfZm9ybWF0KTsKIAotICAgIGlmIChhZGRyLT5zZWcgJiYgKGFkZHItPnNlZyAhPSAweGZmZmZmZmZmKSkKLSAgICB7Ci0gICAgICAgIHN3aXRjaChmb3JtYXQpCi0gICAgICAgIHsKLQljYXNlICd4JzoKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIjB4JTA0bHg6IiwgYWRkci0+c2VnICk7Ci0gICAgICAgICAgICBicmVhazsKLQotCWNhc2UgJ2QnOgotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJWxkOiIsIGFkZHItPnNlZyApOwotICAgICAgICAgICAgYnJlYWs7Ci0KLQljYXNlICdjJzoKLSAgICAgICAgICAgIGJyZWFrOyAgLyogTm8gc2VnbWVudCB0byBwcmludCAqLwotCi0JY2FzZSAnaSc6Ci0JY2FzZSAncyc6Ci0JY2FzZSAndyc6Ci0JY2FzZSAnYic6Ci0gICAgICAgICAgICBicmVhazsgIC8qIE1lYW5pbmdsZXNzIGZvcm1hdCAqLwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3dpdGNoKGZvcm1hdCkKKyAgc3dpdGNoKGZvcm1hdCkKICAgICB7CiAgICAgY2FzZSAneCc6Ci0gICAgICAgIGlmIChhZGRyLT5zZWcpIGZwcmludGYoIHN0ZGVyciwgIjB4JTA0bHhcbiIsIGFkZHItPm9mZiApOwotICAgICAgICBlbHNlIGZwcmludGYoIHN0ZGVyciwgIjB4JTA4bHhcbiIsIGFkZHItPm9mZiApOwotICAgICAgICBicmVhazsKLQorICAgICAgaWYgKGFkZHItPnNlZykgZnByaW50Ziggc3RkZXJyLCAiMHglMDRseCIsIChsb25nIHVuc2lnbmVkIGludCkgdmFsdWUgKTsKKyAgICAgIGVsc2UgZnByaW50Ziggc3RkZXJyLCAiMHglMDhseCIsIChsb25nIHVuc2lnbmVkIGludCkgdmFsdWUgKTsKKyAgICAgIGJyZWFrOworICAgICAgCiAgICAgY2FzZSAnZCc6Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVsZFxuIiwgYWRkci0+b2ZmICk7Ci0gICAgICAgIGJyZWFrOwotCisgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlbGRcbiIsIChsb25nIGludCkgdmFsdWUgKTsKKyAgICAgIGJyZWFrOworICAgICAgCiAgICAgY2FzZSAnYyc6Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVkID0gJyVjJ1xuIiwKLSAgICAgICAgICAgICAgICAgKGNoYXIpKGFkZHItPm9mZiAmIDB4ZmYpLCAoY2hhcikoYWRkci0+b2ZmICYgMHhmZikgKTsKLSAgICAgICAgYnJlYWs7Ci0KKyAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVkID0gJyVjJyIsCisJICAgICAgIChjaGFyKSh2YWx1ZSAmIDB4ZmYpLCAoY2hhcikodmFsdWUgJiAweGZmKSApOworICAgICAgYnJlYWs7CisgICAgICAKICAgICBjYXNlICdpJzoKICAgICBjYXNlICdzJzoKICAgICBjYXNlICd3JzoKICAgICBjYXNlICdiJzoKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiRm9ybWF0IHNwZWNpZmllciAnJWMnIGlzIG1lYW5pbmdsZXNzIGluICdwcmludCcgY29tbWFuZFxuIiwgZm9ybWF0ICk7Ci0gICAgICAgIGJyZWFrOworICAgICAgZnByaW50Ziggc3RkZXJyLCAiRm9ybWF0IHNwZWNpZmllciAnJWMnIGlzIG1lYW5pbmdsZXNzIGluICdwcmludCcgY29tbWFuZFxuIiwgZm9ybWF0ICk7CisgICAgY2FzZSAwOgorICAgICAgaWYoIGRlZmF1bHRfZm9ybWF0ICE9IE5VTEwgKQorCXsKKwkgIGZwcmludGYoIHN0ZGVyciwgZGVmYXVsdF9mb3JtYXQsIHZhbHVlICk7CisJfQorICAgICAgYnJlYWs7CiAgICAgfQorCiB9CiAKIApAQCAtNzYsMTcgKzY2LDE5IEBACiAgKgogICogUHJpbnQgYW4gMTYtIG9yIDMyLWJpdCBhZGRyZXNzLCB3aXRoIHRoZSBuZWFyZXN0IHN5bWJvbCBpZiBhbnkuCiAgKi8KLXN0cnVjdCBuYW1lX2hhc2ggKgorc3RydWN0IHN5bWJvbF9pbmZvCiBERUJVR19QcmludEFkZHJlc3MoIGNvbnN0IERCR19BRERSICphZGRyLCBpbnQgYWRkcmxlbiwgaW50IGZsYWcgKQogewotICAgIHN0cnVjdCBuYW1lX2hhc2ggKiBuaDsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGFkZHIsIGZsYWcsICZuaCwgMCApOworICAgIHN0cnVjdCBzeW1ib2xfaW5mbyBydG47CisKKyAgICBjb25zdCBjaGFyICpuYW1lID0gREVCVUdfRmluZE5lYXJlc3RTeW1ib2woIGFkZHIsIGZsYWcsICZydG4uc3ltLCAwLCAKKwkJCQkJCSZydG4ubGlzdCApOwogCiAgICAgaWYgKGFkZHItPnNlZykgZnByaW50Ziggc3RkZXJyLCAiMHglMDRseDoiLCBhZGRyLT5zZWcgKTsKICAgICBpZiAoYWRkcmxlbiA9PSAxNikgZnByaW50Ziggc3RkZXJyLCAiMHglMDRseCIsIGFkZHItPm9mZiApOwogICAgIGVsc2UgZnByaW50Ziggc3RkZXJyLCAiMHglMDhseCIsIGFkZHItPm9mZiApOwogICAgIGlmIChuYW1lKSBmcHJpbnRmKCBzdGRlcnIsICIgKCVzKSIsIG5hbWUgKTsKLSAgICByZXR1cm4gbmg7CisgICAgcmV0dXJuIHJ0bjsKIH0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MKQEAgLTk1LDE5ICs4NywyMSBAQAogICogU2ltaWxhciB0byBERUJVR19QcmludEFkZHJlc3MsIGJ1dCB3ZSBwcmludCB0aGUgYXJndW1lbnRzIHRvCiAgKiBlYWNoIGZ1bmN0aW9uIChpZiBrbm93bikuICBUaGlzIGlzIHVzZWZ1bCBpbiBhIGJhY2t0cmFjZS4KICAqLwotc3RydWN0IG5hbWVfaGFzaCAqCitzdHJ1Y3Qgc3ltYm9sX2luZm8KIERFQlVHX1ByaW50QWRkcmVzc0FuZEFyZ3MoIGNvbnN0IERCR19BRERSICphZGRyLCBpbnQgYWRkcmxlbiwgCiAJCQkgICB1bnNpZ25lZCBpbnQgZWJwLCBpbnQgZmxhZyApCiB7Ci0gICAgc3RydWN0IG5hbWVfaGFzaCAqIG5oOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggYWRkciwgZmxhZywgJm5oLCBlYnAgKTsKKyAgICBzdHJ1Y3Qgc3ltYm9sX2luZm8gcnRuOworCisgICAgY29uc3QgY2hhciAqbmFtZSA9IERFQlVHX0ZpbmROZWFyZXN0U3ltYm9sKCBhZGRyLCBmbGFnLCAmcnRuLnN5bSwgZWJwLCAKKwkJCQkJCSZydG4ubGlzdCApOwogCiAgICAgaWYgKGFkZHItPnNlZykgZnByaW50Ziggc3RkZXJyLCAiMHglMDRseDoiLCBhZGRyLT5zZWcgKTsKICAgICBpZiAoYWRkcmxlbiA9PSAxNikgZnByaW50Ziggc3RkZXJyLCAiMHglMDRseCIsIGFkZHItPm9mZiApOwogICAgIGVsc2UgZnByaW50Ziggc3RkZXJyLCAiMHglMDhseCIsIGFkZHItPm9mZiApOwogICAgIGlmIChuYW1lKSBmcHJpbnRmKCBzdGRlcnIsICIgKCVzKSIsIG5hbWUgKTsKIAotICAgIHJldHVybiBuaDsKKyAgICByZXR1cm4gcnRuOwogfQogCiAKQEAgLTEyMSwyMyArMTE1LDI4IEBACiAgICAgaW50IGkgPSAwOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgaGVscHRleHRbXSA9CiB7Ci0iVGhlIGNvbW1hbmRzIGFjY2VwdGVkIGJ5IHRoZSBXaW5lIGRlYnVnZ2VyIGFyZSBhIHNtYWxsIHN1YnNldCIsCi0ib2YgdGhlIGNvbW1hbmRzIHRoYXQgZ2RiIHdvdWxkIGFjY2VwdC4iLAorIlRoZSBjb21tYW5kcyBhY2NlcHRlZCBieSB0aGUgV2luZSBkZWJ1Z2dlciBhcmUgYSByZWFzb25hYmxlIiwKKyJvZiB0aGUgY29tbWFuZHMgdGhhdCBnZGIgYWNjZXB0cy4iLAogIlRoZSBjb21tYW5kcyBjdXJyZW50bHkgYXJlOiIsCiAiICBicmVhayBbKjxhZGRyPl0gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgYnJlYWsgYnBudW0iLAogIiAgZGlzYWJsZSBicG51bSAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlIGJwbnVtIiwKKyIgIGNvbmRpdGlvbiA8YnBudW0+IFs8ZXhwcj5dIiwKKwogIiAgaGVscCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVpdCIsCi0iICBidCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250IiwKLSIgIHN0ZXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQiLAorIiAgYnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udCBbTl0iLAorIiAgc3RlcCBbTl0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBbTl0iLAorIiAgc3RlcGkgW05dICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dGkgW05dIiwKICIgIHggPGFkZHI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IDxleHByPiIsCiAiICBzZXQgPHJlZz4gPSA8ZXhwcj4gICAgICAgICAgICAgICAgICAgICBzZXQgKjxhZGRyPiA9IDxleHByPiIsCi0iICBzeW1ib2xmaWxlIDxmaWxlbmFtZT4gICAgICAgICAgICAgICAgICBkZWZpbmUgPGlkZW50aWZpZXI+IDxhZGRyPiIsCi0iICB1cCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3duXG4iLAotIiAgbGlzdCA8YWRkcj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUgPG4+XG4iLAorIiAgdXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93biIsCisiICBsaXN0IDxsaW5lcz4gICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSA8bj4iLAorIiAgZmluaXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyBkaXIiLAorIiAgZGlyIDxwYXRoPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSA8ZXhwcj4iLAorIiAgZGVsZXRlIGRpc3BsYXkgPGRpc251bT4gICAgICAgICAgICAgICAgdW5kaXNwbGF5IDxkaXNudW0+XG4iLAogCiAiV2luZS1zcGVjaWZpYyBjb21tYW5kczoiLAogIiAgbW9kZSBbMTYsMzJdICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsayBbd25kLGNsYXNzLHF1ZXVlXSA8aGFuZGxlPiIsCi0iICBpbmZvIFtyZWcsc3RhY2ssYnJlYWssc2VnbWVudHMsbG9jYWxzXSBpbmZvIFt3bmQsIHF1ZXVlXSA8aGFuZGxlPlxuIiwKKyIgIGluZm8gKHNlZSAnaGVscCBpbmZvJyBmb3Igb3B0aW9ucylcbiIsCiAKICJUaGUgJ3gnIGNvbW1hbmQgYWNjZXB0cyByZXBlYXQgY291bnRzIGFuZCBmb3JtYXRzIChpbmNsdWRpbmcgJ2knKSBpbiB0aGUiLAogInNhbWUgd2F5IHRoYXQgZ2RiIGRvZXMuXG4iLApAQCAtMTU1LDI1ICsxNTQsMzEgQEAKIH0KIAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERFQlVHX0xpc3QKKyAqICAgICAgICAgICBERUJVR19IZWxwSW5mbwogICoKLSAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSAnbGlzdCcgY29tbWFuZC4KKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSAnaGVscCBpbmZvJyBjb21tYW5kLgogICovCi12b2lkIERFQlVHX0xpc3QoIERCR19BRERSICphZGRyLCBpbnQgY291bnQgKQordm9pZCBERUJVR19IZWxwSW5mbyh2b2lkKQogewotICAgIHN0YXRpYyBEQkdfQUREUiBsYXN0dGltZSA9IHsgMHhmZmZmZmZmZiwgMCB9OworICAgIGludCBpID0gMDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGluZm90ZXh0W10gPQoreworIlRoZSBpbmZvIGNvbW1hbmRzIGFsbG93IHlvdSB0byBnZXQgYXNzb3J0ZWQgYml0cyBvZiBpbnRlcmVzdGluZyBzdHVmZiIsCisidG8gYmUgZGlzcGxheWVkLiAgVGhlIG9wdGlvbnMgYXJlOiIsCisiICBpbmZvIGJyZWFrICAgICAgICAgICBEdW1wcyBpbmZvcm1hdGlvbiBhYm91dCBicmVha3BvaW50cyIsCisiICBpbmZvIGRpc3BsYXkgICAgICAgICBTaG93cyBhdXRvLWRpc3BsYXkgZXhwcmVzc2lvbnMgaW4gdXNlIiwKKyIgIGluZm8gbG9jYWxzICAgICAgICAgIERpc3BsYXlzIHZhbHVlcyBvZiBhbGwgbG9jYWwgdmFycyBmb3IgY3VycmVudCBmcmFtZSIsCisiICBpbmZvIG1vZHVsZSAgICAgICAgICBEaXNwbGF5cyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgbW9kdWxlcyIsCisiICBpbmZvIHF1ZXVlIDxoYW5kbGU+ICBEdW1wcyBxdWV1ZSBpbmZvcm1hdGlvbiIsCisiICBpbmZvIHJlZyAgICAgICAgICAgICBEaXNwbGF5cyB2YWx1ZXMgaW4gYWxsIHJlZ2lzdGVycyBhdCB0b3Agb2Ygc3RhY2siLAorIiAgaW5mbyBzZWdtZW50cyAgICAgICAgRHVtcHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGtub3duIHNlZ21lbnRzIiwKKyIgIGluZm8gc2hhcmUgICAgICAgICAgIER1bXBzIGluZm9ybWF0aW9uIGFib3V0IHNoYXJlZCBsaWJyYXJpZXMiLAorIiAgaW5mbyBzdGFjayAgICAgICAgICAgRHVtcHMgaW5mb3JtYXRpb24gYWJvdXQgdG9wIG9mIHN0YWNrIiwKKyIgIGluZm8gd25kIDxoYW5kbGU+ICAgIER1bXBzIGluZm9ybWF0aW9uIGFib3V0IGFsbCB3aW5kb3dzIiwKKyIiLAorTlVMTAorfTsKIAotICAgIGlmIChhZGRyID09IE5VTEwpIGFkZHIgPSAmbGFzdHRpbWU7Ci0gICAgREJHX0ZJWF9BRERSX1NFRyggYWRkciwgQ1NfcmVnKCZERUJVR19jb250ZXh0KSApOwotICAgIHdoaWxlIChjb3VudC0tID4gMCkKLSAgICB7Ci0gICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggYWRkciwgZGJnX21vZGUsIEZBTFNFICk7Ci0gICAgICAgIGZwcmludGYoIHN0ZGVyciwgIjogICIgKTsKLSAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoIGFkZHIsIDEgKSkgcmV0dXJuOwotICAgICAgICBERUJVR19EaXNhc20oIGFkZHIgKTsKLSAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKLSAgICB9Ci0gICAgbGFzdHRpbWUgPSAqYWRkcjsKKyAgICB3aGlsZShpbmZvdGV4dFtpXSkgZnByaW50ZihzdGRlcnIsIiVzXG4iLCBpbmZvdGV4dFtpKytdKTsKIH0KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL21lbW9yeS5jIGIvZGVidWdnZXIvbWVtb3J5LmMKaW5kZXggMjQ0ZmNkZS4uZjYyOTE5NCAxMDA2NDQKLS0tIGEvZGVidWdnZXIvbWVtb3J5LmMKKysrIGIvZGVidWdnZXIvbWVtb3J5LmMKQEAgLTE0MiwxNSArMTQyLDMxIEBACiAgKi8KIHZvaWQgREVCVUdfRXhhbWluZU1lbW9yeSggY29uc3QgREJHX0FERFIgKmFkZHJlc3MsIGludCBjb3VudCwgY2hhciBmb3JtYXQgKQogewotICAgIERCR19BRERSIGFkZHIgPSAqYWRkcmVzczsKLSAgICB1bnNpZ25lZCBjaGFyICogcG50OwotICAgIHVuc2lnbmVkIGludCAqIGR1bXA7Ci0gICAgdW5zaWduZWQgc2hvcnQgaW50ICogd2R1bXA7Ci0gICAgaW50IGk7CisgICAgREJHX0FERFIgYWRkciA9CSogYWRkcmVzczsKKyAgICB1bnNpZ25lZCBpbnQJKiBkdW1wOworICAgIGludAkJCSAgaTsKKyAgICB1bnNpZ25lZCBjaGFyCSogcG50OworICAgIHN0cnVjdCBkYXRhdHlwZQkqIHRlc3R0eXBlOworICAgIHVuc2lnbmVkIHNob3J0IGludAkqIHdkdW1wOwogCiAgICAgREJHX0ZJWF9BRERSX1NFRyggJmFkZHIsIChmb3JtYXQgPT0gJ2knKSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX3JlZygmREVCVUdfY29udGV4dCkgOiBEU19yZWcoJkRFQlVHX2NvbnRleHQpICk7CiAKKyAgICAvKgorICAgICAqIERlcmVmZXJlbmNlIHBvaW50ZXIgdG8gZ2V0IGFjdHVhbCBtZW1vcnkgYWRkcmVzcyB3ZSBuZWVkIHRvIGJlCisgICAgICogcmVhZGluZy4gIFdlIHdpbGwgdXNlIHRoZSBzYW1lIHNlZ21lbnQgYXMgd2hhdCB3ZSBoYXZlIGFscmVhZHksCisgICAgICogYW5kIGhvcGUgdGhhdCB0aGlzIGlzIGEgc2Vuc2libGUgdGhpbmcgdG8gZG8uCisgICAgICovCisgICAgaWYoIGFkZHIudHlwZSAhPSBOVUxMICkKKyAgICAgIHsKKwlpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIDEgKSkgcmV0dXJuOworCURFQlVHX1R5cGVEZXJlZlBvaW50ZXIoJmFkZHIsICZ0ZXN0dHlwZSk7CisJaWYoIHRlc3R0eXBlICE9IE5VTEwgfHwgYWRkci50eXBlID09IERFQlVHX1R5cGVJbnRDb25zdCApCisJICB7CisJICAgIGFkZHIub2ZmID0gREVCVUdfR2V0RXhwclZhbHVlKCZhZGRyLCBOVUxMKTsKKwkgIH0KKyAgICAgIH0KKwogICAgIGlmIChmb3JtYXQgIT0gJ2knICYmIGNvdW50ID4gMSkKICAgICB7CiAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlLCBGQUxTRSApOwpAQCAtMTc5LDcgKzE5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlLCBUUlVFICk7CiAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCI6ICIpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIURCR19DSEVDS19SRUFEX1BUUiggJmFkZHIsIDEgKSkgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBERUJVR19EaXNhc20oICZhZGRyICk7CisgICAgICAgICAgICAgICAgICAgIERFQlVHX0Rpc2FzbSggJmFkZHIsIFRSVUUgKTsKICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCX0KIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvbXNjLmMgYi9kZWJ1Z2dlci9tc2MuYwppbmRleCBkYzI5Y2E5Li4xYzE4MTdiIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9tc2MuYworKysgYi9kZWJ1Z2dlci9tc2MuYwpAQCAtOCwyNiArOCwzMzIgQEAKICAqIHRoYXQgcnVuIHVuZGVyIFdpbmRvd3MtTlQgZm9yIGV4YW1wbGUuICBJIGRvdWJ0IHRoYXQgdGhpcyB3b3VsZCB3b3JrIHdlbGwKICAqIGZvciAxNiBiaXQgYXBwbGljYXRpb25zLCBidXQgSSBkb24ndCB0aGluayBpdCByZWFsbHkgbWF0dGVycyBzaW5jZSB0aGUKICAqIGZpbGUgZm9ybWF0IGlzIGRpZmZlcmVudCwgYW5kIHdlIHNob3VsZCBuZXZlciBnZXQgaW4gaGVyZSBpbiBzdWNoIGNhc2VzLgorICoKKyAqIFRPRE86CisgKglHZXQgMTYgYml0IENWIHN0dWZmIHdvcmtpbmcuCisgKglBZGQgc3ltYm9sIHNpemUgdG8gaW50ZXJuYWwgc3ltYm9sIHRhYmxlLgogICovCiAKICNpbmNsdWRlIDxzdGRpby5oPgotCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8bWFsbG9jLmg+CiAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgorI2luY2x1ZGUgInBlZXhlLmgiCiAjaW5jbHVkZSAiZGVidWdnZXIuaCIKICNpbmNsdWRlICJwZWV4ZS5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAogLyoKKyAqIFRoaXMgaXMgdXNlZCBzbyB0aGF0IHdlIGhhdmUgc29tZSBpZGVhIG9mIHdoYXQgd2UgYXJlIGluIGZhY3QgbG9hZGluZworICogYXQgYW55IGdpdmVuIHRpbWUuCisgKi8KK2NoYXIgKiBERUJVR19jdXJyX21vZHVsZSA9IE5VTEw7CisKKy8qCisgKiBUaGlzIGlzIGFuIGluZGV4IHdlIHVzZSB0byBrZWVwIHRyYWNrIG9mIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbgorICogd2hlbiB3ZSBoYXZlIG11bHRpcGxlIHNvdXJjZXMuICBXZSB1c2UgdGhlIHNhbWUgZGF0YWJhc2UgdG8gYWxzbworICogYWxsb3cgdXMgdG8gZG8gYW4gJ2luZm8gc2hhcmVkJyB0eXBlIG9mIGRlYWwsIGFuZCB3ZSB1c2UgdGhlIGluZGV4CisgKiB0byBlbGltaW5hdGUgZHVwbGljYXRlcy4KKyAqLworc3RhdGljIGludCBERUJVR19uZXh0X2luZGV4ID0gMDsKKwordW5pb24gYW55X3NpemUKK3sKKyAgY2hhcgkJICogYzsKKyAgc2hvcnQJCSAqIHM7CisgIGludAkJICogaTsKKyAgdW5zaWduZWQgaW50ICAgKiB1aTsKK307CisKKy8qCisgKiBUaGlzIGlzIGEgY29udmVuaWVuY2Ugc3RydWN0dXJlIHVzZWQgdG8gbWFwIHBvcnRpb25zIG9mIHRoZQorICogbGluZSBudW1iZXIgdGFibGUuCisgKi8KK3N0cnVjdCBzdGFydGVuZAoreworICB1bnNpZ25lZCBpbnQJICBzdGFydDsKKyAgdW5zaWduZWQgaW50CSAgZW5kOworfTsKKworLyoKKyAqIFRoaXMgaXMgaG93IHdlIHJlZmVyZW5jZSB0aGUgdmFyaW91cyByZWNvcmQgdHlwZXMuCisgKi8KK3VuaW9uIGNvZGV2aWV3X3N5bWJvbAoreworICBzdHJ1Y3QKKyAgeworICAgIHNob3J0IGludAlsZW47CisgICAgc2hvcnQgaW50CWlkOworICB9IGdlbmVyaWM7CisKKyAgc3RydWN0CisgIHsKKwlzaG9ydCBpbnQJbGVuOworCXNob3J0IGludAlpZDsKKwl1bnNpZ25lZCBpbnQJb2Zmc2V0OworCXVuc2lnbmVkIHNob3J0CXNlZzsKKwl1bnNpZ25lZCBzaG9ydAlzeW10eXBlOworCXVuc2lnbmVkIGNoYXIJbmFtZWxlbjsKKwl1bnNpZ25lZCBjaGFyCW5hbWVbMV07CisgIH0gZGF0YTsKKworICBzdHJ1Y3QKKyAgeworCXNob3J0IGludAlsZW47CisJc2hvcnQgaW50CWlkOworCXVuc2lnbmVkIGludAlwcGFyZW50OworCXVuc2lnbmVkIGludAlwZW5kOworCXVuc2lnbmVkIGludAluZXh0OworCXVuc2lnbmVkIGludAlvZmZzZXQ7CisJdW5zaWduZWQgc2hvcnQJc2VnbWVudDsKKwl1bnNpZ25lZCBzaG9ydAl0aHVua19sZW47CisJdW5zaWduZWQgY2hhcgl0aHR5cGU7CisJdW5zaWduZWQgY2hhcgluYW1lbGVuOworCXVuc2lnbmVkIGNoYXIJbmFtZVsxXTsKKyAgfSB0aHVuazsKKyAgc3RydWN0CisgIHsKKwlzaG9ydCBpbnQJbGVuOworCXNob3J0IGludAlpZDsKKwl1bnNpZ25lZCBpbnQJcHBhcmVudDsKKwl1bnNpZ25lZCBpbnQJcGVuZDsKKwl1bnNpZ25lZCBpbnQJbmV4dDsKKwl1bnNpZ25lZCBpbnQJcHJvY19sZW47CisJdW5zaWduZWQgaW50CWRlYnVnX3N0YXJ0OworCXVuc2lnbmVkIGludAlkZWJ1Z19lbmQ7CisJdW5zaWduZWQgaW50CW9mZnNldDsKKwl1bnNpZ25lZCBzaG9ydAlzZWdtZW50OworCXVuc2lnbmVkIHNob3J0CXByb2N0eXBlOworCXVuc2lnbmVkIGNoYXIJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgluYW1lbGVuOworCXVuc2lnbmVkIGNoYXIJbmFtZVsxXTsKKyAgfSBwcm9jOworICBzdHJ1Y3QKKyAgeworCXNob3J0IGludAlsZW47CS8qIFRvdGFsIGxlbmd0aCBvZiB0aGlzIGVudHJ5ICovCisJc2hvcnQgaW50CWlkOwkJLyogQWx3YXlzIFNfQlBSRUwzMiAqLworCXVuc2lnbmVkIGludAlvZmZzZXQ7CS8qIFN0YWNrIG9mZnNldCByZWxhdGl2ZSB0byBCUCAqLworCXVuc2lnbmVkIHNob3J0CXN5bXR5cGU7CisJdW5zaWduZWQgY2hhcgluYW1lbGVuOworCXVuc2lnbmVkIGNoYXIJbmFtZVsxXTsKKyAgfSBzdGFjazsKK307CisKK3VuaW9uIGNvZGV2aWV3X3R5cGUKK3sKKyAgc3RydWN0CisgIHsKKyAgICBzaG9ydCBpbnQJbGVuOworICAgIHNob3J0IGludAlpZDsKKyAgfSBnZW5lcmljOworCisgIHN0cnVjdAorICB7CisgICAgc2hvcnQgaW50CQlsZW47CisgICAgc2hvcnQgaW50CQlpZDsKKyAgICBzaG9ydCBpbnQJCWF0dHJpYnV0ZTsKKyAgICBzaG9ydCBpbnQJCWRhdGF0eXBlOworICAgIHVuc2lnbmVkIGNoYXIJdmFyaWFudFsxXTsKKyAgfSBwb2ludGVyOworCisgIHN0cnVjdAorICB7CisgICAgc2hvcnQgaW50CQlsZW47CisgICAgc2hvcnQgaW50CQlpZDsKKyAgICB1bnNpZ25lZCBjaGFyCW5iaXRzOworICAgIHVuc2lnbmVkIGNoYXIJYml0b2ZmOworICAgIHVuc2lnbmVkIHNob3J0CXR5cGU7CisgIH0gYml0ZmllbGQ7CisKKyAgc3RydWN0CisgIHsKKyAgICBzaG9ydCBpbnQJCWxlbjsKKyAgICBzaG9ydCBpbnQJCWlkOworICAgIHNob3J0IGludAkJZWxlbXR5cGU7CisgICAgc2hvcnQgaW50CQlpZHh0eXBlOworICAgIHVuc2lnbmVkIGNoYXIJYXJybGVuOworICAgIHVuc2lnbmVkIGNoYXIJbmFtZWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVbMV07CisgIH0gYXJyYXk7CisKKyAgc3RydWN0CisgIHsKKyAgICBzaG9ydCBpbnQJCWxlbjsKKyAgICBzaG9ydCBpbnQJCWlkOworICAgIHNob3J0IGludAkJbl9lbGVtZW50OworICAgIHNob3J0IGludAkJZmllbGRsaXN0OworICAgIHNob3J0IGludAkJcHJvcGVydHk7CisgICAgc2hvcnQgaW50CQlkZXJpdmVkOworICAgIHNob3J0IGludAkJdnNoYXBlOworICAgIHVuc2lnbmVkIHNob3J0CXN0cnVjdGxlbjsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVsZW47CisgICAgdW5zaWduZWQgY2hhcgluYW1lWzFdOworICB9IHN0cnVjdHVyZTsKKworICBzdHJ1Y3QKKyAgeworICAgIHNob3J0IGludAkJbGVuOworICAgIHNob3J0IGludAkJaWQ7CisgICAgc2hvcnQgaW50CQljb3VudDsKKyAgICBzaG9ydCBpbnQJCWZpZWxkOworICAgIHNob3J0IGludAkJcHJvcGVydHk7CisgICAgdW5zaWduZWQgc2hvcnQJdW5fbGVuOworICAgIHVuc2lnbmVkIGNoYXIJbmFtZWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVbMV07CisgIH0gdF91bmlvbjsKKworICBzdHJ1Y3QKKyAgeworICAgIHNob3J0IGludAkJbGVuOworICAgIHNob3J0IGludAkJaWQ7CisgICAgc2hvcnQgaW50CQljb3VudDsKKyAgICBzaG9ydCBpbnQJCXR5cGU7CisgICAgc2hvcnQgaW50CQlmaWVsZDsKKyAgICBzaG9ydCBpbnQJCXByb3BlcnR5OworICAgIHVuc2lnbmVkIGNoYXIJbmFtZWxlbjsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVbMV07CisgIH0gZW51bWVyYXRpb247CisKKyAgc3RydWN0CisgIHsKKyAgICBzaG9ydCBpbnQJCWlkOworICAgIHNob3J0IGludAkJYXR0cmlidXRlOworICAgIHVuc2lnbmVkIHNob3J0IGludAl2YWx1ZTsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVsZW47CisgICAgdW5zaWduZWQgY2hhcgluYW1lWzFdOworICB9IGVudW1lcmF0ZTsKKworICBzdHJ1Y3QKKyAgeworICAgIHNob3J0IGludAkJaWQ7CisgICAgc2hvcnQgaW50CQl0eXBlOworICAgIHNob3J0IGludAkJYXR0cmlidXRlOworICAgIHVuc2lnbmVkIHNob3J0IGludAlvZmZzZXQ7CisgICAgdW5zaWduZWQgY2hhcgluYW1lbGVuOworICAgIHVuc2lnbmVkIGNoYXIJbmFtZVsxXTsKKyAgfSBtZW1iZXI7CisKKyAgc3RydWN0CisgIHsKKyAgICBzaG9ydCBpbnQJCWxlbjsKKyAgICBzaG9ydCBpbnQJCWlkOworICAgIHNob3J0IGludAkJY291bnQ7CisgICAgc2hvcnQgaW50CQl0eXBlOworICAgIHNob3J0IGludAkJZmllbGQ7CisgICAgc2hvcnQgaW50CQlwcm9wZXJ0eTsKKyAgICB1bnNpZ25lZCBjaGFyCW5hbWVsZW47CisgICAgdW5zaWduZWQgY2hhcgluYW1lWzFdOworICB9IGZpZWxkbGlzdDsKKworfTsKKworI2RlZmluZSBTX0JQUkVMMzIJMHgyMDAKKyNkZWZpbmUgU19MREFUQTMyCTB4MjAxCisjZGVmaW5lIFNfR0RBVEEzMgkweDIwMgorI2RlZmluZSBTX1BVQjMyCQkweDIwMworI2RlZmluZSBTX0xQUk9DMzIJMHgyMDQKKyNkZWZpbmUgU19HUFJPQzMyCTB4MjA1CisjZGVmaW5lIFNfVEhVTkszMgkweDIwNgorI2RlZmluZSBTX0JMT0NLMzIJMHgyMDcKKyNkZWZpbmUgU19XSVRIMzIJMHgyMDgKKyNkZWZpbmUgU19MQUJFTDMyCTB4MjA5CisKKyNkZWZpbmUgU19QUk9DUkVGCTB4NDAwCisjZGVmaW5lIFNfREFUQVJFRgkweDQwMQorI2RlZmluZSBTX0FMSUdOCQkweDQwMgorI2RlZmluZSBTX1VOS05PV04JMHg0MDMKKworLyoKKyAqIFRoaXMgY292ZXJzIHRoZSBiYXNpYyBkYXRhdHlwZXMgdGhhdCBWQysrIHNlZW1zIHRvIGJlIHVzaW5nIHRoZXNlIGRheXMuCisgKiAzMiBiaXQgbW9kZSBvbmx5LiAgVGhlcmUgYXJlIGFkZGl0aW9uYWwgbnVtYmVycyBmb3IgdGhlIHBvaW50ZXJzIGluIDE2CisgKiBiaXQgbW9kZS4gIFRoZXJlIGFyZSBtYW55IG90aGVyIHR5cGVzIGxpc3RlZCBpbiB0aGUgZG9jdW1lbnRzLCBidXQgdGhlc2UKKyAqIGFyZSBhcHBhcmVudGx5IG5vdCB1c2VkIGJ5IHRoZSBjb21waWxlciwgb3IgcmVwcmVzZW50IHBvaW50ZXIgdHlwZXMKKyAqIHRoYXQgYXJlIG5vdCB1c2VkLgorICovCisjZGVmaW5lIFRfTk9UWVBFCTB4MDAwMAkvKiBOb3R5cGUgKi8KKyNkZWZpbmUgVF9BQlMJCTB4MDAwMQkvKiBBYnMgKi8KKyNkZWZpbmUgVF9WT0lECQkweDAwMDMJLyogVm9pZCAqLworI2RlZmluZSBUX0NIQVIJCTB4MDAxMAkvKiBzaWduZWQgY2hhciAqLworI2RlZmluZSBUX1NIT1JUCQkweDAwMTEJLyogc2hvcnQgKi8KKyNkZWZpbmUgVF9MT05HCQkweDAwMTIJLyogbG9uZyAqLworI2RlZmluZSBUX1FVQUQJCTB4MDAxMwkvKiBsb25nIGxvbmcgKi8KKyNkZWZpbmUgVF9VQ0hBUgkJMHgwMDIwCS8qIHVuc2lnbmVkICBjaGFyICovCisjZGVmaW5lIFRfVVNIT1JUCTB4MDAyMQkvKiB1bnNpZ25lZCBzaG9ydCAqLworI2RlZmluZSBUX1VMT05HCQkweDAwMjIJLyogdW5zaWduZWQgbG9uZyAqLworI2RlZmluZSBUX1VRVUFECQkweDAwMjMJLyogdW5zaWduZWQgbG9uZyBsb25nICovCisjZGVmaW5lIFRfUkVBTDMyCTB4MDA0MAkvKiBmbG9hdCAqLworI2RlZmluZSBUX1JFQUw2NAkweDAwNDEJLyogZG91YmxlICovCisjZGVmaW5lIFRfUkNIQVIJCTB4MDA3MAkvKiByZWFsIGNoYXIgKi8KKyNkZWZpbmUgVF9XQ0hBUgkJMHgwMDcxCS8qIHdpZGUgY2hhciAqLworI2RlZmluZSBUX0lOVDQJCTB4MDA3NAkvKiBpbnQgKi8KKyNkZWZpbmUgVF9VSU5UNAkJMHgwMDc1CS8qIHVuc2lnbmVkIGludCAqLworCisjZGVmaW5lIFRfMzJQVk9JRAkweDA0MDMJLyogMzIgYml0IG5lYXIgcG9pbnRlciB0byB2b2lkICovCisjZGVmaW5lIFRfMzJQQ0hBUgkweDA0MTAgIC8qIDE2OjMyIG5lYXIgcG9pbnRlciB0byBzaWduZWQgY2hhciAqLworI2RlZmluZSBUXzMyUFNIT1JUCTB4MDQxMSAgLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIHNob3J0ICovCisjZGVmaW5lIFRfMzJQTE9ORwkweDA0MTIgIC8qIDE2OjMyIG5lYXIgcG9pbnRlciB0byBpbnQgKi8KKyNkZWZpbmUgVF8zMlBRVUFECTB4MDQxMyAgLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIGxvbmcgbG9uZyAqLworI2RlZmluZSBUXzMyUFVDSEFSCTB4MDQyMCAgLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIHVuc2lnbmVkIGNoYXIgKi8KKyNkZWZpbmUgVF8zMlBVU0hPUlQJMHgwNDIxICAvKiAxNjozMiBuZWFyIHBvaW50ZXIgdG8gdW5zaWduZWQgc2hvcnQgKi8KKyNkZWZpbmUgVF8zMlBVTE9ORwkweDA0MjIJLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIHVuc2lnbmVkIGludCAqLworI2RlZmluZSBUXzMyUFVRVUFECTB4MDQyMyAgLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIGxvbmcgbG9uZyAqLworI2RlZmluZSBUXzMyUFJFQUwzMgkweDA0NDAJLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIGZsb2F0ICovCisjZGVmaW5lIFRfMzJQUkVBTDY0CTB4MDQ0MQkvKiAxNjozMiBuZWFyIHBvaW50ZXIgdG8gZmxvYXQgKi8KKyNkZWZpbmUgVF8zMlBSQ0hBUgkweDA0NzAJLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIHJlYWwgY2hhciAqLworI2RlZmluZSBUXzMyUFdDSEFSCTB4MDQ3MQkvKiAxNjozMiBuZWFyIHBvaW50ZXIgdG8gcmVhbCBjaGFyICovCisjZGVmaW5lIFRfMzJQSU5UNAkweDA0NzQJLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIGludCAqLworI2RlZmluZSBUXzMyUFVJTlQ0CTB4MDQ3NSAgLyogMTY6MzIgbmVhciBwb2ludGVyIHRvIHVuc2lnbmVkIGludCAqLworCisjZGVmaW5lIExGX01PRElGSUVSCTB4MQorI2RlZmluZSBMRl9QT0lOVEVSCTB4MgorI2RlZmluZSBMRl9BUlJBWQkweDMKKyNkZWZpbmUgTEZfQ0xBU1MJMHg0CisjZGVmaW5lIExGX1NUUlVDVFVSRQkweDUKKyNkZWZpbmUgTEZfVU5JT04JMHg2CisjZGVmaW5lIExGX0VOVU1FUkFUSU9OCTB4NworI2RlZmluZSBMRl9QUk9DRURVUkUJMHg4CisjZGVmaW5lIExGX01GVU5DVElPTgkweDkKKyNkZWZpbmUgTEZfVlRTSEFQRQkweGEKKyNkZWZpbmUgTEZfQkFSUkFZCTB4ZAorI2RlZmluZSBMRl9ESU1BUlJBWQkweDExCisjZGVmaW5lIExGX1ZGVFBBVEgJMHgxMgorCisjZGVmaW5lIExGX1NLSVAJCTB4MjAwCisjZGVmaW5lIExGX0FSR0xJU1QJMHgyMDEKKyNkZWZpbmUgTEZfRklFTERMSVNUCTB4MjA0CisjZGVmaW5lIExGX0RFUklWRUQJMHgyMDUKKyNkZWZpbmUgTEZfQklURklFTEQJMHgyMDYKKworI2RlZmluZSBMRl9CQ0xBU1MJMHg0MDAKKyNkZWZpbmUgTEZfVkJDTEFTUwkweDQwMQorI2RlZmluZSBMRl9JVkJDTEFTUwkweDQwMgorI2RlZmluZSBMRl9FTlVNRVJBVEUJMHg0MDMKKyNkZWZpbmUgTEZfRlJJRU5ERkNOCTB4NDA0CisjZGVmaW5lIExGX0lOREVYCTB4NDA1CisjZGVmaW5lIExGX01FTUJFUgkweDQwNgorI2RlZmluZSBMRl9TVE1FTUJFUgkweDQwNworI2RlZmluZSBMRl9NRVRIT0QJMHg0MDgKKyNkZWZpbmUgTEZfTkVTVEVEVFlQRQkweDQwOQorI2RlZmluZSBMRl9WRlVOQ1RBQgkweDQwYQorI2RlZmluZSBMRl9GUklFTkRDTFMJMHg0MGIKKyNkZWZpbmUgTEZfT05FTUVUSE9ECTB4NDBjCisjZGVmaW5lIExGX0ZVTkNPRkYJMHg0MGQKKworI2RlZmluZSBNQVhfQlVJTFRJTl9UWVBFUwkweDQ4MAorc3RhdGljIHN0cnVjdCBkYXRhdHlwZSAqIGN2X2Jhc2ljX3R5cGVzW01BWF9CVUlMVElOX1RZUEVTXTsKK3N0YXRpYyBpbnQgbnVtX2N2X2RlZmluZWRfdHlwZXMgPSAwOworc3RhdGljIHN0cnVjdCBkYXRhdHlwZSAqKmN2X2RlZmluZWRfdHlwZXMgPSBOVUxMOworCisvKgogICogRm9yIHRoZSB0eXBlIENPREVWSUVXIGRlYnVnIGRpcmVjdG9yeSBlbnRyaWVzLCB0aGUgZGVidWcgZGlyZWN0b3J5CiAgKiBwb2ludHMgdG8gYSBzdHJ1Y3R1cmUgbGlrZSB0aGlzLiAgVGhlIGN2X25hbWUgZmllbGQgaXMgdGhlIG5hbWUKICAqIG9mIGFuIGV4dGVybmFsIC5QREIgZmlsZS4KQEAgLTYwLDE0ICszNjYsMTkgQEAKIH07CiAKIHN0cnVjdCBDb2ZmTGluZW51bSB7Ci0JdW5zaWduZWQgaW50CVZpcnR1YWxBZGRyOwotCXVuc2lnbmVkIGludAlMaW5lbnVtOworCXVuc2lnbmVkIGludAkJVmlydHVhbEFkZHI7CisJdW5zaWduZWQgc2hvcnQgaW50CUxpbmVudW07CiB9OwogCiBzdHJ1Y3QgQ29mZkZpbGVzIHsKIAl1bnNpZ25lZCBpbnQJc3RhcnRhZGRyOwogCXVuc2lnbmVkIGludAllbmRhZGRyOwogCWNoYXIJICAgICAgKiBmaWxlbmFtZTsKKwlpbnQJCWxpbmV0YWJfb2Zmc2V0OworCWludAkJbGluZWNudDsKKwlzdHJ1Y3QgbmFtZV9oYXNoICoqZW50cmllczsKKwlpbnQJCSAgICAgICBuZXBzOworCWludAkJIG5lcHNfYWxsb2M7CiB9OwogCiAKQEAgLTk1LDE0ICs0MDYsMTE4IEBACiAgIGNoYXIgICAgICAgICAgIFNlbGVjdGlvbjsKIH0gU2VjdGlvbjsKIAorLyoKKyAqIFRoZXNlIHR3byBzdHJ1Y3R1cmVzIGFyZSB1c2VkIGluIHRoZSBkaXJlY3Rvcnkgd2l0aGluIGEgLkRCRyBmaWxlCisgKiB0byBsb2NhdGUgdGhlIGluZGl2aWR1YWwgaW1wb3J0YW50IGJpdHMgdGhhdCB3ZSBtaWdodCB3YW50IHRvIHNlZS4KKyAqLworc3RydWN0IENWNF9EaXJIZWFkIHsKKyAgc2hvcnQgdW5zaWduZWQgaW50CSAgIGRoc2l6ZTsKKyAgc2hvcnQgdW5zaWduZWQgaW50CSAgIGRlc2l6ZTsKKyAgdW5zaWduZWQgaW50CQkgICBuZGlyOworICB1bnNpZ25lZCBpbnQJCSAgIG5leHRfb2Zmc2V0OworICB1bnNpZ25lZCBpbnQJCSAgIGZsYWdzOworfTsKKworc3RydWN0IENWNF9EaXJFbnQgeworICBzaG9ydCB1bnNpZ25lZCBpbnQJICAgc3Vic2VjdF9udW1iZXI7CisgIHNob3J0IHVuc2lnbmVkIGludAkgICBtb2R1bGVfbnVtYmVyOworICB1bnNpZ25lZCBpbnQJCSAgIG9mZnNldDsKKyAgdW5zaWduZWQgaW50CQkgICBzaXplOworfTsKKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgdmFsdWVzIG9mIGludGVyZXN0IHRoYXQgdGhlIHN1YnNlY3RfbnVtYmVyIGZpZWxkIHRha2VzLgorICovCisjZGVmaW5lCXNzdEFsaWduU3ltCQkweDEyNQorI2RlZmluZQlzc3RTcmNNb2R1bGUJCTB4MTI3CisKK3N0cnVjdCBjb2Rldmlld19saW5ldGFiX2hkcgoreworICB1bnNpZ25lZCBpbnQJCSAgIG5saW5lOworICB1bnNpZ25lZCBpbnQJCSAgIHNlZ25vOworICB1bnNpZ25lZCBpbnQJCSAgIHN0YXJ0OworICB1bnNpZ25lZCBpbnQJCSAgIGVuZDsKKyAgY2hhcgkJCSAqIHNvdXJjZWZpbGU7CisgIHVuc2lnbmVkIHNob3J0CSAqIGxpbmV0YWI7CisgIHVuc2lnbmVkIGludAkJICogb2ZmdGFiOworfTsKKworc3RydWN0IGNvZGV2aWV3X3BkYl9oZHIKK3sKKyAgY2hhcgkJaWRlbnRbNDRdOworICB1bnNpZ25lZCBpbnQJYmxvY2tzaXplOwkgICAvKiBFeHRlbnQgc2l6ZSAqLworICB1bnNpZ25lZCBzaG9ydCBsb2NfZnJlZWxpc3Q7ICAgLyogZnJlZWxpc3QuICovCisgIHVuc2lnbmVkIHNob3J0IGFsbG9jX2ZpbGVzaXplOyAvKiAjIGV4dGVudHMgYWxsb2NhdGVkLiAqLworICB1bnNpZ25lZCBpbnQJdG9jX2xlbjsKKyAgdW5zaWduZWQgaW50CXVua25vd247CisgIHVuc2lnbmVkIHNob3J0IHRvY19leHRbMV07CSAgIC8qIGFycmF5IG9mIGV4dGVudCAjJ3MgZm9yIHRvYy4gKi8KK307CisKKy8qCisgKiBUaGlzIGlzIG91ciBvd24gc3RydWN0dXJlIHRoYXQgd2UgdXNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGNvbnRlbnRzCisgKiBvZiBhIFBEQiBmaWxlLgorICovCitzdHJ1Y3QgZmlsZV9saXN0Cit7CisJaW50CQlyZWNvcmRfbGVuOworCWludAkJbmV4dGVudHM7CisJc2hvcnQgaW50ICAgICAqIGV4dGVudF9saXN0OworCXVuc2lnbmVkIGludAlsaW5ldGFiX29mZnNldDsKKwl1bnNpZ25lZCBpbnQJbGluZXRhYl9sZW47Cit9OworCisvKgorICogVGhlc2UgYXJlIHRoZSBzdHJ1Y3R1cmVzIHRoYXQgcmVwcmVzZW50IGhvdyB0aGUgZmlsZSB0YWJsZSBpcyBzZXQgdXAKKyAqIHdpdGhpbiB0aGUgUERCIGZpbGUuCisgKi8KK3N0cnVjdCBmaWxldGFiX2hkcgoreworICB1bnNpZ25lZCBzaG9ydAl0YWIxX2ZpbGU7CisgIHVuc2lnbmVkIHNob3J0CXRhYjJfZmlsZTsKKyAgdW5zaWduZWQgc2hvcnQJZ3N5bV9maWxlOworICB1bnNpZ25lZCBzaG9ydAlwYWRkaW5nOworICB1bnNpZ25lZCBpbnQJCWZ0YWJfbGVuOworICB1bnNpZ25lZCBpbnQJCWZvZmZ0YWJfbGVuOworICB1bnNpZ25lZCBpbnQJCWhhc2hfbGVuOworICB1bnNpZ25lZCBpbnQJCXN0cnRhYl9sZW47Cit9OworCitzdHJ1Y3QgZmlsZV9lbnQKK3sKKyAgdW5zaWduZWQgaW50CQlyZXNlcnZlZDE7CisgIHVuc2lnbmVkIHNob3J0CWRhdGFzZWN0X3NlZ21lbnQ7CisgIHVuc2lnbmVkIHNob3J0CXJlc2VydmVkMjsKKyAgdW5zaWduZWQgaW50CQlkYXRhc2VjdF9vZmZzZXQ7CisgIHVuc2lnbmVkIGludAkJZGF0YXNlY3Rfc2l6ZTsKKyAgdW5zaWduZWQgaW50CQlkYXRhc2VjdF9mbGFnczsKKyAgdW5zaWduZWQgc2hvcnQJcmVzZXJ2ZWQzOworICB1bnNpZ25lZCBzaG9ydAlpbmRleDsKKyAgdW5zaWduZWQgc2hvcnQJbnVtNmE7CisgIHVuc2lnbmVkIHNob3J0CWZpbGVfbnVtYmVyOworICB1bnNpZ25lZCBpbnQJCWxpbmV0YWJfb2Zmc2V0OworICB1bnNpZ25lZCBpbnQJCWxpbmV0YWJfbGVuOworICB1bnNpZ25lZCBpbnQJCW51bTk7CisgIHVuc2lnbmVkIGludAkJbnVtMTA7CisgIHVuc2lnbmVkIGludAkJbnVtMTE7CisgIHVuc2lnbmVkIGNoYXIJCWZpbGVuYW1lWzFdOworfTsKKworLyoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICovCiBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbwogewogCXN0cnVjdCBkZWZlcnJlZF9kZWJ1Z19pbmZvCSogbmV4dDsKIAljaGFyCQkJCSogbG9hZF9hZGRyOworCWNoYXIJCQkJKiBtb2R1bGVfbmFtZTsKIAljaGFyCQkJCSogZGJnX2luZm87CiAJaW50CQkJCSAgZGJnX3NpemU7CiAJc3RydWN0IFBFX0RlYnVnX2RpcgkJKiBkYmdkaXI7CiAJc3RydWN0IHBlX2RhdGEJCQkqIHBlOworICAgICAgICBzdHJ1Y3QgcGVfc2VnbWVudF90YWJsZSAgICAgICAgICogc2VjdHA7CisJaW50CQkJCSAgbnNlY3Q7CisJc2hvcnQgaW50CQkJICBkYmdfaW5kZXg7CQkJCisJY2hhcgkJCQkgIGxvYWRlZDsKIH07CiAKIHN0cnVjdCBkZWZlcnJlZF9kZWJ1Z19pbmZvICogZGJnbGlzdCA9IE5VTEw7CkBAIC0xMjQsNiArNTM5LDMyOSBAQAogI2RlZmluZSBJTUFHRV9TWU1fQ0xBU1NfU1RBVElDICAgICAgICAgICAgICAweDMKICNkZWZpbmUgSU1BR0VfU1lNX0NMQVNTX0ZJTEUgICAgICAgICAgICAgICAgMHg2NwogCitzdGF0aWMgCitzdHJ1Y3QgZGF0YXR5cGUgKiBERUJVR19HZXRDVlR5cGUoaW50IHR5cGVubykKK3sKKyAgc3RydWN0IGRhdGF0eXBlICogZHQgPSBOVUxMOworCisgIC8qCisgICAqIENvbnZlcnQgQ29kZXZpZXcgdHlwZSBudW1iZXJzIGludG8gc29tZXRoaW5nIHdlIGNhbiBncm9rIGludGVybmFsbHkuCisgICAqIE51bWJlcnMgPCAweDEwMDAgYXJlIGFsbCBmaXhlZCBidWlsdGluIHR5cGVzLiAgTnVtYmVycyBmcm9tIDB4MTAwMCBhbmQKKyAgICogdXAgYXJlIGFsbCB1c2VyIGRlZmluZWQgKHN0cnVjdHMsIGV0YykuCisgICAqLworICBpZiggdHlwZW5vIDwgMHgxMDAwICkKKyAgICB7CisgICAgICBpZiggdHlwZW5vIDwgTUFYX0JVSUxUSU5fVFlQRVMgKQorCXsKKwkgIGR0ID0gY3ZfYmFzaWNfdHlwZXNbdHlwZW5vXTsKKwl9CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaWYoIHR5cGVubyAtIDB4MTAwMCA8IG51bV9jdl9kZWZpbmVkX3R5cGVzICkKKwl7CisJICBkdCA9IGN2X2RlZmluZWRfdHlwZXNbdHlwZW5vIC0gMHgxMDAwXTsKKwl9IAorICAgIH0KKworICByZXR1cm4gZHQ7Cit9CisKK3N0YXRpYyBpbnQKK0RFQlVHX1BhcnNlVHlwZVRhYmxlKGNoYXIgKiB0YWJsZSwgaW50IGxlbikKK3sKKyAgaW50CQkJCSAgYXJyX21heDsKKyAgaW50CQkJCSAgY3Vycl90eXBlOworICBlbnVtIGRlYnVnX3R5cGUJCSAgZmllbGR0eXBlOworICBpbnQJCQkJICBlbGVtX3NpemU7CisgIHVuaW9uIGFueV9zaXplCQkgIHB0cjsKKyAgdW5pb24gYW55X3NpemUJCSAgcHRyMjsKKyAgc3RydWN0IGRhdGF0eXBlCQkqIHN1YnR5cGU7CisgIGNoYXIJCQkJICBzeW1uYW1lWzI1Nl07CisgIHVuaW9uIGNvZGV2aWV3X3R5cGUJCSogdHlwZTsKKyAgdW5pb24gY29kZXZpZXdfdHlwZQkJKiB0eXBlMjsKKyAgc3RydWN0IGRhdGF0eXBlCQkqIHR5cGVwdHI7CisKKyAgY3Vycl90eXBlID0gMHgxMDAwOworCisgIHB0ciA9ICh1bmlvbiBhbnlfc2l6ZSkgKHRhYmxlICsgMTYpOworICB3aGlsZSggcHRyLmMgLSB0YWJsZSA8IGxlbiApCisgICAgeworICAgICAgdHlwZSA9ICh1bmlvbiBjb2Rldmlld190eXBlICopIHB0ci5jOworCisgICAgICBpZiggY3Vycl90eXBlIC0gMHgxMDAwID49IG51bV9jdl9kZWZpbmVkX3R5cGVzICkKKwl7CisJICBudW1fY3ZfZGVmaW5lZF90eXBlcyArPSAweDEwMDsKKwkgIGN2X2RlZmluZWRfdHlwZXMgPSAoc3RydWN0IGRhdGF0eXBlICoqKSByZWFsbG9jKGN2X2RlZmluZWRfdHlwZXMsCisJCSAgbnVtX2N2X2RlZmluZWRfdHlwZXMgKiBzaXplb2Yoc3RydWN0IGRhdGF0eXBlICopKTsKKwkgIG1lbXNldChjdl9kZWZpbmVkX3R5cGVzICsgbnVtX2N2X2RlZmluZWRfdHlwZXMgLSAweDEwMCwKKwkJIDAsCisJCSAweDEwMCAqIHNpemVvZihzdHJ1Y3QgZGF0YXR5cGUgKikpOworCSAgaWYoIGN2X2RlZmluZWRfdHlwZXMgPT0gTlVMTCApCisJICAgIHsKKwkgICAgICByZXR1cm4gRkFMU0U7CisJICAgIH0KKwl9CisKKyAgICAgIHN3aXRjaCh0eXBlLT5nZW5lcmljLmlkKQorCXsKKwljYXNlIExGX1BPSU5URVI6CisJICBjdl9kZWZpbmVkX3R5cGVzW2N1cnJfdHlwZSAtIDB4MTAwMF0gPSAKKwkgICAgREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKERFQlVHX0dldENWVHlwZSh0eXBlLT5wb2ludGVyLmRhdGF0eXBlKSk7CisJICBicmVhazsKKwljYXNlIExGX0FSUkFZOgorCSAgaWYoIHR5cGUtPmFycmF5LmFycmxlbiA+PSAweDgwMDAgKQorCSAgICB7CisJICAgICAgLyoKKwkgICAgICAgKiBUaGlzIGlzIGEgbnVtZXJpYyBsZWFmLCBJIGFtIHRvbyBsYXp5IHRvIGhhbmRsZSB0aGlzIHJpZ2h0CisJICAgICAgICogbm93LgorCSAgICAgICAqLworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgbGFyZ2UgbnVtYmVyaWMgbGVhZi5cbiIpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBpZiggdHlwZS0+YXJyYXkubmFtZWxlbiAhPSAwICkKKwkgICAgeworCSAgICAgIG1lbXNldChzeW1uYW1lLCAwLCBzaXplb2Yoc3ltbmFtZSkpOworCSAgICAgIG1lbWNweShzeW1uYW1lLCB0eXBlLT5hcnJheS5uYW1lLCB0eXBlLT5hcnJheS5uYW1lbGVuKTsKKwkgICAgICB0eXBlcHRyID0gREVCVUdfTmV3RGF0YVR5cGUoQVJSQVksIHN5bW5hbWUpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICB0eXBlcHRyID0gREVCVUdfTmV3RGF0YVR5cGUoQVJSQVksIE5VTEwpOworCSAgICB9CisJICBjdl9kZWZpbmVkX3R5cGVzW2N1cnJfdHlwZSAtIDB4MTAwMF0gPSB0eXBlcHRyOworCisJICBzdWJ0eXBlID0gREVCVUdfR2V0Q1ZUeXBlKHR5cGUtPmFycmF5LmVsZW10eXBlKTsKKwkgIGlmKCAgICAoc3VidHlwZSA9PSBOVUxMKQorCSAgICAgIHx8IChlbGVtX3NpemUgPSBERUJVR19HZXRPYmplY3RTaXplKHN1YnR5cGUpKSA9PSAwICkKKwkgICAgeworCSAgICAgIGFycl9tYXggPSAwOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBhcnJfbWF4ID0gdHlwZS0+YXJyYXkuYXJybGVuIC8gREVCVUdfR2V0T2JqZWN0U2l6ZShzdWJ0eXBlKTsKKwkgICAgfQorCisJICBERUJVR19TZXRBcnJheVBhcmFtcyh0eXBlcHRyLCAwLCBhcnJfbWF4LCBzdWJ0eXBlKTsKKwkgIGJyZWFrOworCWNhc2UgTEZfRklFTERMSVNUOgorCSAgLyoKKwkgICAqIFRoaXMgaXMgd2hlcmUgdGhlIGJhc2ljIGxpc3Qgb2YgZmllbGRzIGlzIGRlZmluZWQgZm9yCisJICAgKiBzdHJ1Y3R1cmVzIGFuZCBjbGFzc2VzLgorCSAgICoKKwkgICAqIEZpcnN0LCB3ZSBuZWVkIHRvIGxvb2sgYWhlYWQgYW5kIHNlZSB3aGV0aGVyIHdlIGFyZSBidWlsZGluZworCSAgICogYSBmaWVsZGxpc3QgZm9yIGFuIGVudW0gb3IgYSBzdHJ1Y3QuCisJICAgKi8KKwkgIHB0cjIuaSA9IHB0ci5pICsgMTsKKwkgIHR5cGUyID0gKHVuaW9uIGNvZGV2aWV3X3R5cGUgKikgcHRyMi5jOworCSAgaWYoIHR5cGUyLT5tZW1iZXIuaWQgPT0gTEZfTUVNQkVSICkKKwkgICAgeworCSAgICAgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIE5VTEwpOworCSAgICAgIGZpZWxkdHlwZSA9IFNUUlVDVDsKKwkgICAgfQorCSAgZWxzZSBpZiggdHlwZTItPm1lbWJlci5pZCA9PSBMRl9FTlVNRVJBVEUgKQorCSAgICB7CisJICAgICAgdHlwZXB0ciA9IERFQlVHX05ld0RhdGFUeXBlKEVOVU0sIE5VTEwpOworCSAgICAgIGZpZWxkdHlwZSA9IEVOVU07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGN2X2RlZmluZWRfdHlwZXNbY3Vycl90eXBlIC0gMHgxMDAwXSA9IHR5cGVwdHI7CisJICB3aGlsZSggcHRyMi5jIDwgKHB0ci5jICsgKCh0eXBlLT5nZW5lcmljLmxlbiArIDMpICYgfjMpKSApCisJICAgIHsKKwkgICAgICB0eXBlMiA9ICh1bmlvbiBjb2Rldmlld190eXBlICopIHB0cjIuYzsKKwkgICAgICBpZiggdHlwZTItPm1lbWJlci5pZCA9PSBMRl9NRU1CRVIgJiYgZmllbGR0eXBlID09IFNUUlVDVCApCisJCXsKKwkJICBtZW1zZXQoc3ltbmFtZSwgMCwgc2l6ZW9mKHN5bW5hbWUpKTsKKwkJICBtZW1jcHkoc3ltbmFtZSwgdHlwZTItPm1lbWJlci5uYW1lLCB0eXBlMi0+bWVtYmVyLm5hbWVsZW4pOworCQkgIAorCQkgIHN1YnR5cGUgPSBERUJVR19HZXRDVlR5cGUodHlwZTItPm1lbWJlci50eXBlKTsKKwkJICBlbGVtX3NpemUgPSAwOworCQkgIGlmKCBzdWJ0eXBlICE9IE5VTEwgKQorCQkgICAgeworCQkgICAgICBlbGVtX3NpemUgPSBERUJVR19HZXRPYmplY3RTaXplKHN1YnR5cGUpOworCQkgICAgfQorCQkgIAorCQkgIGlmKCB0eXBlMi0+bWVtYmVyLm9mZnNldCA+PSAweDgwMDAgKQorCQkgICAgeworCQkgICAgICAvKgorCQkgICAgICAgKiBUaGlzIGlzIGEgbnVtZXJpYyBsZWFmLCBJIGFtIHRvbyBsYXp5IHRvIGhhbmRsZSB0aGlzIHJpZ2h0CisJCSAgICAgICAqIG5vdy4KKwkJICAgICAgICovCisJCSAgICAgIGZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgbGFyZ2UgbnVtYmVyaWMgbGVhZi5cbiIpOworCQkgICAgfQorCQkgIGVsc2UKKwkJICAgIHsKKwkJICAgICAgREVCVUdfQWRkU3RydWN0RWxlbWVudCh0eXBlcHRyLCBzeW1uYW1lLCBzdWJ0eXBlLCAKKwkJCQkJICAgICB0eXBlMi0+bWVtYmVyLm9mZnNldCA8PCAzLAorCQkJCQkgICAgIGVsZW1fc2l6ZSA8PCAzKTsKKwkJICAgIH0KKwkJfQorCSAgICAgIGVsc2UgaWYoIHR5cGUyLT5tZW1iZXIuaWQgPT0gTEZfRU5VTUVSQVRFICYmIGZpZWxkdHlwZSA9PSBFTlVNICkKKwkJeworCQkgIG1lbXNldChzeW1uYW1lLCAwLCBzaXplb2Yoc3ltbmFtZSkpOworCQkgIG1lbWNweShzeW1uYW1lLCB0eXBlMi0+ZW51bWVyYXRlLm5hbWUsIHR5cGUyLT5lbnVtZXJhdGUubmFtZWxlbik7CisJCSAgCisJCSAgaWYoIHR5cGUyLT5lbnVtZXJhdGUudmFsdWUgPj0gMHg4MDAwICkKKwkJICAgIHsKKwkJICAgICAgLyoKKwkJICAgICAgICogVGhpcyBpcyBhIG51bWVyaWMgbGVhZiwgSSBhbSB0b28gbGF6eSB0byBoYW5kbGUgdGhpcyByaWdodAorCQkgICAgICAgKiBub3cuCisJCSAgICAgICAqLworCQkgICAgICBmcHJpbnRmKHN0ZGVyciwgIklnbm9yaW5nIGxhcmdlIG51bWJlcmljIGxlYWYuXG4iKTsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQodHlwZXB0ciwgc3ltbmFtZSwgTlVMTCwgCisJCQkJCSAgICAgdHlwZTItPmVudW1lcmF0ZS52YWx1ZSwgMCk7CisJCSAgICB9CisJCX0KKwkgICAgICBlbHNlCisJCXsKKwkJICAvKgorCQkgICAqIFNvbWV0aGluZyBlbHNlIEkgaGF2ZSBuZXZlciBzZWVuIGJlZm9yZS4gIEVpdGhlciB3cm9uZyB0eXBlIG9mCisJCSAgICogb2JqZWN0IGluIHRoZSBmaWVsZGxpc3QsIG9yIHNvbWUgb3RoZXIgcHJvYmxlbSB3aGljaCBJIHdvdWxkbid0CisJCSAgICogcmVhbGx5IGtub3cgaG93IHRvIGhhbmRsZSB1bnRpbCBpdCBjYW1lIHVwLgorCQkgICAqLworCQkgIGZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBlbnRyeSBpbiBmaWVsZGxpc3RcbiIpOworCQkgIGJyZWFrOworCQl9CisKKworCSAgICAgIHB0cjIuYyArPSAoKHR5cGUyLT5tZW1iZXIubmFtZWxlbiArIDkgKyAzKSAmIH4zKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBMRl9TVFJVQ1RVUkU6CisJY2FzZSBMRl9DTEFTUzoKKwkgIGlmKCB0eXBlLT5zdHJ1Y3R1cmUuc3RydWN0bGVuID49IDB4ODAwMCApCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIFRoaXMgaXMgYSBudW1lcmljIGxlYWYsIEkgYW0gdG9vIGxhenkgdG8gaGFuZGxlIHRoaXMgcmlnaHQKKwkgICAgICAgKiBub3cuCisJICAgICAgICovCisJICAgICAgZnByaW50ZihzdGRlcnIsICJJZ25vcmluZyBsYXJnZSBudW1iZXJpYyBsZWFmLlxuIik7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIG1lbXNldChzeW1uYW1lLCAwLCBzaXplb2Yoc3ltbmFtZSkpOworCSAgbWVtY3B5KHN5bW5hbWUsIHR5cGUtPnN0cnVjdHVyZS5uYW1lLCB0eXBlLT5zdHJ1Y3R1cmUubmFtZWxlbik7CisJICB0eXBlcHRyID0gREVCVUdfTmV3RGF0YVR5cGUoU1RSVUNULCBzeW1uYW1lKTsKKwkgIGN2X2RlZmluZWRfdHlwZXNbY3Vycl90eXBlIC0gMHgxMDAwXSA9IHR5cGVwdHI7CisKKwkgIC8qCisJICAgKiBOb3cgY29weSB0aGUgcmVsZXZhbnQgYml0cyBmcm9tIHRoZSBmaWVsZGxpc3QgdGhhdCB3ZSBzcGVjaWZpZWQuCisJICAgKi8KKwkgIHN1YnR5cGUgPSBERUJVR19HZXRDVlR5cGUodHlwZS0+c3RydWN0dXJlLmZpZWxkbGlzdCk7CisJICBERUJVR19TZXRTdHJ1Y3RTaXplKHR5cGVwdHIsIHR5cGUtPnN0cnVjdHVyZS5zdHJ1Y3RsZW4pOworCisJICBpZiggc3VidHlwZSAhPSBOVUxMICkKKwkgICAgeworCSAgICAgIERFQlVHX0NvcHlGaWVsZGxpc3QodHlwZXB0ciwgc3VidHlwZSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgTEZfVU5JT046CisJICBpZiggdHlwZS0+dF91bmlvbi51bl9sZW4gPj0gMHg4MDAwICkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogVGhpcyBpcyBhIG51bWVyaWMgbGVhZiwgSSBhbSB0b28gbGF6eSB0byBoYW5kbGUgdGhpcyByaWdodAorCSAgICAgICAqIG5vdy4KKwkgICAgICAgKi8KKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIklnbm9yaW5nIGxhcmdlIG51bWJlcmljIGxlYWYuXG4iKTsKKwkgICAgICBicmVhazsKKwkgICAgfQorCSAgbWVtc2V0KHN5bW5hbWUsIDAsIHNpemVvZihzeW1uYW1lKSk7CisJICBtZW1jcHkoc3ltbmFtZSwgdHlwZS0+dF91bmlvbi5uYW1lLCB0eXBlLT50X3VuaW9uLm5hbWVsZW4pOworCSAgdHlwZXB0ciA9IERFQlVHX05ld0RhdGFUeXBlKFNUUlVDVCwgc3ltbmFtZSk7CisJICBjdl9kZWZpbmVkX3R5cGVzW2N1cnJfdHlwZSAtIDB4MTAwMF0gPSB0eXBlcHRyOworCisJICAvKgorCSAgICogTm93IGNvcHkgdGhlIHJlbGV2YW50IGJpdHMgZnJvbSB0aGUgZmllbGRsaXN0IHRoYXQgd2Ugc3BlY2lmaWVkLgorCSAgICovCisJICBzdWJ0eXBlID0gREVCVUdfR2V0Q1ZUeXBlKHR5cGUtPnRfdW5pb24uZmllbGQpOworCSAgREVCVUdfU2V0U3RydWN0U2l6ZSh0eXBlcHRyLCB0eXBlLT50X3VuaW9uLnVuX2xlbik7CisKKwkgIGlmKCBzdWJ0eXBlICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgREVCVUdfQ29weUZpZWxkbGlzdCh0eXBlcHRyLCBzdWJ0eXBlKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSBMRl9CSVRGSUVMRDoKKwkgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShCSVRGSUVMRCwgTlVMTCk7CisJICBjdl9kZWZpbmVkX3R5cGVzW2N1cnJfdHlwZSAtIDB4MTAwMF0gPSB0eXBlcHRyOworCSAgREVCVUdfU2V0Qml0ZmllbGRQYXJhbXModHlwZXB0ciwgdHlwZS0+Yml0ZmllbGQuYml0b2ZmLAorCQkJCSAgdHlwZS0+Yml0ZmllbGQubmJpdHMsIAorCQkJCSAgREVCVUdfR2V0Q1ZUeXBlKHR5cGUtPmJpdGZpZWxkLnR5cGUpKTsKKwkgIGJyZWFrOworCWNhc2UgTEZfRU5VTUVSQVRJT046CisJICBtZW1zZXQoc3ltbmFtZSwgMCwgc2l6ZW9mKHN5bW5hbWUpKTsKKwkgIG1lbWNweShzeW1uYW1lLCB0eXBlLT5lbnVtZXJhdGlvbi5uYW1lLCB0eXBlLT5lbnVtZXJhdGlvbi5uYW1lbGVuKTsKKwkgIHR5cGVwdHIgPSBERUJVR19OZXdEYXRhVHlwZShFTlVNLCBzeW1uYW1lKTsKKwkgIGN2X2RlZmluZWRfdHlwZXNbY3Vycl90eXBlIC0gMHgxMDAwXSA9IHR5cGVwdHI7CisKKwkgIC8qCisJICAgKiBOb3cgY29weSB0aGUgcmVsZXZhbnQgYml0cyBmcm9tIHRoZSBmaWVsZGxpc3QgdGhhdCB3ZSBzcGVjaWZpZWQuCisJICAgKi8KKwkgIHN1YnR5cGUgPSBERUJVR19HZXRDVlR5cGUodHlwZS0+ZW51bWVyYXRpb24uZmllbGQpOworCisJICBpZiggc3VidHlwZSAhPSBOVUxMICkKKwkgICAgeworCSAgICAgIERFQlVHX0NvcHlGaWVsZGxpc3QodHlwZXB0ciwgc3VidHlwZSk7CisJICAgIH0KKwkgIGJyZWFrOworCWNhc2UgTEZfRElNQVJSQVk6CisJZGVmYXVsdDoKKwkgIGJyZWFrOworCX0KKyAgICAgIGN1cnJfdHlwZSsrOworICAgICAgcHRyLmMgKz0gKHR5cGUtPmdlbmVyaWMubGVuICsgMykgJiB+MzsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK0RFQlVHX0luaXRDVkRhdGFUeXBlcygpCit7CisgIC8qCisgICAqIFRoZXNlIGFyZSB0aGUgY29tbW9uIGJ1aWx0aW4gdHlwZXMgdGhhdCBhcmUgdXNlZCBieSBWQysrLgorICAgKi8KKyAgY3ZfYmFzaWNfdHlwZXNbVF9OT1RZUEVdID0gTlVMTDsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9BQlNdID0gTlVMTDsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9WT0lEXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAidm9pZCIpOworICBjdl9iYXNpY190eXBlc1tUX0NIQVJdID0gREVCVUdfTmV3RGF0YVR5cGUoQkFTSUMsICJjaGFyIik7CisgIGN2X2Jhc2ljX3R5cGVzW1RfU0hPUlRdID0gREVCVUdfTmV3RGF0YVR5cGUoQkFTSUMsICJzaG9ydCBpbnQiKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9MT05HXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAibG9uZyBpbnQiKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9RVUFEXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAibG9uZyBsb25nIGludCIpOworICBjdl9iYXNpY190eXBlc1tUX1VDSEFSXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAidW5zaWduZWQgY2hhciIpOworICBjdl9iYXNpY190eXBlc1tUX1VTSE9SVF0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgInNob3J0IHVuc2lnbmVkIGludCIpOworICBjdl9iYXNpY190eXBlc1tUX1VMT05HXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAibG9uZyB1bnNpZ25lZCBpbnQiKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9VUVVBRF0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgImxvbmcgbG9uZyB1bnNpZ25lZCBpbnQiKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9SRUFMMzJdID0gREVCVUdfTmV3RGF0YVR5cGUoQkFTSUMsICJmbG9hdCIpOworICBjdl9iYXNpY190eXBlc1tUX1JFQUw2NF0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgImRvdWJsZSIpOworICBjdl9iYXNpY190eXBlc1tUX1JDSEFSXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAiY2hhciIpOworICBjdl9iYXNpY190eXBlc1tUX1dDSEFSXSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAic2hvcnQiKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF9JTlQ0XSA9IERFQlVHX05ld0RhdGFUeXBlKEJBU0lDLCAiaW50Iik7CisgIGN2X2Jhc2ljX3R5cGVzW1RfVUlOVDRdID0gREVCVUdfTmV3RGF0YVR5cGUoQkFTSUMsICJ1bnNpZ25lZCBpbnQiKTsKKworICBjdl9iYXNpY190eXBlc1tUXzMyUFZPSURdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfVk9JRF0pOworICBjdl9iYXNpY190eXBlc1tUXzMyUENIQVJdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfQ0hBUl0pOworICBjdl9iYXNpY190eXBlc1tUXzMyUFNIT1JUXSA9IERFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZShjdl9iYXNpY190eXBlc1tUX1NIT1JUXSk7CisgIGN2X2Jhc2ljX3R5cGVzW1RfMzJQTE9OR10gPSBERUJVR19GaW5kT3JNYWtlUG9pbnRlclR5cGUoY3ZfYmFzaWNfdHlwZXNbVF9MT05HXSk7CisgIGN2X2Jhc2ljX3R5cGVzW1RfMzJQUVVBRF0gPSBERUJVR19GaW5kT3JNYWtlUG9pbnRlclR5cGUoY3ZfYmFzaWNfdHlwZXNbVF9RVUFEXSk7CisgIGN2X2Jhc2ljX3R5cGVzW1RfMzJQVUNIQVJdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfVUNIQVJdKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF8zMlBVU0hPUlRdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfVVNIT1JUXSk7CisgIGN2X2Jhc2ljX3R5cGVzW1RfMzJQVUxPTkddID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfVUxPTkddKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF8zMlBVUVVBRF0gPSBERUJVR19GaW5kT3JNYWtlUG9pbnRlclR5cGUoY3ZfYmFzaWNfdHlwZXNbVF9VUVVBRF0pOworICBjdl9iYXNpY190eXBlc1tUXzMyUFJFQUwzMl0gPSBERUJVR19GaW5kT3JNYWtlUG9pbnRlclR5cGUoY3ZfYmFzaWNfdHlwZXNbVF9SRUFMMzJdKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF8zMlBSRUFMNjRdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfUkVBTDY0XSk7CisgIGN2X2Jhc2ljX3R5cGVzW1RfMzJQUkNIQVJdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfUkNIQVJdKTsKKyAgY3ZfYmFzaWNfdHlwZXNbVF8zMlBXQ0hBUl0gPSBERUJVR19GaW5kT3JNYWtlUG9pbnRlclR5cGUoY3ZfYmFzaWNfdHlwZXNbVF9XQ0hBUl0pOworICBjdl9iYXNpY190eXBlc1tUXzMyUElOVDRdID0gREVCVUdfRmluZE9yTWFrZVBvaW50ZXJUeXBlKGN2X2Jhc2ljX3R5cGVzW1RfSU5UNF0pOworICBjdl9iYXNpY190eXBlc1tUXzMyUFVJTlQ0XSA9IERFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZShjdl9iYXNpY190eXBlc1tUX1VJTlQ0XSk7Cit9CisKIC8qCiAgKiBJbiB0aGlzIGZ1bmN0aW9uLCB3ZSBrZWVwIHRyYWNrIG9mIGRlZmVycmVkIGRlYnVnZ2luZyBpbmZvcm1hdGlvbgogICogdGhhdCB3ZSBtYXkgbmVlZCBsYXRlciBpZiB3ZSB3ZXJlIHRvIG5lZWQgdG8gdXNlIHRoZSBpbnRlcm5hbCBkZWJ1Z2dlci4KQEAgLTEzMywxNiArODcxLDQ1IEBACiBERUJVR19SZWdpc3RlckRlYnVnSW5mbyhpbnQgZmQsIHN0cnVjdCBwZV9kYXRhICogcGUsIAogCQkJaW50IGxvYWRfYWRkciwgdV9sb25nIHZfYWRkciwgdV9sb25nIHNpemUpCiB7CisgIGludAkJCSAgaGFzX2NvZGV2aWV3ID0gRkFMU0U7CiAgIGludAkJCSAgcnRuID0gRkFMU0U7CisgIGludAkJCSAgb3JpZ19zaXplOwogICBzdHJ1Y3QgUEVfRGVidWdfZGlyCSogZGJncHRyOwogICBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAqIGRlZWZlcjsKIAorICBvcmlnX3NpemUgPSBzaXplOworICBkYmdwdHIgPSAoc3RydWN0IFBFX0RlYnVnX2RpciAqKSAobG9hZF9hZGRyICsgdl9hZGRyKTsKKyAgZm9yKDsgc2l6ZSA+IDA7IHNpemUgLT0gc2l6ZW9mKCpkYmdwdHIpLCBkYmdwdHIrKyApCisgICAgeworICAgICAgc3dpdGNoKGRiZ3B0ci0+dHlwZSkKKwl7CisJY2FzZSBJTUFHRV9ERUJVR19UWVBFX0NPREVWSUVXOgorCWNhc2UgSU1BR0VfREVCVUdfVFlQRV9NSVNDOgorCSAgaGFzX2NvZGV2aWV3ID0gVFJVRTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgc2l6ZSA9IG9yaWdfc2l6ZTsKICAgZGJncHRyID0gKHN0cnVjdCBQRV9EZWJ1Z19kaXIgKikgKGxvYWRfYWRkciArIHZfYWRkcik7CiAgIGZvcig7IHNpemUgPiAwOyBzaXplIC09IHNpemVvZigqZGJncHRyKSwgZGJncHRyKysgKQogICAgIHsKICAgICAgIHN3aXRjaChkYmdwdHItPnR5cGUpCiAJewogCWNhc2UgSU1BR0VfREVCVUdfVFlQRV9DT0ZGOgorCSAgLyoKKwkgICAqIElmIHdlIGhhdmUgYm90aCBjb2RldmlldyBhbmQgQ09GRiBkZWJ1ZyBpbmZvLCBpZ25vcmUgdGhlCisJICAgKiBjb2ZmIGRlYnVnIGluZm8gYXMgIGl0IHdvdWxkIGp1c3QgY29uZnVzZSB1cywgYW5kIGl0IGlzIAorCSAgICogbGVzcyBjb21wbGV0ZS4KKwkgICAqCisJICAgKiBGSVhNRSAtIHRoaXMgaXMgYnJva2VuIC0gaWYgd2UgY2Fubm90IGZpbmQgdGhlIFBEQiBmaWxlLCB0aGVuCisJICAgKiB3ZSBlbmQgdXAgd2l0aCBubyBkZWJ1Z2dpbmcgaW5mbyBhdCBhbGwuICBJbiB0aGlzIGNhc2UsIHdlCisJICAgKiBzaG91bGQgdXNlIHRoZSBDT0ZGIGluZm8gYXMgYSBiYWNrdXAuCisJICAgKi8KKwkgIGlmKCBoYXNfY29kZXZpZXcgKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KIAljYXNlIElNQUdFX0RFQlVHX1RZUEVfQ09ERVZJRVc6CiAJY2FzZSBJTUFHRV9ERUJVR19UWVBFX01JU0M6CiAJICAvKgpAQCAtMTc5LDIxICs5NDYsNjMgQEAKIAkgIGRlZWZlci0+bG9hZF9hZGRyID0gKGNoYXIgKikgbG9hZF9hZGRyOwogCSAgZGVlZmVyLT5kYmdkaXIgPSBkYmdwdHI7CiAJICBkZWVmZXItPm5leHQgPSBkYmdsaXN0OworCSAgZGVlZmVyLT5sb2FkZWQgPSBGQUxTRTsKKwkgIGRlZWZlci0+ZGJnX2luZGV4ID0gREVCVUdfbmV4dF9pbmRleDsKKwkgIGRlZWZlci0+bW9kdWxlX25hbWUgPSB4c3RyZHVwKERFQlVHX2N1cnJfbW9kdWxlKTsKKworCSAgZGVlZmVyLT5zZWN0cCA9IHBlLT5wZV9zZWc7CisJICBkZWVmZXItPm5zZWN0ID0gcGUtPnBlX2hlYWRlci0+Y29mZi5OdW1iZXJPZlNlY3Rpb25zOworCiAJICBkYmdsaXN0ID0gZGVlZmVyOwogCSAgYnJlYWs7CiAJZGVmYXVsdDoKIAl9CiAgICAgfQogCisgIERFQlVHX25leHRfaW5kZXgrKzsKKwogICByZXR1cm4gKHJ0bik7CiAKIH0KIAogLyoKKyAqIEVMRiBtb2R1bGVzIGFyZSBhbHNvIGVudGVyZWQgaW50byB0aGUgbGlzdCAtIHRoaXMgaXMgc28gdGhhdCB3ZQorICogY2FuIG1ha2UgJ2luZm8gc2hhcmVkJyB0eXBlcyBvZiBkaXNwbGF5cyBwb3NzaWJsZS4KKyAqLworaW50CitERUJVR19SZWdpc3RlckVMRkRlYnVnSW5mbyhpbnQgbG9hZF9hZGRyLCB1X2xvbmcgc2l6ZSwgY2hhciAqIG5hbWUpCit7CisgIHN0cnVjdCBkZWZlcnJlZF9kZWJ1Z19pbmZvICogZGVlZmVyOworCisgIGRlZWZlciA9IChzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAqKSB4bWFsbG9jKHNpemVvZigqZGVlZmVyKSk7CisgIGRlZWZlci0+cGUgPSBOVUxMOworICAKKyAgLyoKKyAgICogUmVhZCB0aGUgaW1wb3J0YW50IGJpdHMuICBXaGF0IHdlIGRvIGFmdGVyIHRoaXMgZGVwZW5kcworICAgKiB1cG9uIHRoZSB0eXBlLCBidXQgdGhpcyBpcyBhbHdheXMgZW5vdWdoIHNvIHdlIGFyZSBhYmxlCisgICAqIHRvIHByb2NlZWQgaWYgd2Uga25vdyB3aGF0IHdlIG5lZWQgdG8gZG8gbmV4dC4KKyAgICovCisgIGRlZWZlci0+ZGJnX3NpemUgPSBzaXplOworICBkZWVmZXItPmRiZ19pbmZvID0gKGNoYXIgKikgTlVMTDsKKyAgCisgIGRlZWZlci0+bG9hZF9hZGRyID0gKGNoYXIgKikgbG9hZF9hZGRyOworICBkZWVmZXItPmRiZ2RpciA9IE5VTEw7CisgIGRlZWZlci0+bmV4dCA9IGRiZ2xpc3Q7CisgIGRlZWZlci0+bG9hZGVkID0gVFJVRTsKKyAgZGVlZmVyLT5kYmdfaW5kZXggPSBERUJVR19uZXh0X2luZGV4OworICBkZWVmZXItPm1vZHVsZV9uYW1lID0geHN0cmR1cChuYW1lKTsKKyAgZGJnbGlzdCA9IGRlZWZlcjsKKworICBERUJVR19uZXh0X2luZGV4Kys7CisKKyAgcmV0dXJuIChUUlVFKTsKK30KKworCisKKy8qCiAgKiBQcm9jZXNzIENPRkYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVtYmVkZGVkIGluIGEgV2luMzIgYXBwbGljYXRpb24uCiAgKgotICogRklYTUUgLSB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHNvdXJjZSBmaWxlIGluZm9ybWF0aW9uIGFuZCB0aGUgbGluZQotICogbnVtYmVycy4KICAqLwogc3RhdGljCiBpbnQKQEAgLTIwMSwyMiArMTAxMCwyNiBAQAogewogICBzdHJ1Y3QgQ29mZkF1eFNlY3Rpb24gKiBhdXg7CiAgIHN0cnVjdCBDb2ZmRGVidWcgICAqIGNvZmY7Ci0gIHN0cnVjdCBDb2ZmU3ltYm9sICAqIGNvZmZfc3ltOwotICBzdHJ1Y3QgQ29mZlN5bWJvbCAgKiBjb2ZmX3N5bWJvbDsKKyAgc3RydWN0IENvZmZGaWxlcyAgICogY29mZl9maWxlcyA9IE5VTEw7CiAgIHN0cnVjdCBDb2ZmTGluZW51bSAqIGNvZmZfbGluZXRhYjsKICAgY2hhcgkJICAgICAqIGNvZmZfc3RydGFiOworICBzdHJ1Y3QgQ29mZlN5bWJvbCAgKiBjb2ZmX3N5bTsKKyAgc3RydWN0IENvZmZTeW1ib2wgICogY29mZl9zeW1ib2w7CisgIHN0cnVjdCBDb2ZmRmlsZXMgICAqIGN1cnJfZmlsZSA9IE5VTEw7CiAgIGludAkJICAgICAgIGk7Ci0gIERCR19BRERSCSAgICAgICBuZXdfYWRkcjsKLSAgaW50CQkgICAgICAgcnRuID0gRkFMU0U7Ci0gIGludAkJICAgICAgIG5hdXg7CisgIGludAkJICAgICAgIGo7CisgIGludAkJICAgICAgIGs7CisgIHN0cnVjdCBDb2ZmTGluZW51bSAqIGxpbmVwbnQ7CisgIGludAkJICAgICAgIGxpbmV0YWJfaW5keDsKICAgY2hhcgkJICAgICAgIG5hbWVidWZmWzldOwogICBjaGFyCQkgICAgICogbmFtcG50OworICBpbnQJCSAgICAgICBuYXV4OworICBEQkdfQUREUgkgICAgICAgbmV3X2FkZHI7CiAgIGludAkJICAgICAgIG5maWxlcyA9IDA7CiAgIGludAkJICAgICAgIG5maWxlc19hbGxvYyA9IDA7Ci0gIHN0cnVjdCBDb2ZmRmlsZXMgICAqIGNvZmZfZmlsZXMgPSBOVUxMOwotICBzdHJ1Y3QgQ29mZkZpbGVzICAgKiBjdXJyX2ZpbGUgPSBOVUxMOwotICBjaGFyCQkgICAgICogdGhpc19maWxlOwotICBpbnQJCSAgICAgICBqOworICBzdHJ1Y3QgQ29mZkZpbGVzICAgICBvcmlnX2ZpbGU7CisgIGludAkJICAgICAgIHJ0biA9IEZBTFNFOworICBjaGFyCQkgICAgICogdGhpc19maWxlID0gTlVMTDsKIAogICBjb2ZmID0gKHN0cnVjdCBDb2ZmRGVidWcgKikgZGVlZmVyLT5kYmdfaW5mbzsKIApAQCAtMjI0LDYgKzEwMzcsOCBAQAogICBjb2ZmX2xpbmV0YWIgPSAoc3RydWN0IENvZmZMaW5lbnVtICopICgodW5zaWduZWQgaW50KSBjb2ZmICsgY29mZi0+TGluZW51bWJlck9mZnNldCk7CiAgIGNvZmZfc3RydGFiID0gKGNoYXIgKikgKCh1bnNpZ25lZCBpbnQpIGNvZmZfc3ltYm9sICsgMTgqY29mZi0+Tl9TeW0pOwogCisgIGxpbmV0YWJfaW5keCA9IDA7CisKICAgZm9yKGk9MDsgaSA8IGNvZmYtPk5fU3ltOyBpKysgKQogICAgIHsKICAgICAgIC8qCkBAIC0yNTIsNiArMTA2NywxNSBAQAogCSAgY3Vycl9maWxlLT5zdGFydGFkZHIgPSAweGZmZmZmZmZmOwogCSAgY3Vycl9maWxlLT5lbmRhZGRyICAgPSAwOwogCSAgY3Vycl9maWxlLT5maWxlbmFtZSA9ICAoKGNoYXIgKikgY29mZl9zeW0pICsgMTg7CisJICBjdXJyX2ZpbGUtPmxpbmV0YWJfb2Zmc2V0ID0gLTE7CisJICBjdXJyX2ZpbGUtPmxpbmVjbnQgPSAwOworCSAgY3Vycl9maWxlLT5lbnRyaWVzID0gTlVMTDsKKwkgIGN1cnJfZmlsZS0+bmVwcyA9IGN1cnJfZmlsZS0+bmVwc19hbGxvYyA9IDA7CisjaWYgMAorCSAgZnByaW50ZihzdGRlcnIsIk5ldyBmaWxlICVzXG4iLCBjdXJyX2ZpbGUtPmZpbGVuYW1lKTsKKyNlbmRpZgorCSAgaSArPSBuYXV4OworCSAgY29udGludWU7CiAJfQogCiAgICAgICAvKgpAQCAtMjYyLDkgKzEwODYsNjcgQEAKICAgICAgICAqLwogICAgICAgaWYoICAgIChjb2ZmX3N5bS0+U3RvcmFnZUNsYXNzID09IElNQUdFX1NZTV9DTEFTU19TVEFUSUMpCiAJICAmJiAobmF1eCAhPSAwKQorCSAgJiYgKGNvZmZfc3ltLT5UeXBlID09IDApCiAJICAmJiAoY29mZl9zeW0tPlNlY3Rpb25OdW1iZXIgPT0gMSkgKQogCXsKIAkgIGF1eCA9IChzdHJ1Y3QgQ29mZkF1eFNlY3Rpb24gKikgKCh1bnNpZ25lZCBpbnQpIGNvZmZfc3ltICsgMTgpOworCisJICBpZiggY3Vycl9maWxlLT5saW5ldGFiX29mZnNldCAhPSAtMSApCisJICAgIHsKKyNpZiAwCisJICAgICAgZnByaW50ZihzdGRlcnIsICJEdXBsaWNhdGluZyBzZWN0IGZyb20gJXM6ICV4ICV4ICV4ICVkICVkXG4iLAorCQkgICAgICBjdXJyX2ZpbGUtPmZpbGVuYW1lLAorCQkgICAgICBhdXgtPkxlbmd0aCwKKwkJICAgICAgYXV4LT5OdW1iZXJPZlJlbG9jYXRpb25zLAorCQkgICAgICBhdXgtPk51bWJlck9mTGluZW51bWJlcnMsCisJCSAgICAgIGF1eC0+TnVtYmVyLAorCQkgICAgICBhdXgtPlNlbGVjdGlvbik7CisJICAgICAgZnByaW50ZihzdGRlcnIsICJNb3JlIHNlY3QgJWQgJXggJWQgJWQgJWRcbiIsIAorCQkgICAgICBjb2ZmX3N5bS0+U2VjdGlvbk51bWJlciwKKwkJICAgICAgY29mZl9zeW0tPlZhbHVlLAorCQkgICAgICBjb2ZmX3N5bS0+VHlwZSwKKwkJICAgICAgY29mZl9zeW0tPlN0b3JhZ2VDbGFzcywKKwkJICAgICAgY29mZl9zeW0tPk51bWJlck9mQXV4U3ltYm9scyk7CisjZW5kaWYKKworCSAgICAgIC8qCisJICAgICAgICogU2F2ZSB0aGlzIHNvIHdlIGNhbiBjb3B5IGJpdHMgZnJvbSBpdC4KKwkgICAgICAgKi8KKwkgICAgICBvcmlnX2ZpbGUgPSAqY3Vycl9maWxlOworCisJICAgICAgLyoKKwkgICAgICAgKiBEdXBsaWNhdGUgdGhlIGZpbGUgZW50cnkuICBXZSBoYXZlIG5vIHdheSB0byBkZXNjcmliZQorCSAgICAgICAqIG11bHRpcGxlIHRleHQgc2VjdGlvbnMgaW4gb3VyIGN1cnJlbnQgd2F5IG9mIGhhbmRsaW5nIHRoaW5ncy4KKwkgICAgICAgKi8KKwkgICAgICBpZiggbmZpbGVzICsgMSA+PSBuZmlsZXNfYWxsb2MgKQorCQl7CisJCSAgbmZpbGVzX2FsbG9jICs9IDEwOworCQkgIGNvZmZfZmlsZXMgPSAoc3RydWN0IENvZmZGaWxlcyAqKSByZWFsbG9jKCBjb2ZmX2ZpbGVzLAorCQkJCQkJCSAgICAgbmZpbGVzX2FsbG9jICogc2l6ZW9mKHN0cnVjdCBDb2ZmRmlsZXMpKTsKKwkJfQorCSAgICAgIGN1cnJfZmlsZSA9IGNvZmZfZmlsZXMgKyBuZmlsZXM7CisJICAgICAgbmZpbGVzKys7CisJICAgICAgY3Vycl9maWxlLT5zdGFydGFkZHIgPSAweGZmZmZmZmZmOworCSAgICAgIGN1cnJfZmlsZS0+ZW5kYWRkciAgID0gMDsKKwkgICAgICBjdXJyX2ZpbGUtPmZpbGVuYW1lID0gb3JpZ19maWxlLmZpbGVuYW1lOworCSAgICAgIGN1cnJfZmlsZS0+bGluZXRhYl9vZmZzZXQgPSAtMTsKKwkgICAgICBjdXJyX2ZpbGUtPmxpbmVjbnQgPSAwOworCSAgICAgIGN1cnJfZmlsZS0+ZW50cmllcyA9IE5VTEw7CisJICAgICAgY3Vycl9maWxlLT5uZXBzID0gY3Vycl9maWxlLT5uZXBzX2FsbG9jID0gMDsKKwkgICAgfQorI2lmIDAKKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGZwcmludGYoc3RkZXJyLCAiTmV3IHRleHQgc2VjdCBmcm9tICVzOiAleCAleCAleCAlZCAlZFxuIiwKKwkJICAgICAgY3Vycl9maWxlLT5maWxlbmFtZSwKKwkJICAgICAgYXV4LT5MZW5ndGgsCisJCSAgICAgIGF1eC0+TnVtYmVyT2ZSZWxvY2F0aW9ucywKKwkJICAgICAgYXV4LT5OdW1iZXJPZkxpbmVudW1iZXJzLAorCQkgICAgICBhdXgtPk51bWJlciwKKwkJICAgICAgYXV4LT5TZWxlY3Rpb24pOworCSAgICB9CisjZW5kaWYKKwogCSAgaWYoIGN1cnJfZmlsZS0+c3RhcnRhZGRyID4gY29mZl9zeW0tPlZhbHVlICkKIAkgICAgewogCSAgICAgIGN1cnJfZmlsZS0+c3RhcnRhZGRyID0gY29mZl9zeW0tPlZhbHVlOwpAQCAtMjgwLDYgKzExNjIsMTEgQEAKIAkgICAgICBjdXJyX2ZpbGUtPmVuZGFkZHIgPSBjb2ZmX3N5bS0+VmFsdWUgKyBhdXgtPkxlbmd0aDsKIAkgICAgfQogCSAgCisJICBjdXJyX2ZpbGUtPmxpbmV0YWJfb2Zmc2V0ID0gbGluZXRhYl9pbmR4OworCSAgY3Vycl9maWxlLT5saW5lY250ID0gYXV4LT5OdW1iZXJPZkxpbmVudW1iZXJzOworCSAgbGluZXRhYl9pbmR4ICs9IGF1eC0+TnVtYmVyT2ZMaW5lbnVtYmVyczsKKwkgIGkgKz0gbmF1eDsKKwkgIGNvbnRpbnVlOwogCX0KIAogICAgICAgaWYoICAgIChjb2ZmX3N5bS0+U3RvcmFnZUNsYXNzID09IElNQUdFX1NZTV9DTEFTU19TVEFUSUMpCkBAIC0zMDIsOSArMTE4OSwyOCBAQAogCSAgICAgIG5hbXBudCA9IGNvZmZfc3RydGFiICsgY29mZl9zeW0tPk4uTmFtZS5TdHJUYWJvZmY7CiAJICAgIH0KIAorCSAgaWYoIG5hbXBudFswXSA9PSAnXycgKQorCSAgICB7CisJICAgICAgbmFtcG50Kys7CisJICAgIH0KKwogCSAgbmV3X2FkZHIuc2VnID0gMDsKIAkgIG5ld19hZGRyLm9mZiA9IChpbnQpIChkZWVmZXItPmxvYWRfYWRkciArIGNvZmZfc3ltLT5WYWx1ZSk7Ci0JICBERUJVR19BZGRTeW1ib2woIG5hbXBudCwgJm5ld19hZGRyLCBjdXJyX2ZpbGUtPmZpbGVuYW1lICk7CisKKwkgIGlmKCBjdXJyX2ZpbGUtPm5lcHMgKyAxID49IGN1cnJfZmlsZS0+bmVwc19hbGxvYyApCisJICAgIHsKKwkgICAgICBjdXJyX2ZpbGUtPm5lcHNfYWxsb2MgKz0gMTA7CisJICAgICAgY3Vycl9maWxlLT5lbnRyaWVzID0gKHN0cnVjdCBuYW1lX2hhc2ggKiopIAorCQlyZWFsbG9jKCBjdXJyX2ZpbGUtPmVudHJpZXMsIAorCQkJIGN1cnJfZmlsZS0+bmVwc19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgbmFtZV9oYXNoICopKTsKKwkgICAgfQorI2lmIDAKKwkgIGZwcmludGYoc3RkZXJyLCJcdEFkZGluZyBzdGF0aWMgc3ltYm9sICVzXG4iLCBuYW1wbnQpOworI2VuZGlmCisJICBjdXJyX2ZpbGUtPmVudHJpZXNbY3Vycl9maWxlLT5uZXBzKytdID0KKwkgICAgREVCVUdfQWRkU3ltYm9sKCBuYW1wbnQsICZuZXdfYWRkciwgdGhpc19maWxlLCBTWU1fV0lOMzIgKTsKKwkgIGkgKz0gbmF1eDsKKwkgIGNvbnRpbnVlOwogCX0KIAogICAgICAgaWYoICAgIChjb2ZmX3N5bS0+U3RvcmFnZUNsYXNzID09IElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCkKQEAgLTMyMiwxMSArMTIyOCwxOSBAQAogCSAgICAgIG5hbXBudCA9IGNvZmZfc3RydGFiICsgY29mZl9zeW0tPk4uTmFtZS5TdHJUYWJvZmY7CiAJICAgIH0KIAorCisJICBpZiggbmFtcG50WzBdID09ICdfJyApCisJICAgIHsKKwkgICAgICBuYW1wbnQrKzsKKwkgICAgfQorCiAJICBuZXdfYWRkci5zZWcgPSAwOwogCSAgbmV3X2FkZHIub2ZmID0gKGludCkgKGRlZWZlci0+bG9hZF9hZGRyICsgY29mZl9zeW0tPlZhbHVlKTsKIAogI2lmIDAKIAkgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICV4ICVzXG4iLCBpLCBuZXdfYWRkci5vZmYsIG5hbXBudCk7CisKKwkgIGZwcmludGYoc3RkZXJyLCJcdEFkZGluZyBnbG9iYWwgc3ltYm9sICVzXG4iLCBuYW1wbnQpOwogI2VuZGlmCiAKIAkgIC8qCkBAIC0zNDIsOSArMTI1Niw3NiBAQAogCQkgIGJyZWFrOwogCQl9CiAJICAgIH0KLQkgIERFQlVHX0FkZFN5bWJvbCggbmFtcG50LCAmbmV3X2FkZHIsIHRoaXNfZmlsZSApOworCSAgaWYoIGNvZmZfZmlsZXNbal0ubmVwcyArIDEgPj0gY29mZl9maWxlc1tqXS5uZXBzX2FsbG9jICkKKwkgICAgeworCSAgICAgIGNvZmZfZmlsZXNbal0ubmVwc19hbGxvYyArPSAxMDsKKwkgICAgICBjb2ZmX2ZpbGVzW2pdLmVudHJpZXMgPSAoc3RydWN0IG5hbWVfaGFzaCAqKikgCisJCXJlYWxsb2MoIGNvZmZfZmlsZXNbal0uZW50cmllcywgCisJCQkgY29mZl9maWxlc1tqXS5uZXBzX2FsbG9jICogc2l6ZW9mKHN0cnVjdCBuYW1lX2hhc2ggKikpOworCSAgICB9CisJICBjb2ZmX2ZpbGVzW2pdLmVudHJpZXNbY29mZl9maWxlc1tqXS5uZXBzKytdID0KKwkgICAgREVCVUdfQWRkU3ltYm9sKCBuYW1wbnQsICZuZXdfYWRkciwgdGhpc19maWxlLCBTWU1fV0lOMzIgKTsKKwkgIGkgKz0gbmF1eDsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgaWYoICAgIChjb2ZmX3N5bS0+U3RvcmFnZUNsYXNzID09IElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCkKKyAgICAgICAgICAmJiAoY29mZl9zeW0tPlNlY3Rpb25OdW1iZXIgPiAwKSApCisJeworCSAgLyoKKwkgICAqIFNpbWlsYXIgdG8gYWJvdmUsIGJ1dCBmb3IgdGhlIGNhc2Ugb2YgZGF0YSBzeW1ib2xzLgorCSAgICogVGhlc2UgYXJlbid0IHRyZWF0ZWQgYXMgZW50cnlwb2ludHMuCisJICAgKi8KKwkgIGlmKCBjb2ZmX3N5bS0+Ti5OYW1lLk5vdExvbmcgKQorCSAgICB7CisJICAgICAgbWVtY3B5KG5hbWVidWZmLCBjb2ZmX3N5bS0+Ti5TaG9ydE5hbWUsIDgpOworCSAgICAgIG5hbWVidWZmWzhdID0gJ1wwJzsKKwkgICAgICBuYW1wbnQgPSAmbmFtZWJ1ZmZbMF07CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIG5hbXBudCA9IGNvZmZfc3RydGFiICsgY29mZl9zeW0tPk4uTmFtZS5TdHJUYWJvZmY7CisJICAgIH0KKworCisJICBpZiggbmFtcG50WzBdID09ICdfJyApCisJICAgIHsKKwkgICAgICBuYW1wbnQrKzsKKwkgICAgfQorCisJICBuZXdfYWRkci5zZWcgPSAwOworCSAgbmV3X2FkZHIub2ZmID0gKGludCkgKGRlZWZlci0+bG9hZF9hZGRyICsgY29mZl9zeW0tPlZhbHVlKTsKKworI2lmIDAKKwkgIGZwcmludGYoc3RkZXJyLCAiJWQ6ICV4ICVzXG4iLCBpLCBuZXdfYWRkci5vZmYsIG5hbXBudCk7CisKKwkgIGZwcmludGYoc3RkZXJyLCJcdEFkZGluZyBnbG9iYWwgZGF0YSBzeW1ib2wgJXNcbiIsIG5hbXBudCk7CisjZW5kaWYKKworCSAgLyoKKwkgICAqIE5vdyB3ZSBuZWVkIHRvIGZpZ3VyZSBvdXQgd2hpY2ggZmlsZSB0aGlzIGd1eSBiZWxvbmdzIHRvLgorCSAgICovCisJICBERUJVR19BZGRTeW1ib2woIG5hbXBudCwgJm5ld19hZGRyLCBOVUxMLCBTWU1fV0lOMzIgKTsKKwkgIGkgKz0gbmF1eDsKKwkgIGNvbnRpbnVlOwogCX0KIAkgIAorICAgICAgaWYoICAgIChjb2ZmX3N5bS0+U3RvcmFnZUNsYXNzID09IElNQUdFX1NZTV9DTEFTU19TVEFUSUMpCisJICAmJiAobmF1eCA9PSAwKSApCisJeworCSAgLyoKKwkgICAqIElnbm9yZSB0aGVzZS4gIFRoZXkgZG9uJ3QgaGF2ZSBhbnl0aGluZyB0byBkbyB3aXRoCisJICAgKiByZWFsaXR5LgorCSAgICovCisJICBpICs9IG5hdXg7CisJICBjb250aW51ZTsKKwl9CisKKyNpZiAwCisgICAgICBmcHJpbnRmKHN0ZGVyciwiU2tpcHBpbmcgdW5rbm93biBlbnRyeSAlZCAlZCAlZFxuIiwgY29mZl9zeW0tPlN0b3JhZ2VDbGFzcywgCisJICAgICAgY29mZl9zeW0tPlNlY3Rpb25OdW1iZXIsIG5hdXgpOworI2VuZGlmCisKICAgICAgIC8qCiAgICAgICAgKiBGb3Igbm93LCBza2lwIHBhc3QgdGhlIGF1eCBlbnRyaWVzLgogICAgICAgICovCkBAIC0zNTIsMTAgKzEzMzMsODUgQEAKICAgICAgIAogICAgIH0KICAgICAKKyAgLyoKKyAgICogT0ssIHdlIG5vdyBzaG91bGQgaGF2ZSBhIGxpc3Qgb2YgZmlsZXMsIGFuZCB3ZSBzaG91bGQgaGF2ZSBhIGxpc3QKKyAgICogb2YgZW50cnlwb2ludHMuICBXZSBuZWVkIHRvIHNvcnQgdGhlIGVudHJ5cG9pbnRzIHNvIHRoYXQgd2UgYXJlCisgICAqIGFibGUgdG8gdGllIHRoZSBsaW5lIG51bWJlcnMgd2l0aCB0aGUgZ2l2ZW4gZnVuY3Rpb25zIHdpdGhpbiB0aGUKKyAgICogZmlsZS4KKyAgICovCisgIGlmKCBjb2ZmX2ZpbGVzICE9IE5VTEwgKQorICAgIHsKKyAgICAgIGZvcihqPTA7IGogPCBuZmlsZXM7IGorKykKKwl7CisJICBpZiggY29mZl9maWxlc1tqXS5lbnRyaWVzICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgcXNvcnQoY29mZl9maWxlc1tqXS5lbnRyaWVzLCBjb2ZmX2ZpbGVzW2pdLm5lcHMsCisJCSAgICBzaXplb2Yoc3RydWN0IG5hbWVfaGFzaCAqKSwgREVCVUdfY21wX3N5bSk7CisJICAgIH0KKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBOb3cgcGljayBhcGFydCB0aGUgbGluZSBudW1iZXIgdGFibGVzLCBhbmQgYXR0YWNoIHRoZSBlbnRyaWVzCisgICAgICAgKiB0byB0aGUgZ2l2ZW4gZnVuY3Rpb25zLgorICAgICAgICovCisgICAgICBmb3Ioaj0wOyBqIDwgbmZpbGVzOyBqKyspCisJeworCSAgaSA9IDA7CisJICBmb3Ioaz0wOyBrIDwgY29mZl9maWxlc1tqXS5saW5lY250OyBrKyspCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIEFub3RoZXIgbW9uc3Ryb3NpdHkgY2F1c2VkIGJ5IHRoZSBmYWN0IHRoYXQgd2UgYXJlIHVzaW5nCisJICAgICAgICogYSA2IGJ5dGUgc3RydWN0dXJlLCBhbmQgZ2NjIHdhbnRzIHRvIHBhZCBzdHJ1Y3R1cmVzIHRvIDQgYnl0ZQorCSAgICAgICAqIGJvdW5kYXJpZXMuICBPdGhlcndpc2Ugd2UgY291bGQganVzdCBpbmRleCBpbnRvIGFuIGFycmF5LgorCSAgICAgICAqLworCSAgICAgIGxpbmVwbnQgPSAoc3RydWN0IENvZmZMaW5lbnVtICopIAorCQkoKHVuc2lnbmVkIGludCkgY29mZl9saW5ldGFiICsgCisJCSA2Kihjb2ZmX2ZpbGVzW2pdLmxpbmV0YWJfb2Zmc2V0ICsgaykpOworCSAgICAgIC8qCisJICAgICAgICogSWYgd2UgaGF2ZSBzcGlsbGVkIG9udG8gdGhlIG5leHQgZW50cnlwb2ludCwgdGhlbgorCSAgICAgICAqIGJ1bXAgdGhlIGNvdW50ZXIuLgorCSAgICAgICAqLworCSAgICAgIHdoaWxlKFRSVUUpCisJCXsKKwkJICBERUJVR19HZXRTeW1ib2xBZGRyKGNvZmZfZmlsZXNbal0uZW50cmllc1tpKzFdLCAmbmV3X2FkZHIpOworCQkgIGlmKCAgIChpKzEgPCBjb2ZmX2ZpbGVzW2pdLm5lcHMpCisJCQkmJiAoICAgKCh1bnNpZ25lZCBpbnQpIGRlZWZlci0+bG9hZF9hZGRyICsgbGluZXBudC0+VmlydHVhbEFkZHIpCisJCQkgICAgICAgPj0gbmV3X2FkZHIub2ZmKSApCisJCSAgICB7CisJCSAgICAgIGkrKzsKKwkJICAgIH0KKwkJICBlbHNlCisJCSAgICB7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQl9CisKKwkgICAgICAvKgorCSAgICAgICAqIEFkZCB0aGUgbGluZSBudW1iZXIuICBUaGlzIGlzIGFsd2F5cyByZWxhdGl2ZSB0byB0aGUKKwkgICAgICAgKiBzdGFydCBvZiB0aGUgZnVuY3Rpb24sIHNvIHdlIG5lZWQgdG8gc3VidHJhY3QgdGhhdCBvZmZzZXQKKwkgICAgICAgKiBmaXJzdC4KKwkgICAgICAgKi8KKwkgICAgICBERUJVR19HZXRTeW1ib2xBZGRyKGNvZmZfZmlsZXNbal0uZW50cmllc1tpXSwgJm5ld19hZGRyKTsKKwkgICAgICBERUJVR19BZGRMaW5lTnVtYmVyKGNvZmZfZmlsZXNbal0uZW50cmllc1tpXSwgCisJCQkJICBsaW5lcG50LT5MaW5lbnVtLAorCQkJCSAgKHVuc2lnbmVkIGludCkgZGVlZmVyLT5sb2FkX2FkZHIgCisJCQkJICArIGxpbmVwbnQtPlZpcnR1YWxBZGRyIAorCQkJCSAgLSBuZXdfYWRkci5vZmYpOworCSAgICB9CisJfQorICAgIH0KKwogICBydG4gPSBUUlVFOwogCiAgIGlmKCBjb2ZmX2ZpbGVzICE9IE5VTEwgKQogICAgIHsKKyAgICAgIGZvcihqPTA7IGogPCBuZmlsZXM7IGorKykKKwl7CisJICBpZiggY29mZl9maWxlc1tqXS5lbnRyaWVzICE9IE5VTEwgKQorCSAgICB7CisJICAgICAgZnJlZShjb2ZmX2ZpbGVzW2pdLmVudHJpZXMpOworCSAgICB9CisJfQogICAgICAgZnJlZShjb2ZmX2ZpbGVzKTsKICAgICB9CiAKQEAgLTM2MywxNSArMTQxOSw4ODcgQEAKIAogfQogCisvKgorICogUHJvY2VzcyBhIGNvZGV2aWV3IGxpbmUgbnVtYmVyIHRhYmxlLiAgRGlnZXN0aWZ5IHRoZSB0aGluZyBzbyB0aGF0CisgKiB3ZSBjYW4gZWFzaWx5IHJlZmVyZW5jZSB0aGUgdGhpbmcgd2hlbiB3ZSBwcm9jZXNzIHRoZSByZXN0IG9mCisgKiB0aGUgaW5mb3JtYXRpb24uCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY29kZXZpZXdfbGluZXRhYl9oZHIgKgorREVCVUdfU25hcmZMaW5ldGFiKGNoYXIJCQkgICAgICogbGluZXRhYiwKKwkJICAgaW50CQkJICAgICAgIHNpemUpCit7CisgIGludAkJCQkgIGZpbGVfc2VnY291bnQ7CisgIGNoYXIJCQkJICBmaWxlbmFtZVtQQVRIX01BWF07CisgIHVuc2lnbmVkIGludAkJCSogZmlsZXRhYjsKKyAgY2hhcgkJCQkqIGZuOworICBpbnQJCQkJICBpOworICBpbnQJCQkJICBrOworICBzdHJ1Y3QgY29kZXZpZXdfbGluZXRhYl9oZHIgICAqIGx0X2hkcjsKKyAgdW5zaWduZWQgaW50CQkJKiBsdF9wdHI7CisgIGludAkJCQkgIG5maWxlOworICBpbnQJCQkJICBuc2VnOworICB1bmlvbiBhbnlfc2l6ZQkJICBwbnQ7CisgIHVuaW9uIGFueV9zaXplCQkgIHBudDI7CisgIHN0cnVjdCBzdGFydGVuZAkJKiBzdGFydDsKKyAgaW50CQkJCSAgdGhpc19zZWc7CisKKyAgLyoKKyAgICogTm93IGdldCB0aGUgaW1wb3J0YW50IGJpdHMuCisgICAqLworICBwbnQgPSAodW5pb24gYW55X3NpemUpIGxpbmV0YWI7CisgIG5maWxlID0gKnBudC5zKys7CisgIG5zZWcgPSAqcG50LnMrKzsKKworICBmaWxldGFiID0gKHVuc2lnbmVkIGludCAqKSBwbnQuYzsKKworICAvKgorICAgKiBOb3cgY291bnQgdXAgdGhlIG51bWJlciBvZiBzZWdtZW50cyBpbiB0aGUgZmlsZS4KKyAgICovCisgIG5zZWcgPSAwOworICBmb3IoaT0wOyBpPG5maWxlOyBpKyspCisgICAgeworICAgICAgcG50MiA9ICh1bmlvbiBhbnlfc2l6ZSkgKGxpbmV0YWIgKyBmaWxldGFiW2ldKTsKKyAgICAgIG5zZWcgKz0gKnBudDIuczsKKyAgICB9CisKKyAgLyoKKyAgICogTmV4dCBhbGxvY2F0ZSB0aGUgaGVhZGVyIHdlIHdpbGwgYmUgcmV0dXJuaW5nLgorICAgKiBUaGVyZSBpcyBvbmUgaGVhZGVyIGZvciBlYWNoIHNlZ21lbnQsIHNvIHRoYXQgd2UgY2FuIHJlYWNoIGluCisgICAqIGFuZCBwdWxsIGJpdHMgYXMgcmVxdWlyZWQuCisgICAqLworICBsdF9oZHIgPSAoc3RydWN0IGNvZGV2aWV3X2xpbmV0YWJfaGRyICopIAorICAgIHhtYWxsb2MoKG5zZWcgKyAxKSAqIHNpemVvZigqbHRfaGRyKSk7CisgIGlmKCBsdF9oZHIgPT0gTlVMTCApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgbWVtc2V0KGx0X2hkciwgMCwgc2l6ZW9mKCpsdF9oZHIpICogKG5zZWcrMSkpOworCisgIC8qCisgICAqIE5vdyBmaWxsIHRoZSBoZWFkZXIgd2Ugd2lsbCBiZSByZXR1cm5pbmcsIG9uZSBmb3IgZWFjaCBzZWdtZW50LgorICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIGJhc2ljYWxseSBqdXN0IGNvbnRhaW4gcG9pbnRlcnMgaW50byB0aGUgZXhpc3RpbmcKKyAgICogbGluZSB0YWJsZSwgYW5kIHdlIGRvIG5vdCBhY3R1YWxseSBjb3B5IGFueSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgICAqIG9yIGFsbG9jYXRlIGFueSBhZGRpdGlvbmFsIG1lbW9yeS4KKyAgICovCisKKyAgdGhpc19zZWcgPSAwOworICBmb3IoaT0wOyBpPG5maWxlOyBpKyspCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEdldCB0aGUgcG9pbnRlciBpbnRvIHRoZSBzZWdtZW50IGluZm9ybWF0aW9uLgorICAgICAgICovCisgICAgICBwbnQyID0gKHVuaW9uIGFueV9zaXplKSAobGluZXRhYiArIGZpbGV0YWJbaV0pOworICAgICAgZmlsZV9zZWdjb3VudCA9ICpwbnQyLnM7CisKKyAgICAgIHBudDIudWkrKzsKKyAgICAgIGx0X3B0ciA9ICh1bnNpZ25lZCBpbnQgKikgcG50Mi5jOworICAgICAgc3RhcnQgPSAoc3RydWN0IHN0YXJ0ZW5kICopIChsdF9wdHIgKyBmaWxlX3NlZ2NvdW50KTsKKworICAgICAgLyoKKyAgICAgICAqIE5vdyBzbmFyZiB0aGUgZmlsZW5hbWUgZm9yIGFsbCBvZiB0aGUgc2VnbWVudHMgZm9yIHRoaXMgZmlsZS4KKyAgICAgICAqLworICAgICAgZm4gPSAodW5zaWduZWQgY2hhciAqKSAoc3RhcnQgKyBmaWxlX3NlZ2NvdW50KTsKKyAgICAgIG1lbXNldChmaWxlbmFtZSwgMCwgc2l6ZW9mKGZpbGVuYW1lKSk7CisgICAgICBtZW1jcHkoZmlsZW5hbWUsIGZuICsgMSwgKmZuKTsKKyAgICAgIGZuID0gc3RyZHVwKGZpbGVuYW1lKTsKKworICAgICAgZm9yKGsgPSAwOyBrIDwgZmlsZV9zZWdjb3VudDsgaysrLCB0aGlzX3NlZysrKQorCXsKKwkgIHBudDIgPSAodW5pb24gYW55X3NpemUpIChsaW5ldGFiICsgbHRfcHRyW2tdKTsKKwkgIGx0X2hkclt0aGlzX3NlZ10uc3RhcnQgICAgICA9IHN0YXJ0W2tdLnN0YXJ0OworCSAgbHRfaGRyW3RoaXNfc2VnXS5lbmQJICAgICAgPSBzdGFydFtrXS5lbmQ7CisJICBsdF9oZHJbdGhpc19zZWddLnNvdXJjZWZpbGUgPSBmbjsKKwkgIGx0X2hkclt0aGlzX3NlZ10uc2Vnbm8gICAgICA9ICpwbnQyLnMrKzsKKwkgIGx0X2hkclt0aGlzX3NlZ10ubmxpbmUgICAgICA9ICpwbnQyLnMrKzsKKwkgIGx0X2hkclt0aGlzX3NlZ10ub2ZmdGFiICAgICA9ICBwbnQyLnVpOworCSAgbHRfaGRyW3RoaXNfc2VnXS5saW5ldGFiICAgID0gKHVuc2lnbmVkIHNob3J0ICopIAorCSAgICAocG50Mi51aSArIGx0X2hkclt0aGlzX3NlZ10ubmxpbmUpOworCX0KKyAgICB9CisKK2xlYXZlOgorCisgIHJldHVybiBsdF9oZHI7CisKK30KKworc3RhdGljIGludAorREVCVUdfU25hcmZDb2RlVmlldyggICAgICBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAqIGRlZWZlciwKKwkJCSAgY2hhcgkJCSAgICAgKiBjdl9kYXRhLAorCQkJICBpbnQJCQkgICAgICAgc2l6ZSwKKwkJCSAgc3RydWN0IGNvZGV2aWV3X2xpbmV0YWJfaGRyICogbGluZXRhYikKK3sKKyAgc3RydWN0IG5hbWVfaGFzaAkqIGN1cnJfZnVuYyA9IE5VTEw7CisgIHN0cnVjdCB3aW5lX2xvY2FscwkqIGN1cnJfc3ltID0gTlVMTDsKKyAgaW50CQkJICBpOworICBpbnQJCQkgIGo7CisgIGludAkJCSAgbGVuOworICBEQkdfQUREUgkJICBuZXdfYWRkcjsKKyAgaW50CQkJICBuc2VjdDsKKyAgdW5pb24gYW55X3NpemUJICBwdHI7CisgIHN0cnVjdCBwZV9zZWdtZW50X3RhYmxlICogc2VjdHA7CisgIHVuaW9uCWNvZGV2aWV3X3N5bWJvbAkqIHN5bTsKKyAgY2hhcgkJCSAgc3ltbmFtZVtQQVRIX01BWF07CisgIHN0cnVjdCBuYW1lX2hhc2gJKiB0aHVua19zeW0gPSBOVUxMOworCisgIHB0ciA9ICh1bmlvbiBhbnlfc2l6ZSkgY3ZfZGF0YTsKKyAgbnNlY3QgPSBkZWVmZXItPm5zZWN0OworICBzZWN0cCA9IGRlZWZlci0+c2VjdHA7CisKKyAgLyoKKyAgICogU2tpcCBvdmVyIHRoZSBmaXJzdCB3b3JkLiAgRG9uJ3QgcmVhbGx5IGtub3cgd2hhdCBpdCBtZWFucywgYnV0CisgICAqIGl0IGlzIHVzZWxlc3MuCisgICAqLworICBwdHIudWkrKzsKKworICAvKgorICAgKiBMb29wIG92ZXIgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiByZWNvcmRzIGFuZCB3aGVuZXZlciB3ZQorICAgKiBmaW5kIHNvbWV0aGluZyB3ZSBhcmUgaW50ZXJlc3RlZCBpbiwgcmVjb3JkIGl0IGFuZCBtb3ZlIG9uLgorICAgKi8KKyAgd2hpbGUoIHB0ci5jIC0gY3ZfZGF0YSA8IHNpemUgKQorICAgIHsKKyAgICAgIHN5bSA9ICh1bmlvbiBjb2Rldmlld19zeW1ib2wgKikgcHRyLmM7CisKKyAgICAgIGlmKCBzeW0tPmdlbmVyaWMubGVuIC0gc2l6ZW9mKGludCkgPT0gKHB0ci5jIC0gY3ZfZGF0YSkgKQorCXsKKwkgIC8qCisJICAgKiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBoYXZlIGluZGlyZWN0IHN5bWJvbHMgdGhhdCBWQysrIDQuMgorCSAgICogc29tZXRpbWVzIHVzZXMgd2hlbiB0aGVyZSBpc24ndCBhIGxpbmUgbnVtYmVyIHRhYmxlLgorCSAgICogV2UgaWdub3JlIGl0IC0gd2Ugd2lsbCBwcm9jZXNzIGFuZCBlbnRlciBhbGwgb2YgdGhlCisJICAgKiBzeW1ib2xzIGluIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGFueXdheXMsIHNvIHRoZXJlCisJICAgKiBpc24ndCBtdWNoIHBvaW50IGluIGtlZXBpbmcgdHJhY2sgb2YgYWxsIG9mIHRoaXMgY3JhcC4KKwkgICAqLworCSAgYnJlYWs7CisJfQorCisgICAgICBtZW1zZXQoc3ltbmFtZSwgMCwgc2l6ZW9mKHN5bW5hbWUpKTsKKyAgICAgIHN3aXRjaChzeW0tPmdlbmVyaWMuaWQpCisJeworCWNhc2UgU19HREFUQTMyOgorCWNhc2UgU19MREFUQTMyOgorCWNhc2UgU19QVUIzMjoKKwkgIC8qCisJICAgKiBGaXJzdCwgYSBjb3VwbGUgb2Ygc2FuaXR5IGNoZWNrcy4KKwkgICAqLworCSAgaWYoIHN5bS0+ZGF0YS5uYW1lbGVuID09IDAgKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgaWYoIHN5bS0+ZGF0YS5zZWcgPT0gMCB8fCBzeW0tPmRhdGEuc2VnID4gbnNlY3QgKQorCSAgICB7CisJICAgICAgYnJlYWs7CisJICAgIH0KKworCSAgLyoKKwkgICAqIEdsb2JhbCBhbmQgbG9jYWwgZGF0YSBzeW1ib2xzLiAgV2UgZG9uJ3QgYXNzb2NpYXRlIHRoZXNlCisJICAgKiB3aXRoIGFueSBnaXZlbiBzb3VyY2UgZmlsZS4KKwkgICAqLworCisJICBtZW1jcHkoc3ltbmFtZSwgc3ltLT5kYXRhLm5hbWUsIHN5bS0+ZGF0YS5uYW1lbGVuKTsKKwkgIG5ld19hZGRyLnNlZyA9IDA7CisJICBuZXdfYWRkci50eXBlID0gREVCVUdfR2V0Q1ZUeXBlKHN5bS0+ZGF0YS5zeW10eXBlKTsKKwkgIG5ld19hZGRyLm9mZiA9ICh1bnNpZ25lZCBpbnQpIGRlZWZlci0+bG9hZF9hZGRyICsgCisJICAgIHNlY3RwW3N5bS0+ZGF0YS5zZWcgLSAxXS5WaXJ0dWFsX0FkZHJlc3MgKyAKKwkgICAgc3ltLT5kYXRhLm9mZnNldDsKKwkgIERFQlVHX0FkZFN5bWJvbCggc3ltbmFtZSwgJm5ld19hZGRyLCBOVUxMLCBTWU1fV0lOMzIgfCBTWU1fREFUQSApOworCSAgYnJlYWs7CisJY2FzZSBTX1RIVU5LMzI6CisJICAvKgorCSAgICogU29ydCBvZiBsaWtlIGEgZ2xvYmFsIGZ1bmN0aW9uLCBidXQgaXQganVzdCBwb2ludHMKKwkgICAqIHRvIGEgdGh1bmssIHdoaWNoIGlzIGEgc3R1cGlkIG5hbWUgZm9yIHdoYXQgYW1vdW50cyB0bworCSAgICogYSBQTFQgc2xvdCBpbiB0aGUgbm9ybWFsIGphcmdvbiB0aGF0IGV2ZXJ5b25lIGVsc2UgdXNlcy4KKwkgICAqLworCSAgbWVtY3B5KHN5bW5hbWUsIHN5bS0+dGh1bmsubmFtZSwgc3ltLT50aHVuay5uYW1lbGVuKTsKKwkgIG5ld19hZGRyLnNlZyA9IDA7CisJICBuZXdfYWRkci50eXBlID0gTlVMTDsKKwkgIG5ld19hZGRyLm9mZiA9ICh1bnNpZ25lZCBpbnQpIGRlZWZlci0+bG9hZF9hZGRyICsgCisJICAgIHNlY3RwW3N5bS0+dGh1bmsuc2VnbWVudCAtIDFdLlZpcnR1YWxfQWRkcmVzcyArIAorCSAgICBzeW0tPnRodW5rLm9mZnNldDsKKwkgIHRodW5rX3N5bSA9IERFQlVHX0FkZFN5bWJvbCggc3ltbmFtZSwgJm5ld19hZGRyLCBOVUxMLCAKKwkJCQkgICAgICAgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOworCSAgREVCVUdfU2V0U3ltYm9sU2l6ZSh0aHVua19zeW0sIHN5bS0+dGh1bmsudGh1bmtfbGVuKTsKKwkgIGJyZWFrOworCWNhc2UgU19HUFJPQzMyOgorCWNhc2UgU19MUFJPQzMyOgorCSAgLyoKKwkgICAqIEdsb2JhbCBhbmQgc3RhdGljIGZ1bmN0aW9ucy4KKwkgICAqLworCSAgbWVtY3B5KHN5bW5hbWUsIHN5bS0+cHJvYy5uYW1lLCBzeW0tPnByb2MubmFtZWxlbik7CisJICBuZXdfYWRkci5zZWcgPSAwOworCSAgbmV3X2FkZHIudHlwZSA9IERFQlVHX0dldENWVHlwZShzeW0tPnByb2MucHJvY3R5cGUpOworCSAgbmV3X2FkZHIub2ZmID0gKHVuc2lnbmVkIGludCkgZGVlZmVyLT5sb2FkX2FkZHIgKyAKKwkgICAgc2VjdHBbc3ltLT5wcm9jLnNlZ21lbnQgLSAxXS5WaXJ0dWFsX0FkZHJlc3MgKyAKKwkgICAgc3ltLT5wcm9jLm9mZnNldDsKKwkgIC8qCisJICAgKiBTZWUgaWYgd2UgY2FuIGZpbmQgYSBzZWdtZW50IHRoYXQgdGhpcyBnb2VzIHdpdGguICBJZiBzbywKKwkgICAqIGl0IG1lYW5zIHRoYXQgd2UgYWxzbyBtYXkgaGF2ZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbgorCSAgICogZm9yIHRoaXMgZnVuY3Rpb24uCisJICAgKi8KKwkgIGZvcihpPTA7IGxpbmV0YWJbaV0ubGluZXRhYiAhPSBOVUxMOyBpKyspCisJICAgIHsKKwkgICAgICBpZiggICAgICgodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciAKKwkJICAgICAgICsgc2VjdHBbbGluZXRhYltpXS5zZWdubyAtIDFdLlZpcnR1YWxfQWRkcmVzcyAKKwkJICAgICAgICsgbGluZXRhYltpXS5zdGFydCA8PSBuZXdfYWRkci5vZmYpCisJCSAgJiYgICgodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciAKKwkJICAgICAgICsgc2VjdHBbbGluZXRhYltpXS5zZWdubyAtIDFdLlZpcnR1YWxfQWRkcmVzcyAKKwkJICAgICAgICsgbGluZXRhYltpXS5lbmQgPiBuZXdfYWRkci5vZmYpICkKKwkJeworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKworIAkgIERFQlVHX05vcm1hbGl6ZShjdXJyX2Z1bmMpOworCSAgaWYoIGxpbmV0YWJbaV0ubGluZXRhYiA9PSBOVUxMICkKKwkgICAgeworCSAgICAgIGN1cnJfZnVuYyA9IERFQlVHX0FkZFN5bWJvbCggc3ltbmFtZSwgJm5ld19hZGRyLCBOVUxMLAorCQkJCQkgICBTWU1fV0lOMzIgfCBTWU1fRlVOQyk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogRmlyc3QsIGNyZWF0ZSB0aGUgZW50cnkuICBUaGVuIGRpZyB0aHJvdWdoIHRoZSBsaW5ldGFiCisJICAgICAgICogYW5kIGFkZCB3aGF0ZXZlciBsaW5lIG51bWJlcnMgYXJlIGFwcHJvcHJpYXRlIGZvciB0aGlzCisJICAgICAgICogZnVuY3Rpb24uCisJICAgICAgICovCisJICAgICAgY3Vycl9mdW5jID0gREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIAorCQkJCQkgICBsaW5ldGFiW2ldLnNvdXJjZWZpbGUsCisJCQkJCSAgIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKKwkgICAgICBmb3Ioaj0wOyBqIDwgbGluZXRhYltpXS5ubGluZTsgaisrKQorCQl7CisJCSAgaWYoIGxpbmV0YWJbaV0ub2ZmdGFiW2pdID49IHN5bS0+cHJvYy5vZmZzZXQgCisJCSAgICAgICYmIGxpbmV0YWJbaV0ub2ZmdGFiW2pdIDwgc3ltLT5wcm9jLm9mZnNldCAKKwkJICAgICAgKyBzeW0tPnByb2MucHJvY19sZW4gKQorCQkgICAgeworCQkgICAgICBERUJVR19BZGRMaW5lTnVtYmVyKGN1cnJfZnVuYywgbGluZXRhYltpXS5saW5ldGFiW2pdLAorCQkJCQkgIGxpbmV0YWJbaV0ub2ZmdGFiW2pdIC0gc3ltLT5wcm9jLm9mZnNldCk7CisJCSAgICB9CisJCX0KKworCSAgICB9CisKKwkgIC8qCisJICAgKiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgd2Ugc2hvdWxkIHNldCBicmVha3BvaW50cworCSAgICogaW4gdGhpcyBmdW5jdGlvbi4KKwkgICAqLworCSAgREVCVUdfU2V0U3ltYm9sQlBPZmYoY3Vycl9mdW5jLCBzeW0tPnByb2MuZGVidWdfc3RhcnQpOworCSAgREVCVUdfU2V0U3ltYm9sU2l6ZShjdXJyX2Z1bmMsIHN5bS0+cHJvYy5wcm9jX2xlbik7CisJICBicmVhazsKKwljYXNlIFNfQlBSRUwzMjoKKwkgIC8qCisJICAgKiBGdW5jdGlvbiBwYXJhbWV0ZXJzIGFuZCBzdGFjayB2YXJpYWJsZXMuCisJICAgKi8KKwkgIG1lbWNweShzeW1uYW1lLCBzeW0tPnN0YWNrLm5hbWUsIHN5bS0+c3RhY2submFtZWxlbik7CisJICBjdXJyX3N5bSA9IERFQlVHX0FkZExvY2FsKGN1cnJfZnVuYywgCisJCQkgMCwgCisJCQkgc3ltLT5zdGFjay5vZmZzZXQsIAorCQkJIDAsIAorCQkJIDAsIAorCQkJIHN5bW5hbWUpOworCSAgREVCVUdfU2V0TG9jYWxTeW1ib2xUeXBlKGN1cnJfc3ltLCBERUJVR19HZXRDVlR5cGUoc3ltLT5zdGFjay5zeW10eXBlKSk7CisJICAKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBicmVhazsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBBZGp1c3QgcG9pbnRlciB0byBwb2ludCB0byBuZXh0IGVudHJ5LCByb3VuZGluZyB1cCB0byBhIHdvcmQKKyAgICAgICAqIGJvdW5kYXJ5LiAgTVMgcHJlc2VydmluZyBhbGlnbm1lbnQ/ICBTdHJhbmdlciB0aGluZ3MgaGF2ZQorICAgICAgICogaGFwcGVuZWQuCisgICAgICAgKi8KKyAgICAgIGlmKCBzeW0tPmdlbmVyaWMuaWQgPT0gU19QUk9DUkVGCisJICB8fCBzeW0tPmdlbmVyaWMuaWQgPT0gU19EQVRBUkVGCisJICB8fCBzeW0tPmdlbmVyaWMuaWQgPT0gU19VTktOT1dOICkKKwl7CisJICBsZW4gPSAoc3ltLT5nZW5lcmljLmxlbiArIDMpICYgfjM7CisJICBsZW4gKz0gcHRyLmNbMTZdICsgMTsKKwkgIHB0ci5jICs9IChsZW4gKyAzKSAmIH4zOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBwdHIuYyArPSAoc3ltLT5nZW5lcmljLmxlbiArIDMpICYgfjM7CisJfQorICAgIH0KKworICBpZiggbGluZXRhYiAhPSBOVUxMICkKKyAgICB7CisgICAgICBmcmVlKGxpbmV0YWIpOworICAgIH0KKworICByZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUHJvY2VzcyBQREIgZmlsZSB3aGljaCBjb250YWlucyBkZWJ1ZyBpbmZvcm1hdGlvbi4KKyAqCisgKiBUaGVzZSBhcmUgcmVhbGx5IHdlaXJkIGJlYXN0cy4gIFRoZXkgYXJlIGludGVuZGVkIHRvIGJlIGluY3JlbWVudGFsbHkKKyAqIHVwZGF0ZWQgYnkgdGhlIGluY3JlbWVudGFsIGxpbmtlciwgYW5kIHRoaXMgbWVhbnMgdGhhdCB5b3UgbmVlZCB0byAKKyAqIGJlIGFibGUgdG8gcmVtb3ZlIGFuZCBhZGQgaW5mb3JtYXRpb24uICBUaHVzIHRoZSBQREIgZmlsZSBpcyBzb3J0IG9mCisgKiBsaWtlIGEgYmxvY2sgc3RydWN0dXJlZCBkZXZpY2UsIHdpdGggYSBmcmVlbGlzdCBhbmQgbGlzdHMgb2YgZXh0ZW50IG51bWJlcnMKKyAqIHRoYXQgYXJlIHVzZWQgdG8gZ2V0IHRoZSByZWxldmFudCBwaWVjZXMuICBJbiBhbGwgY2FzZXMgc2VlbiBzbyBmYXIsIHRoZQorICogYmxvY2tzaXplIGlzIGFsd2F5cyAweDQwMCBieXRlcy4gIFRoZSBoZWFkZXIgaGFzIGEgZmllbGQgd2hpY2ggYXBwYXJlbnRseQorICogaG9sZHMgdGhlIGJsb2Nrc2l6ZSwgc28gaWYgaXQgZXZlciBjaGFuZ2VzIHdlIGFyZSBzYWZlLgorICoKKyAqIEluIGdlbmVyYWwsIGV2ZXJ5IHRpbWUgd2UgbmVlZCB0byBleHRyYWN0IHNvbWV0aGluZyBmcm9tIHRoZSBwZGIgZmlsZSwKKyAqIGl0IGlzIGVhc2llciB0byBjb3B5IGl0IGludG8gYW5vdGhlciBidWZmZXIgc28gd2UgaGF2ZSB0aGUgaW5mb3JtYXRpb24KKyAqIGluIG9uZSBjb250aWd1b3VzIGJsb2NrIHJhdGhlciB0aGFuIGF0dGVtcHQgdG8gdHJ5IGFuZCBrZWVwIHRyYWNrIG9mIHdoZW4KKyAqIHdlIG5lZWQgdG8gZ3JhYiBhbm90aGVyIGV4dGVudCBmcm9tIHRoZSBwZGIgZmlsZS4KKyAqCisgKiBUaGUgdGhpbmcgdGhhdCBpcyBhIHJlYWwgcGFpbiBhYm91dCBzb21lIE1TIHN0dWZmIGlzIHRoYXQgdGhleSBjaG9vc2UKKyAqIGRhdGEgc3RydWN0dXJlcyB3aGljaCBhcmUgbm90IHJlcHJlc2VudGFibGUgaW4gQy4gIFRodXMgd2UgaGF2ZSB0bworICogaGFjayBhcm91bmQgYW5kIGRpZGRsZSBwb2ludGVycy4KKyAqLworLyogc3RhdGljICovCitpbnQKK0RFQlVHX1Byb2Nlc3NQREJGaWxlKHN0cnVjdCBkZWZlcnJlZF9kZWJ1Z19pbmZvICogZGVlZmVyLCBjaGFyICogZnVsbF9maWxlbmFtZSkKK3sKKyAgY2hhcgkJCSAgICAgICogYWRkciA9IChjaGFyICopIDB4ZmZmZmZmZmY7CisgIHVuc2lnbmVkIGludAkJCWJsb2Nrc2l6ZTsKKyAgdW5zaWduZWQgaW50CQkJYnVmZmxlbiA9IDA7CisgIGNoYXIJCQkgICAgICAqIGJ1ZmZlciA9IE5VTEw7CisgIHVuc2lnbmVkIHNob3J0CSAgICAgICogZXh0ZW50X3RhYmxlOworICBpbnQJCQkJZmQgPSAtMTsKKyAgc3RydWN0IGZpbGVfZW50CSAgICAgICogZmVudDsKKyAgY2hhcgkJCSAgICAgICogZmlsZW5hbWU7CisgIHN0cnVjdCBmaWxlX2xpc3QJICAgICAgKiBmaWxlbGlzdCA9IE5VTEw7CisgIHVuc2lnbmVkIGludAkJCWdzeW1fcmVjb3JkID0gMDsKKyAgY2hhcgkJCSAgICAgICogZ3N5bXRhYiA9IE5VTEw7CisgIHN0cnVjdCBmaWxldGFiX2hkcgkgICAgICAqIGhkOworICBpbnQJCQkJaTsKKyAgaW50CQkJCWo7CisgIHVuc2lnbmVkIGludAkJCWxhc3RfZXh0ZW50OworICBzdHJ1Y3QgY29kZXZpZXdfbGluZXRhYl9oZHIgKiBsaW5ldGFiOworICB1bnNpZ25lZCBpbnQJCQluYmxvY2tzOworICB1bnNpZ25lZCBpbnQJCQlucGFpcjsKKyAgdW5zaWduZWQgaW50CQkJb2Zmc2V0OworICBzdHJ1Y3QgY29kZXZpZXdfcGRiX2hkciAgICAgKiBwZGJoZHI7CisgIHVuc2lnbmVkIGludAkJICAgICAgKiBwbnQ7CisgIHN0cnVjdCBzdGF0CQkJc3RhdGJ1ZjsKKyAgaW50CQkJCXN0YXR1czsKKyAgdW5zaWduZWQgc2hvcnQJICAgICAgKiB0YWJsZTsKKyAgY2hhcgkJCSAgICAgICogdG9jOworICB1bnNpZ25lZCBpbnQJCQl0b2NfYmxvY2tzOworICAKKyAgLyoKKyAgICogRklYTUUgLSB3ZSBzaG91bGQgdXNlIHNvbWUga2luZCBvZiBzZWFyY2ggcGF0aCBtZWNoYW5pc20gdG8gbG9jYXRlCisgICAqIFBEQiBmaWxlcy4gIFJpZ2h0IG5vdyB3ZSBqdXN0IGxvb2sgaW4gdGhlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksCisgICAqIHdoaWNoIHdvcmtzIG11Y2ggb2YgdGhlIHRpbWUsIEkgZ3Vlc3MuICBJZGVhbGx5IHdlIHNob3VsZCBiZSBhYmxlIHRvCisgICAqIG1hcCB0aGUgZmlsZW5hbWUgYmFjayB1c2luZyB0aGUgc2V0dGluZ3MgaW4gd2luZS5pbmkgYW5kIHBlcmhhcHMKKyAgICogd2UgY291bGQgZmluZCBpdCB0aGVyZS4gIFRoaXMgYml0IG9mIGNvZGluZyBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlCisgICAqIGZvciB0aGUgcmVhZGVyLiA6LSkuCisgICAqLworICBmaWxlbmFtZSA9IHN0cnJjaHIoZnVsbF9maWxlbmFtZSwgJ1xcJyk7CisgIGlmKCBmaWxlbmFtZSA9PSBOVUxMICkKKyAgICB7CisgICAgICBmaWxlbmFtZSA9IGZ1bGxfZmlsZW5hbWU7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgZmlsZW5hbWUrKzsKKyAgICB9CisKKyAgc3RhdHVzID0gc3RhdChmaWxlbmFtZSwgJnN0YXRidWYpOworICBpZiggc3RhdHVzID09IC0xICkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIC5QREIgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyoKKyAgICogTm93IG9wZW4gdGhlIGZpbGUsIHNvIHRoYXQgd2UgY2FuIG1tYXAoKSBpdC4KKyAgICovCisgIGZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworICBpZiggZmQgPT0gLTEgKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIG9wZW4gLkRCRyBmaWxlICVzXG4iLCBmaWxlbmFtZSk7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworCisgIC8qCisgICAqIE5vdyBtbWFwKCkgdGhlIGZpbGUuCisgICAqLworICBhZGRyID0gbW1hcCgwLCBzdGF0YnVmLnN0X3NpemUsIFBST1RfUkVBRCwgCisJICAgICAgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKworICAvKgorICAgKiBOb3cgdGhhdCB3ZSBoYXZlIHRoZSBmb3JtYWxpdGllcyBvdmVyIGFuZCBkb25lIHdpdGgsIHdlIG5lZWQKKyAgICogdG8gZmluZCB0aGUgdGFibGUgb2YgY29udGVudHMgZm9yIHRoZSBQREIgZmlsZS4KKyAgICovCisgIHBkYmhkciA9IChzdHJ1Y3QgY29kZXZpZXdfcGRiX2hkciAqKSBhZGRyOworICBibG9ja3NpemUgPSBwZGJoZHItPmJsb2Nrc2l6ZTsKKyAgbGFzdF9leHRlbnQgPSAoc3RhdGJ1Zi5zdF9zaXplICsgYmxvY2tzaXplIC0gMSkgLyBibG9ja3NpemU7CisKKyAgLyoKKyAgICogVGhlIFRPQyBpdHNlbGYgaXNuJ3QgYWx3YXlzIGNvbnRpZ3VvdXMsIHNvIHdlIG5lZWQgdG8gZXh0cmFjdCBhIGZldworICAgKiBleHRlbnRzIGZyb20gdGhlIGZpbGUgdG8gZm9ybSB0aGUgVE9DLgorICAgKi8KKyAgdG9jX2Jsb2NrcyA9IChwZGJoZHItPnRvY19sZW4gKyBibG9ja3NpemUgLSAxKSAvIGJsb2Nrc2l6ZTsKKyAgdG9jID0gKGNoYXIgKikgeG1hbGxvYyh0b2NfYmxvY2tzICogYmxvY2tzaXplKTsKKyAgdGFibGUgPSBwZGJoZHItPnRvY19leHQ7CisgIGZvcihpPTA7IGkgPCB0b2NfYmxvY2tzOyBpKyspCisgICAgeworICAgICAgbWVtY3B5KHRvYyArIGJsb2Nrc2l6ZSppLCBhZGRyICsgdGFibGVbaV0qYmxvY2tzaXplLCBibG9ja3NpemUpOworICAgIH0KKworICAvKgorICAgKiBOZXh0IGJ1aWxkIG91ciBvd24gdGFibGUgd2hpY2ggd2lsbCBoYXZlIHRoZSBzaXplIGFuZCBleHRlbnQgYmxvY2sKKyAgICogbGlzdCBmb3IgZWFjaCByZWNvcmQgaW4gdGhlIFBEQiBmaWxlLgorICAgKgorICAgKiBUaGUgVE9DIHN0YXJ0cyBvdXQgd2l0aCB0aGUgbnVtYmVyIG9mIGZpbGVzLiAgVGhlbiBpdCBpcyBmb2xsb3dlZCBieQorICAgKiAobnBhaXIgKiAyKnNpemVvZihpbnQpKSBieXRlcyBvZiBpbmZvcm1hdGlvbiwgd2hpY2ggYXJlIHBhaXJzIG9mIGludHMuCisgICAqIFRoZSBmaXJzdCBvbmUgaXMgdGhlIHNpemUgb2YgdGhlIHJlY29yZCAoaW4gYnl0ZXMpLCBhbmQgdGhlIHNlY29uZCBvbmUKKyAgICogaXMgc29tZXRoaW5nIGVsc2Ugd2hpY2ggSSBoYXZlbid0IGZpZ3VyZWQgb3V0IHlldC4KKyAgICovCisgIHBudCA9ICh1bnNpZ25lZCBpbnQgKikgdG9jOworICBucGFpciA9ICpwbnQrKzsKKyAgZXh0ZW50X3RhYmxlID0gKHVuc2lnbmVkIHNob3J0ICopICgodW5zaWduZWQgaW50KSB0b2MgKworCQkJCSAgICAgbnBhaXIgKiAyICogc2l6ZW9mKGludCkgKyBzaXplb2YoaW50KSk7CisKKyAgLyoKKyAgICogU2FuaXR5IGNoZWNrLgorICAgKi8KKyAgaWYoIHNpemVvZihpbnQpICsgMipzaXplb2YoaW50KSpucGFpciA+IHBkYmhkci0+dG9jX2xlbiApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisgIAorICBmaWxlbGlzdCA9IChzdHJ1Y3QgZmlsZV9saXN0ICopIHhtYWxsb2MobnBhaXIgKiBzaXplb2YoKmZpbGVsaXN0KSk7CisgIGlmKCBmaWxlbGlzdCA9PSBOVUxMICkKKyAgICB7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKyAgbWVtc2V0KGZpbGVsaXN0LCAwLCBucGFpciAqIHNpemVvZigqZmlsZWxpc3QpKTsKKworICBuYmxvY2tzID0gMDsKKyAgZm9yKGk9MDsgaSA8IG5wYWlyOyBpKyspCisgICAgeworICAgICAgZmlsZWxpc3RbaV0ucmVjb3JkX2xlbiA9IHBudFtpKjJdOworICAgICAgZmlsZWxpc3RbaV0ubmV4dGVudHMgICA9IChmaWxlbGlzdFtpXS5yZWNvcmRfbGVuICsgYmxvY2tzaXplIC0gMSkgCisJLyBibG9ja3NpemU7CisgICAgICBmaWxlbGlzdFtpXS5leHRlbnRfbGlzdCA9IGV4dGVudF90YWJsZSArIG5ibG9ja3M7CisgICAgICBuYmxvY2tzICs9IGZpbGVsaXN0W2ldLm5leHRlbnRzOworCisgICAgICAvKgorICAgICAgICogVGhlc2UgZ2V0IGZpbGxlZCBpbiBsYXRlciB3aGVuIHdlIHBhcnNlIG9uZSBvZiB0aGUgcmVjb3Jkcy4KKyAgICAgICAqLworICAgICAgZmlsZWxpc3RbaV0ubGluZXRhYl9vZmZzZXQgPSAwOworICAgICAgZmlsZWxpc3RbaV0ubGluZXRhYl9sZW4gPSAwOworICAgIH0KKworICAvKgorICAgKiBPSywgbm93IHdhbGsgdGhyb3VnaCB0aGUgdmFyaW91cyByZWNvcmRzIGFuZCBwaWNrIG91dCB0aGUgYml0cyB3ZQorICAgKiByZWFsbHkgd2FudCB0byBzZWUuICBTb21lIG9mIHRoZSByZWNvcmRzIGFyZSBleHRyYSBzcGVjaWFsLCBhbmQKKyAgICogd2UgbmVlZCB0byBoYW5kbGUgdGhlc2UgYSBsaXR0bGUgYml0IGRpZmZlcmVudGx5LgorICAgKi8KKyAgZm9yKGk9MDsgaSA8IG5wYWlyOyBpKyspCisgICAgeworICAgICAgaWYoIGZpbGVsaXN0W2ldLnJlY29yZF9sZW4gPT0gMHhmZmZmZmZmZiApCisJeworCSAgY29udGludWU7CisJfQorCisgICAgICAvKgorICAgICAgICogTWFrZSBzdXJlIG91ciBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIHJlY29yZC4KKyAgICAgICAqLworICAgICAgaWYoIGJ1ZmZsZW4gPCBmaWxlbGlzdFtpXS5uZXh0ZW50cyAqIGJsb2Nrc2l6ZSApCisJeworCSAgYnVmZmxlbiA9IGZpbGVsaXN0W2ldLm5leHRlbnRzICogYmxvY2tzaXplOworCSAgYnVmZmVyID0gKGNoYXIgKikgcmVhbGxvYyhidWZmZXIsIGJ1ZmZsZW4pOworCX0KKworICAgICAgLyoKKyAgICAgICAqIERvIHRoaXMganVzdCBmb3IgY29tcGxldGVuZXNzLiAgSXQgbWFrZXMgZGVidWdnaW5nIGVhc2llcgorICAgICAgICogaWYgd2UgaGF2ZSBhIGNsZWFuIGluZGljYXRpb24gb2Ygd2hlcmUgdGhlIHJlY29yZCBlbmRzLgorICAgICAgICovCisgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBmaWxlbGlzdFtpXS5uZXh0ZW50cyAqIGJsb2Nrc2l6ZSk7CisKKyAgICAgIC8qCisgICAgICAgKiBOZXh0LCBidWlsZCB0aGUgcmVjb3JkIHVzaW5nIHRoZSBleHRlbnQgbGlzdC4KKyAgICAgICAqLworICAgICAgZm9yKGo9MDsgaiA8IGZpbGVsaXN0W2ldLm5leHRlbnRzOyBqKyspCisJeworCSAgbWVtY3B5KGJ1ZmZlciArIGogKiBibG9ja3NpemUsCisJCSBhZGRyICsgZmlsZWxpc3RbaV0uZXh0ZW50X2xpc3Rbal0gKiBibG9ja3NpemUsCisJCSBibG9ja3NpemUpOworCX0KKworICAgICAgcG50ID0gKHVuc2lnbmVkIGludCAqKSBidWZmZXI7CisKKyAgICAgIC8qCisgICAgICAgKiBPSywgbm93IGZpZ3VyZSBvdXQgd2hhdCB0byBkbyB3aXRoIGl0LgorICAgICAgICovCisKKyAgICAgIC8qCisgICAgICAgKiBBbHdheXMgaWdub3JlIHRoZSBmaXJzdCBlbnRyeS4gIEl0IHNlZW1zIHRvIGNvbnRhaW4gYSBiYWNrdXAgY29weQorICAgICAgICogb2YgdGhlIFRPQyAodGhlIGxhc3QgdGltZSB0aGUgZmlsZSB3YXMgbW9kaWZpZWQ/PykKKyAgICAgICAqLworICAgICAgaWYoIGkgPT0gMCApCisJeworCSAgY29udGludWU7CisJfQorCisgICAgICAvKiAKKyAgICAgICAqIFRoZSBzZWNvbmQgZW50cnkgYXMgYSBpZCBibG9jay4gIEl0IGNvbnRhaW5zIGEgbWFnaWMgbnVtYmVyCisgICAgICAgKiB0byBpZGVudGlmeSB0aGUgY29tcGlsZXIsIHBsdXMgaXQgYWxzbyBjb250YWlucyB0aGUgdGltZXN0YW1wCisgICAgICAgKiB3aGljaCBtdXN0IG1hdGNoIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGV4ZWN1dGFibGUuICAKKyAgICAgICAqLworICAgICAgaWYoIGkgPT0gMSApCisJeworCisJICBpZiggKCgqcG50ICE9IDE5OTUwNjIzKSAmJiAoKnBudCAhPSAxOTk1MDgxNCkpCisJICAgICAgfHwgKGZpbGVsaXN0W2ldLnJlY29yZF9sZW4gIT0gMHgyNCkKKwkgICAgICB8fCAocG50WzFdICE9ICgoc3RydWN0IENvZGVWaWV3RGVidWcgKikoZGVlZmVyLT5kYmdfaW5mbykpLT5jdl90aW1lc3RhbXApICkKKwkgICAgeworCSAgICAgIGdvdG8gbGVhdmU7CisJICAgIH0KKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBUaGUgdGhpcmQgZW50cnkgY29udGFpbnMgcG9pbnRlcnMgdG8gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUsCisgICAgICAgKiBwbHVzIGl0IGFsc28gY29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlY29yZAorICAgICAgICogaW4gdGhlIFBEQiBmaWxlLgorICAgICAgICovCisgICAgICBpZiggaSA9PSAzICkKKwl7CisJICBoZCA9IChzdHJ1Y3QgZmlsZXRhYl9oZHIgKikgYnVmZmVyOworCisJICBnc3ltX3JlY29yZCA9IGhkLT5nc3ltX2ZpbGU7CisJICBnc3ltdGFiID0gKGNoYXIgKikgeG1hbGxvYyggZmlsZWxpc3RbZ3N5bV9yZWNvcmRdLm5leHRlbnRzIAorCQkJCSAgICAgICogYmxvY2tzaXplKTsKKwkgIG1lbXNldChnc3ltdGFiLCAwLCBmaWxlbGlzdFtnc3ltX3JlY29yZF0ubmV4dGVudHMgKiBibG9ja3NpemUpOworCSAgCisJICBmb3Ioaj0wOyBqIDwgZmlsZWxpc3RbZ3N5bV9yZWNvcmRdLm5leHRlbnRzOyBqKyspCisJICAgIHsKKwkgICAgICBtZW1jcHkoZ3N5bXRhYiArIGogKiBibG9ja3NpemUsCisJCSAgICAgYWRkciArIGZpbGVsaXN0W2dzeW1fcmVjb3JkXS5leHRlbnRfbGlzdFtqXSAqIGJsb2Nrc2l6ZSwKKwkJICAgICBibG9ja3NpemUpOworCSAgICB9CisKKwkgIC8qCisJICAgKiBUaGlzIHJlY29yZCBhbHNvIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoZXJlIGluIHRoZQorCSAgICogcmVtYWluaW5nIHJlY29yZHMgd2Ugd2lsbCBiZSBhYmxlIHRvIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZQorCSAgICogbGluZSBudW1iZXIgdGFibGUuICBXZSBjb3VsZCBsb2NhdGUgdGhhdCBiaXQgdXNpbmcgaGV1cmlzdGljcywKKwkgICAqIGJ1dCBzaW5jZSB3ZSBoYXZlIHRoZSBpbmZvIGhhbmR5LCB3ZSBtaWdodCBhcyB3ZWxsIHVzZSBpdC4KKwkgICAqLworCSAgb2Zmc2V0ID0gc2l6ZW9mKCpoZCk7CisJICB3aGlsZSgxPT0xKQorCSAgICB7CisJICAgICAgZmVudCA9IChzdHJ1Y3QgZmlsZV9lbnQgKikgKGJ1ZmZlciArIG9mZnNldCk7CisJICAgICAgaWYoIG9mZnNldCA+IGhkLT5mdGFiX2xlbiApCisJCXsKKwkJICBicmVhazsKKwkJfQorCisJICAgICAgaWYoIGZlbnQtPmZpbGVfbnVtYmVyID09IDAgfHwgZmVudC0+ZmlsZV9udW1iZXIgPj0gbnBhaXIgKQorCQl7CisgCQkgIGJyZWFrOworCQl9CisKKwkgICAgICBmaWxlbGlzdFtmZW50LT5maWxlX251bWJlcl0ubGluZXRhYl9vZmZzZXQgPSAKKwkJZmVudC0+bGluZXRhYl9vZmZzZXQ7CisJICAgICAgZmlsZWxpc3RbZmVudC0+ZmlsZV9udW1iZXJdLmxpbmV0YWJfbGVuID0gCisJCWZlbnQtPmxpbmV0YWJfbGVuOworCSAgICAgIC8qCisJICAgICAgICogRmlndXJlIG91dCB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0IGVudHJ5LgorCSAgICAgICAqIFRoZXJlIGlzIGEgZml4ZWQgcGFydCBvZiB0aGUgcmVjb3JkIGFuZCBhIHZhcmlhYmxlCisJICAgICAgICogbGVuZ3RoIGZpbGVuYW1lIHdoaWNoIHdlIG11c3QgYWxzbyBza2lwIHBhc3QuCisJICAgICAgICovCisJICAgICAgb2Zmc2V0ICs9ICgodW5zaWduZWQgaW50KSAmZmVudC0+ZmlsZW5hbWUgLSAodW5zaWduZWQgaW50KSBmZW50KQorCQkrIHN0cmxlbihmZW50LT5maWxlbmFtZSkgKyAxOworCSAgICAgIG9mZnNldCArPSBzdHJsZW4oYnVmZmVyK29mZnNldCkgKyAxOworCSAgICAgIG9mZnNldCA9IChvZmZzZXQgKyAzKSAmIH4zOworCSAgICB9CisJfQorICAgICAgCisKKyAgICAgIC8qCisgICAgICAgKiBUd28gZGlmZmVyZW50IG1hZ2ljIG51bWJlcnMgdXNlZCBhcyBkYXRlcy4KKyAgICAgICAqIFRoZXNlIGluZGljYXRlIHRoZSAndHlwZScgdGFibGUuCisgICAgICAgKi8KKyAgICAgIGlmKCAgICAgICAqcG50ID09IDE5OTUwNDEwCisJICAgICB8fCAqcG50ID09IDE5OTUxMTIyICkKKwl7CisJICBERUJVR19QYXJzZVR5cGVUYWJsZShidWZmZXIsIGZpbGVsaXN0W2ldLnJlY29yZF9sZW4pOworCSAgY29udGludWU7CisJfQorCisgICAgICAvKgorICAgICAgICogVGhpcyBpcyBzb21ldGhpbmcgd2UgcmVhbGx5IHdhbnQgdG8gbG9vayBhdCwgc2luY2UgaXQgY29udGFpbnMKKyAgICAgICAqIHJlYWwgZGVidWcgaW5mby4gIEFueXRoaW5nIHRoYXQgZG9lc24ndCBtYXRjaCB0aGlzIGNhbiBiZQorICAgICAgICogaWdub3JlZCBmb3Igbm93LgorICAgICAgICovCisgICAgICBpZiggKnBudCA9PSAxICkKKwl7CisJICAvKgorCSAgICogRmlyc3QsIHNuYWcgdGhlIGxpbmUgdGFibGUsIGlmIHdlIGhhdmUgb25lLiAgVGhpcyBhbHdheXMKKwkgICAqIG9jY3VycyBhdCB0aGUgZW5kIG9mIHRoZSByZWNvcmQsIHNvIHdlIHRha2UgdGhlIGxpbmV0YWIKKwkgICAqIG9mZnNldCBhcyB0aGUgZW5kIG9mIHRoZSBub3JtYWwgcGFydCBvZiB0aGUgcmVjb3JkLgorCSAgICovCisJICBsaW5ldGFiID0gTlVMTDsKKwkgIGlmKCBmaWxlbGlzdFtpXS5saW5ldGFiX2xlbiAhPSAwICkKKwkgICAgeworCSAgICAgIGxpbmV0YWIgPSBERUJVR19TbmFyZkxpbmV0YWIoYnVmZmVyICsgZmlsZWxpc3RbaV0ubGluZXRhYl9vZmZzZXQsCisJCQkJCSAgIGZpbGVsaXN0W2ldLmxpbmV0YWJfbGVuKTsKKwkgICAgICBERUJVR19TbmFyZkNvZGVWaWV3KGRlZWZlciwgYnVmZmVyLAorCQkJCSAgZmlsZWxpc3RbaV0ubGluZXRhYl9vZmZzZXQsCisJCQkJICBsaW5ldGFiKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgREVCVUdfU25hcmZDb2RlVmlldyhkZWVmZXIsIGJ1ZmZlciwKKwkJCQkgIGZpbGVsaXN0W2ldLnJlY29yZF9sZW4sCisJCQkJICBsaW5ldGFiKTsKKwkgICAgfQorCSAgY29udGludWU7CisJfQorICAgIH0KKworICAvKgorICAgKiBGaW5hbGx5LCBwcm9jZXNzIHRoZSBnbG9iYWwgc3ltYm9sIHRhYmxlIGl0c2VsZi4gIFRoZXJlIGlzbid0CisgICAqIGEgbGluZSBudW1iZXIgY29tcG9uZW50IHRvIHRoaXMsIHNvIHdlIGp1c3QgdG9zcyBldmVyeXRoaW5nCisgICAqIGludG8gdGhlIG1peCBhbmQgaXQgYWxsIHNob3VsZCB3b3JrIG91dC4KKyAgICovCisgIGlmKCBnc3ltX3JlY29yZCAhPSAwICkKKyAgICB7CisgICAgICBERUJVR19TbmFyZkNvZGVWaWV3KGRlZWZlciwgZ3N5bXRhYiAtIHNpemVvZihpbnQpLCAKKwkJCSAgZmlsZWxpc3RbZ3N5bV9yZWNvcmRdLnJlY29yZF9sZW4sCisJCQkgIE5VTEwpOworICAgIH0KKyAgCitsZWF2ZToKKworICBpZiggZ3N5bXRhYiAhPSBOVUxMICkKKyAgICB7CisgICAgICBmcmVlKGdzeW10YWIpOworICAgICAgZ3N5bXRhYiA9IE5VTEw7CisgICAgfQorCisgIGlmKCBidWZmZXIgIT0gTlVMTCApCisgICAgeworICAgICAgZnJlZShidWZmZXIpOworICAgIH0KKworICBpZiggZmlsZWxpc3QgIT0gTlVMTCApCisgICAgeworICAgICAgZnJlZShmaWxlbGlzdCk7CisgICAgfQorCisgIGlmKCBhZGRyICE9IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIG11bm1hcChhZGRyLCBzdGF0YnVmLnN0X3NpemUpOworICAgIH0KKworICBpZiggZmQgIT0gLTEgKQorICAgIHsKKyAgICAgIGNsb3NlKGZkKTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qCisgKiBQcm9jZXNzIERCRyBmaWxlIHdoaWNoIGNvbnRhaW5zIGRlYnVnIGluZm9ybWF0aW9uLgorICovCisvKiBzdGF0aWMgKi8KK2ludAorREVCVUdfUHJvY2Vzc0RCR0ZpbGUoc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8gKiBkZWVmZXIsIGNoYXIgKiBmaWxlbmFtZSkKK3sKKyAgY2hhcgkJCSAgICAgICogYWRkciA9IChjaGFyICopIDB4ZmZmZmZmZmY7CisgIGNoYXIJCQkgICAgICAqIGNvZGV2aWV3OworICBzdHJ1Y3QgQ1Y0X0RpckhlYWQJICAgICAgKiBjb2Rldmlld19kaXI7CisgIHN0cnVjdCBDVjRfRGlyRW50CSAgICAgICogY29kZXZpZXdfZGVudDsKKyAgc3RydWN0IFBFX0RlYnVnX2RpcgkgICAgICAqIGRiZ2hkcjsKKyAgc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8gICAgZGVlZmVyMjsKKyAgaW50CQkJCWZkID0gLTE7CisgIGludAkJCQlpOworICBpbnQJCQkJajsKKyAgc3RydWN0IGNvZGV2aWV3X2xpbmV0YWJfaGRyICogbGluZXRhYjsKKyAgaW50CQkJCW5zZWN0OworICBzdHJ1Y3QgUEVfREJHX0ZpbGVIZWFkZXIgICAgKiBwZGJnID0gTlVMTDsKKyAgc3RydWN0IHBlX3NlZ21lbnRfdGFibGUgICAgICogc2VjdHA7CisgIHN0cnVjdCBzdGF0CQkJc3RhdGJ1ZjsKKyAgaW50CQkJCXN0YXR1czsKKyAgCisgIHN0YXR1cyA9IHN0YXQoZmlsZW5hbWUsICZzdGF0YnVmKTsKKyAgaWYoIHN0YXR1cyA9PSAtMSApCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gb3BlbiAuREJHIGZpbGUgJXNcbiIsIGZpbGVuYW1lKTsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qCisgICAqIE5vdyBvcGVuIHRoZSBmaWxlLCBzbyB0aGF0IHdlIGNhbiBtbWFwKCkgaXQuCisgICAqLworICBmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKyAgaWYoIGZkID09IC0xICkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuYWJsZSB0byBvcGVuIC5EQkcgZmlsZSAlc1xuIiwgZmlsZW5hbWUpOworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKworICAvKgorICAgKiBOb3cgbW1hcCgpIHRoZSBmaWxlLgorICAgKi8KKyAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAorCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgcGRiZyA9IChzdHJ1Y3QgUEVfREJHX0ZpbGVIZWFkZXIgKikgYWRkcjsKKworICBpZiggcGRiZy0+VGltZURhdGVTdGFtcCAhPSBkZWVmZXItPmRiZ2Rpci0+dGltZXN0YW1wICkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmcgLSAlcyBoYXMgaW5jb3JyZWN0IGludGVybmFsIHRpbWVzdGFtcFxuIiwKKwkgICAgICBmaWxlbmFtZSk7CisgICAgICBnb3RvIGxlYXZlOworICAgfQorCisgIGZwcmludGYoc3RkZXJyLCAiUHJvY2Vzc2luZyBzeW1ib2xzIGZyb20gJXMuLi5cbiIsIGZpbGVuYW1lKTsKKworICBkYmdoZHIgPSAoc3RydWN0IFBFX0RlYnVnX2RpciAqKSAoICBhZGRyICsgc2l6ZW9mKCpwZGJnKSAKKwkJICsgcGRiZy0+TnVtYmVyT2ZTZWN0aW9ucyAqIHNpemVvZihzdHJ1Y3QgcGVfc2VnbWVudF90YWJsZSkgCisJCSArIHBkYmctPkV4cG9ydGVkTmFtZXNTaXplKTsKKworICBzZWN0cCA9IChzdHJ1Y3QgcGVfc2VnbWVudF90YWJsZSAqKSAoKGNoYXIgKikgcGRiZyArIHNpemVvZigqcGRiZykpOworICBuc2VjdCA9IHBkYmctPk51bWJlck9mU2VjdGlvbnM7CisKKyAgZm9yKCBpPTA7IGkgPCBwZGJnLT5EZWJ1Z0RpcmVjdG9yeVNpemUgLyBzaXplb2YoKnBkYmcpOyBpKyssIGRiZ2hkcisrICkKKyAgICB7CisgICAgICBzd2l0Y2goZGJnaGRyLT50eXBlKQorCQl7CisJCWNhc2UgSU1BR0VfREVCVUdfVFlQRV9DT0ZGOgorCQkgIC8qCisJCSAgICogRHVtbXkgdXAgYSBkZWZlcnJlZCBkZWJ1ZyBoZWFkZXIgdG8gaGFuZGxlIHRoZQorCQkgICAqIENPRkYgc3R1ZmYgZW1iZWRkZWQgd2l0aGluIHRoZSBEQkcgZmlsZS4KKwkJICAgKi8KKwkJICBtZW1zZXQoKGNoYXIgKikgJmRlZWZlcjIsIDAsIHNpemVvZihkZWVmZXIyKSk7CisJCSAgZGVlZmVyMi5kYmdfaW5mbyA9IChhZGRyICsgZGJnaGRyLT5kYmdvZmYpOworCQkgIGRlZWZlcjIuZGJnX3NpemUgPSBkYmdoZHItPmRiZ3NpemU7CisJCSAgZGVlZmVyMi5sb2FkX2FkZHIgPSBkZWVmZXItPmxvYWRfYWRkcjsKKworCQkgIERFQlVHX1Byb2Nlc3NDb2ZmKCZkZWVmZXIyKTsKKwkJICBicmVhazsKKwkJY2FzZSBJTUFHRV9ERUJVR19UWVBFX0NPREVWSUVXOgorCQkgIC8qCisJCSAgICogVGhpcyBpcyB0aGUgb2xkZXIgZm9ybWF0IGJ5IHdoaWNoIGNvZGV2aWV3IHN0dWZmIGlzIAorCQkgICAqIHN0b3JlZCwga25vd24gYXMgdGhlICdOQjA5JyBmb3JtYXQuICBOZXdlciBleGVjdXRhYmxlcworCQkgICAqIGFuZCBkbGxzIGNyZWF0ZWQgYnkgVkMrKyB1c2UgUERCIGZpbGVzIGluc3RlYWQsIHdoaWNoCisJCSAgICogaGF2ZSBsb3RzIG9mIGludGVybmFsIHNpbWlsYXJpdGllcywgYnV0IHRoZSBvdmVyYWxsCisJCSAgICogZm9ybWF0IGFuZCBzdHJ1Y3R1cmUgaXMgcXVpdGUgZGlmZmVyZW50LgorCQkgICAqLworCQkgIGNvZGV2aWV3ID0gKGFkZHIgKyBkYmdoZHItPmRiZ29mZik7CisKKwkJICAvKgorCQkgICAqIFRoZSBmaXJzdCB0aGluZyBpbiB0aGUgY29kZXZpZXcgc2VjdGlvbiBzaG91bGQgYmUKKwkJICAgKiBhbiAnTkIwOScgaWRlbnRpZmllci4gIEFzIGEgc2FuaXR5IGNoZWNrLCBtYWtlIHN1cmUKKwkJICAgKiBpdCBpcyB0aGVyZS4KKwkJICAgKi8KKwkJICBpZiggKigodW5zaWduZWQgaW50KikgY29kZXZpZXcpICE9IDB4MzkzMDQyNGUgKQorCQkgICAgeworCQkgICAgICBicmVhazsKKwkJICAgIH0KKwkJICAKKwkJICAvKgorCQkgICAqIE5leHQgd2UgbmVlZCB0byBmaW5kIHRoZSBkaXJlY3RvcnkuICBUaGlzIGlzIGVhc3kgdG9vLgorCQkgICAqLworCQkgIGNvZGV2aWV3X2RpciA9IChzdHJ1Y3QgQ1Y0X0RpckhlYWQgKikgCisJCSAgICAoY29kZXZpZXcgKyAoKHVuc2lnbmVkIGludCopIGNvZGV2aWV3KVsxXSk7CisKKwkJICAvKgorCQkgICAqIFNvbWUgbW9yZSBzYW5pdHkgY2hlY2tzLiAgTWFrZSBzdXJlIHRoYXQgZXZlcnl0aGluZworCQkgICAqIGlzIGFzIHdlIGV4cGVjdCBpdC4KKwkJICAgKi8KKwkJICBpZiggY29kZXZpZXdfZGlyLT5uZXh0X29mZnNldCAhPSAwIAorCQkgICAgICB8fCBjb2Rldmlld19kaXItPmRoc2l6ZSAhPSBzaXplb2YoKmNvZGV2aWV3X2RpcikKKwkJICAgICAgfHwgY29kZXZpZXdfZGlyLT5kZXNpemUgIT0gc2l6ZW9mKCpjb2Rldmlld19kZW50KSApCisJCSAgICB7CisJCSAgICAgIGJyZWFrOworCQkgICAgfQorCQkgIGNvZGV2aWV3X2RlbnQgPSAoc3RydWN0IENWNF9EaXJFbnQgKikgKGNvZGV2aWV3X2RpciArIDEpOworCisJCSAgZm9yKGo9MDsgaiA8IGNvZGV2aWV3X2Rpci0+bmRpcjsgaisrLCBjb2Rldmlld19kZW50KyspCisJCSAgICB7CisJCSAgICAgIGlmKCBjb2Rldmlld19kZW50LT5zdWJzZWN0X251bWJlciA9PSBzc3RBbGlnblN5bSApCisJCQl7CisJCQkgIC8qCisJCQkgICAqIENoZWNrIHRoZSBwcmV2aW91cyBlbnRyeS4gIElmIGl0IGlzIGEKKwkJCSAgICogc3N0U3JjTW9kdWxlLCBpdCBjb250YWlucyB0aGUgbGluZSBudW1iZXIKKwkJCSAgICogaW5mbyBmb3IgdGhpcyBmaWxlLgorCQkJICAgKi8KKwkJCSAgbGluZXRhYiA9IE5VTEw7CisJCQkgIGlmKCBjb2Rldmlld19kZW50WzFdLm1vZHVsZV9udW1iZXIgPT0gY29kZXZpZXdfZGVudFswXS5tb2R1bGVfbnVtYmVyCisJCQkgICAgICAmJiBjb2Rldmlld19kZW50WzFdLnN1YnNlY3RfbnVtYmVyID09IHNzdFNyY01vZHVsZSApCisJCQkgICAgeworCQkJICAgICAgbGluZXRhYiA9IERFQlVHX1NuYXJmTGluZXRhYigKKwkJCQkJICAgY29kZXZpZXcgKyBjb2Rldmlld19kZW50WzFdLm9mZnNldCwKKwkJCQkJICAgY29kZXZpZXdfZGVudFsxXS5zaXplKTsKKwkJCSAgICB9CisKKwkJCSAgaWYoIGNvZGV2aWV3X2RlbnRbLTFdLm1vZHVsZV9udW1iZXIgPT0gY29kZXZpZXdfZGVudFswXS5tb2R1bGVfbnVtYmVyCisJCQkgICAgICAmJiBjb2Rldmlld19kZW50Wy0xXS5zdWJzZWN0X251bWJlciA9PSBzc3RTcmNNb2R1bGUgKQorCQkJICAgIHsKKwkJCSAgICAgIGxpbmV0YWIgPSBERUJVR19TbmFyZkxpbmV0YWIoCisJCQkJCSAgIGNvZGV2aWV3ICsgY29kZXZpZXdfZGVudFstMV0ub2Zmc2V0LAorCQkJCQkgICBjb2Rldmlld19kZW50Wy0xXS5zaXplKTsKKwkJCSAgICB9CisJCQkgIC8qCisJCQkgICAqIE5vdyBwcm9jZXNzIHRoZSBDViBzdHVmZi4KKwkJCSAgICovCisJCQkgIERFQlVHX1NuYXJmQ29kZVZpZXcoZGVlZmVyLCAKKwkJCQkJICAgICAgY29kZXZpZXcgKyBjb2Rldmlld19kZW50LT5vZmZzZXQsCisJCQkJCSAgICAgIGNvZGV2aWV3X2RlbnQtPnNpemUsCisJCQkJCSAgICAgIGxpbmV0YWIpOworCQkJfQorCQkgICAgfQorCisJCSAgYnJlYWs7CisJCWRlZmF1bHQ6CisJCSAgYnJlYWs7CisJCX0KKyAgICB9CitsZWF2ZToKKworICBpZiggYWRkciAhPSAoY2hhciAqKSAweGZmZmZmZmZmICkKKyAgICB7CisgICAgICBtdW5tYXAoYWRkciwgc3RhdGJ1Zi5zdF9zaXplKTsKKyAgICB9CisKKyAgaWYoIGZkICE9IC0xICkKKyAgICB7CisgICAgICBjbG9zZShmZCk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCiBpbnQKIERFQlVHX1Byb2Nlc3NEZWZlcnJlZERlYnVnKCkKIHsKICAgc3RydWN0IGRlZmVycmVkX2RlYnVnX2luZm8gKiBkZWVmZXI7CiAgIHN0cnVjdCBDb2RlVmlld0RlYnVnCSAgICAgKiBjdmQ7CiAgIHN0cnVjdCBNaXNjRGVidWcJICAgICAqIG1pc2M7CisgIGNoYXIJCQkgICAgICogZmlsZW5hbWU7CisgIGludAkJCSAgICAgICBsYXN0X3Byb2MgPSAtMTsKKworICBERUJVR19Jbml0Q1ZEYXRhVHlwZXMoKTsKIAogICBmb3IoZGVlZmVyID0gZGJnbGlzdDsgZGVlZmVyOyBkZWVmZXIgPSBkZWVmZXItPm5leHQpCiAgICAgeworICAgICAgaWYoIGRlZWZlci0+bG9hZGVkICkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmKCBsYXN0X3Byb2MgIT0gZGVlZmVyLT5kYmdfaW5kZXggKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiTG9hZGluZyBzeW1ib2xzIGZyb20gV2luMzIgZmlsZSAlcy4uLlxuIiwgCisJCSAgZGVlZmVyLT5tb2R1bGVfbmFtZSk7CisJICBsYXN0X3Byb2MgPSBkZWVmZXItPmRiZ19pbmRleDsKKwl9CisKICAgICAgIHN3aXRjaChkZWVmZXItPmRiZ2Rpci0+dHlwZSkKIAl7CiAJY2FzZSBJTUFHRV9ERUJVR19UWVBFX0NPRkY6CkBAIC0zODksMTggKzIzMTcsNDcgQEAKIAkgICAqIFRoaXMgaXMgYSBwb2ludGVyIHRvIGEgUERCIGZpbGUgb2Ygc29tZSBzb3J0LgogCSAgICovCiAJICBjdmQgPSAoc3RydWN0IENvZGVWaWV3RGVidWcgKikgZGVlZmVyLT5kYmdfaW5mbzsKKworCSAgaWYoIHN0cmNtcChjdmQtPmN2X25idHlwZSwgIk5CMTAiKSAhPSAwICkKKwkgICAgeworCSAgICAgIC8qCisJICAgICAgICogV2hhdGV2ZXIgdGhpcyBpcywgd2UgZG9uJ3Qga25vdyBob3cgdG8gZGVhbCB3aXRoCisJICAgICAgICogaXQgeWV0LgorCSAgICAgICAqLworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBERUJVR19Qcm9jZXNzUERCRmlsZShkZWVmZXIsIGN2ZC0+Y3ZfbmFtZSk7CiAjaWYgMAogCSAgZnByaW50ZihzdGRlcnIsICJQcm9jZXNzaW5nIFBEQiBmaWxlICVzXG4iLCBjdmQtPmN2X25hbWUpOwogI2VuZGlmCiAJICBicmVhazsKIAljYXNlIElNQUdFX0RFQlVHX1RZUEVfTUlTQzoKIAkgIC8qCi0JICAgKiBBIHBvaW50ZXIgdG8gYSAuREJHIGZpbGUgb2Ygc29tZSBzb3J0LgorCSAgICogQSBwb2ludGVyIHRvIGEgLkRCRyBmaWxlIG9mIHNvbWUgc29ydC4gIFRoZXNlIGZpbGVzCisJICAgKiBjYW4gY29udGFpbiBlaXRoZXIgQ1Y0IG9yIENPRkYgaW5mb3JtYXRpb24uICBPcGVuCisJICAgKiB0aGUgZmlsZSwgYW5kIHRyeSB0byBkbyB0aGUgcmlnaHQgdGhpbmcgd2l0aCBpdC4KIAkgICAqLwogCSAgbWlzYyA9IChzdHJ1Y3QgTWlzY0RlYnVnICopIGRlZWZlci0+ZGJnX2luZm87Ci0jaWYgMAotCSAgZnByaW50ZihzdGRlcnIsICJQcm9jZXNzaW5nIERCRyBmaWxlICVzXG4iLCBtaXNjLT5EYXRhKTsKLSNlbmRpZgorCisJICBmaWxlbmFtZSA9IHN0cnJjaHIoKGNoYXIgKikgJm1pc2MtPkRhdGEsICcuJyk7CisKKwkgIC8qCisJICAgKiBJZ25vcmUgdGhlIGZpbGUgaWYgaXQgZG9lc24ndCBoYXZlIGEgLkRCRyBleHRlbnNpb24uCisJICAgKi8KKwkgIGlmKCAgICAoZmlsZW5hbWUgPT0gTlVMTCkKKwkgICAgICB8fCAoICAgIChzdHJjbXAoZmlsZW5hbWUsICIuZGJnIikgIT0gMCkKKwkgICAgICAgICAgICYmIChzdHJjbXAoZmlsZW5hbWUsICIuREJHIikgIT0gMCkpICkKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisKKwkgIGZpbGVuYW1lID0gKGNoYXIgKikgJm1pc2MtPkRhdGE7CisKKwkgIC8qCisJICAgKiBEbyB0aGUgZGlydHkgZGVlZC4uLgorCSAgICovCisJICBERUJVR19Qcm9jZXNzREJHRmlsZShkZWVmZXIsIGZpbGVuYW1lKTsKKyAgICAgIAogCSAgYnJlYWs7CiAJZGVmYXVsdDoKIAkgIC8qCkBAIC00MTAsNCArMjM2NywzNCBAQAogCX0KICAgICB9CiAgIHJldHVybiBUUlVFOworCiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX0luZm9TaGFyZQorICoKKyAqIERpc3BsYXkgc2hhcmVkIGxpYmFyYXJ5IGluZm9ybWF0aW9uLgorICovCit2b2lkIERFQlVHX0luZm9TaGFyZSh2b2lkKQoreworICBzdHJ1Y3QgZGVmZXJyZWRfZGVidWdfaW5mbyAqIGRlZWZlcjsKKworICBmcHJpbnRmKHN0ZGVyciwiQWRkcmVzc1x0XHRNb2R1bGVcdE5hbWVcbiIpOworCisgIGZvcihkZWVmZXIgPSBkYmdsaXN0OyBkZWVmZXI7IGRlZWZlciA9IGRlZWZlci0+bmV4dCkKKyAgICB7CisgICAgICBpZiggZGVlZmVyLT5wZSA9PSBOVUxMICkKKwl7CisJICBmcHJpbnRmKHN0ZGVyciwiMHglOC44eFx0KEVMRilcdCVzXG4iLCAKKwkJICAodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciwKKwkJICBkZWVmZXItPm1vZHVsZV9uYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZnByaW50ZihzdGRlcnIsIjB4JTguOHhcdChXaW4zMilcdCVzXG4iLCAKKwkJICAodW5zaWduZWQgaW50KSBkZWVmZXItPmxvYWRfYWRkciwKKwkJICBkZWVmZXItPm1vZHVsZV9uYW1lKTsKKwl9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWdpc3RlcnMuYyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCmluZGV4IDJlY2FmNmEuLjdjNjhmNmEgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCisrKyBiL2RlYnVnZ2VyL3JlZ2lzdGVycy5jCkBAIC00OCw2ICs0OCw0MSBAQAogfQogCiAKK2ludAorREVCVUdfUHJpbnRSZWdpc3RlcihlbnVtIGRlYnVnX3JlZ3MgcmVnKQoreworICAgIHN3aXRjaChyZWcpCisgICAgeworICAgICAgICBjYXNlIFJFR19FQVg6IGZwcmludGYoc3RkZXJyLCAiJSVlYXgiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VCWDogZnByaW50ZihzdGRlcnIsICIlJWVieCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRUNYOiBmcHJpbnRmKHN0ZGVyciwgIiUlZWN4Iik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FRFg6IGZwcmludGYoc3RkZXJyLCAiJSVlZHgiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VTSTogZnByaW50ZihzdGRlcnIsICIlJWVzaSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRURJOiBmcHJpbnRmKHN0ZGVyciwgIiUlZWRpIik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FQlA6IGZwcmludGYoc3RkZXJyLCAiJSVlYnAiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VGTDogZnByaW50ZihzdGRlcnIsICIlJWVmbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRUlQOiBmcHJpbnRmKHN0ZGVyciwgIiUlZWlwIik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19FU1A6IGZwcmludGYoc3RkZXJyLCAiJSVlc3AiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0FYOiAgZnByaW50ZihzdGRlcnIsICIlJWF4Iik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19CWDogIGZwcmludGYoc3RkZXJyLCAiJSVieCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfQ1g6ICBmcHJpbnRmKHN0ZGVyciwgIiUlY3giKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0RYOiAgZnByaW50ZihzdGRlcnIsICIlJWR4Iik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19TSTogIGZwcmludGYoc3RkZXJyLCAiJSVzaSIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfREk6ICBmcHJpbnRmKHN0ZGVyciwgIiUlZGkiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0JQOiAgZnByaW50ZihzdGRlcnIsICIlJWJwIik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19GTDogIGZwcmludGYoc3RkZXJyLCAiJSVmbCIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfSVA6ICBmcHJpbnRmKHN0ZGVyciwgIiUlaXAiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX1NQOiAgZnByaW50ZihzdGRlcnIsICIlJXNwIik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19DUzogIGZwcmludGYoc3RkZXJyLCAiJSVjcyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRFM6ICBmcHJpbnRmKHN0ZGVyciwgIiUlZHMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0VTOiAgZnByaW50ZihzdGRlcnIsICIlJWVzIik7IGJyZWFrOworICAgICAgICBjYXNlIFJFR19TUzogIGZwcmludGYoc3RkZXJyLCAiJSVzcyIpOyBicmVhazsKKyAgICAgICAgY2FzZSBSRUdfRlM6ICBmcHJpbnRmKHN0ZGVyciwgIiUlZnMiKTsgYnJlYWs7CisgICAgICAgIGNhc2UgUkVHX0dTOiAgZnByaW50ZihzdGRlcnIsICIlJWdzIik7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVCVUdfR2V0UmVnaXN0ZXIKICAqCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zb3VyY2UuYyBiL2RlYnVnZ2VyL3NvdXJjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGQzODYKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJ1Z2dlci9zb3VyY2UuYwpAQCAtMCwwICsxLDQzMyBAQAorLyoKKyAqIEZpbGUgc291cmNlLmMgLSBzb3VyY2UgZmlsZSBoYW5kbGluZyBmb3IgaW50ZXJuYWwgZGVidWdnZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk3LCBFcmljIFlvdW5nZGFsZS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisKKyNpbmNsdWRlICJ3aW4uaCIKKyNpbmNsdWRlICJwZV9pbWFnZS5oIgorI2luY2x1ZGUgInBlZXhlLmgiCisjaW5jbHVkZSAiZGVidWdnZXIuaCIKKyNpbmNsdWRlICJwZWV4ZS5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworc3RydWN0IHNlYXJjaGxpc3QKK3sKKyAgY2hhciAqIHBhdGg7CisgIHN0cnVjdCBzZWFyY2hsaXN0ICogbmV4dDsKK307CisKKworc3RydWN0IG9wZW5fZmlsZWxpc3QKK3sKKyAgY2hhcgkJCSogcGF0aDsKKyAgY2hhcgkJCSogcmVhbF9wYXRoOworICBzdHJ1Y3Qgb3Blbl9maWxlbGlzdCAgKiBuZXh0OworICB1bnNpZ25lZCBpbnQJCSAgc2l6ZTsKKyAgc2lnbmVkIGludAkJICBubGluZXM7CisgIHVuc2lnbmVkIGludAkJKiBsaW5lbGlzdDsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgb3Blbl9maWxlbGlzdCAqIG9maWxlczsKKworc3RhdGljIHN0cnVjdCBzZWFyY2hsaXN0ICogbGlzdGhlYWQ7CitzdGF0aWMgY2hhciBERUJVR19jdXJyZW50X3NvdXJjZWZpbGVbUEFUSF9NQVhdOworc3RhdGljIGludCBERUJVR19zdGFydF9zb3VyY2VsaW5lID0gLTE7CitzdGF0aWMgaW50IERFQlVHX2VuZF9zb3VyY2VsaW5lID0gLTE7CisKK3ZvaWQKK0RFQlVHX1Nob3dEaXIoKQoreworICBzdHJ1Y3Qgc2VhcmNobGlzdCAqIHNsOworCisgIGZwcmludGYoc3RkZXJyLCJTZWFyY2ggbGlzdCA6XG4iKTsKKyAgZm9yKHNsID0gbGlzdGhlYWQ7IHNsOyBzbCA9IHNsLT5uZXh0KQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiXHQlc1xuIiwgc2wtPnBhdGgpOworICAgIH0KKyAgZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCit2b2lkCitERUJVR19BZGRQYXRoKGNvbnN0IGNoYXIgKiBwYXRoKQoreworICBzdHJ1Y3Qgc2VhcmNobGlzdCAqIHNsOworCisgIHNsID0gKHN0cnVjdCBzZWFyY2hsaXN0ICopIHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzZWFyY2hsaXN0KSk7CisgIGlmKCBzbCA9PSBOVUxMICkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNsLT5uZXh0ID0gbGlzdGhlYWQ7CisgIHNsLT5wYXRoID0geHN0cmR1cChwYXRoKTsKKyAgbGlzdGhlYWQgPSBzbDsKK30KKwordm9pZAorREVCVUdfTnVrZVBhdGgoKQoreworICBzdHJ1Y3Qgc2VhcmNobGlzdCAqIHNsOworICBzdHJ1Y3Qgc2VhcmNobGlzdCAqIG54dDsKKworICBmb3Ioc2wgPSBsaXN0aGVhZDsgc2w7IHNsID0gbnh0KQorICAgIHsKKyAgICAgIG54dCA9IHNsLT5uZXh0OworICAgICAgZnJlZShzbC0+cGF0aCk7CisgICAgICBmcmVlKHNsKTsKKyAgICB9CisKKyAgbGlzdGhlYWQgPSBOVUxMOworfQorCitzdGF0aWMKK3ZvaWQKK0RFQlVHX0Rpc3BsYXlTb3VyY2UoY2hhciAqIHNvdXJjZWZpbGUsIGludCBzdGFydCwgaW50IGVuZCkKK3sKKyAgY2hhcgkJCSAgICAgICogYWRkcjsKKyAgY2hhcgkJCSAgICAgICAgYnVmZmVyWzEwMjRdOworICBpbnQJCQkJZmQ7CisgIGludAkJCQlpOworICBzdHJ1Y3Qgb3Blbl9maWxlbGlzdAkgICAgICAqIG9sOworICBpbnQJCQkJbmxpbmVzOworICBjaGFyCQkJICAgICAgKiBwbnQ7CisgIHN0cnVjdCBzZWFyY2hsaXN0CSAgICAgICogc2w7CisgIHN0cnVjdCBzdGF0CQkJc3RhdGJ1ZjsKKyAgaW50CQkJCXN0YXR1czsKKyAgY2hhcgkJCQl0bXBwYXRoW1BBVEhfTUFYXTsKKworICAvKgorICAgKiBGaXJzdCBzZWUgd2hldGhlciB3ZSBoYXZlIHRoZSBmaWxlIG9wZW4gYWxyZWFkeS4gIElmIHNvLCB0aGVuCisgICAqIHVzZSB0aGF0LCBvdGhlcndpc2Ugd2UgaGF2ZSB0byB0cnkgYW5kIG9wZW4gaXQuCisgICAqLworICBmb3Iob2wgPSBvZmlsZXM7IG9sOyBvbCA9IG9sLT5uZXh0KQorICAgIHsKKyAgICAgIGlmKCBzdHJjbXAob2wtPnBhdGgsIHNvdXJjZWZpbGUpID09IDAgKQorCXsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgaWYoIG9sID09IE5VTEwgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBUcnkgYWdhaW4sIHN0cmlwcGluZyB0aGUgcGF0aCBmcm9tIHRoZSBvcGVuZWQgZmlsZS4KKyAgICAgICAqLworICAgICAgZm9yKG9sID0gb2ZpbGVzOyBvbDsgb2wgPSBvbC0+bmV4dCkKKwl7CisJICBwbnQgPSBzdHJyY2hyKG9sLT5wYXRoLCAnLycpOworCSAgaWYoIHBudCAhPSBOVUxMICYmIHN0cmNtcChwbnQgKyAxLCBzb3VyY2VmaWxlKSA9PSAwICkKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgCisgICAgfQorCisgIGlmKCBvbCA9PSBOVUxMICkKKyAgICB7CisgICAgICAvKgorICAgICAgICogU2VlIGlmIHRoaXMgaXMgYSBET1Mgc3R5bGUgbmFtZSBvciBub3QuCisgICAgICAgKi8KKyAgICAgIHBudCA9IHN0cmNocihzb3VyY2VmaWxlLCAnXFwnICk7CisgICAgICBpZiggcG50ID09IE5VTEwgKQorCXsKKwkgIHBudCA9IHN0cmNocihzb3VyY2VmaWxlLCAnLycgKTsKKwkgIGlmKCBwbnQgPT0gTlVMTCApCisJICAgIHsKKwkgICAgICBwbnQgPSBzb3VyY2VmaWxlOworCSAgICB9CisJfQorCisgICAgICAvKgorICAgICAgICogQ3JhcG9sYS4gIFdlIG5lZWQgdG8gdHJ5IGFuZCBvcGVuIHRoZSBmaWxlLgorICAgICAgICovCisgICAgICBzdGF0dXMgPSBzdGF0KHNvdXJjZWZpbGUsICZzdGF0YnVmKTsKKyAgICAgIGlmKCBzdGF0dXMgIT0gLTEgKQorCXsKKwkgIHN0cmNweSh0bXBwYXRoLCBzb3VyY2VmaWxlKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgZm9yKHNsID0gbGlzdGhlYWQ7IHNsOyBzbCA9IHNsLT5uZXh0KQorCSAgICB7CisJICAgICAgc3RyY3B5KHRtcHBhdGgsIHNsLT5wYXRoKTsKKwkgICAgICBpZiggdG1wcGF0aFtzdHJsZW4odG1wcGF0aCktMV0gIT0gJy8nICkKKwkJeworCQkgIHN0cmNhdCh0bXBwYXRoLCAiLyIpOworCQl9CisJICAgICAgLyoKKwkgICAgICAgKiBOb3cgYXBwZW5kIHRoZSBiYXNlIGZpbGUgbmFtZS4KKwkgICAgICAgKi8KKwkgICAgICBzdHJjYXQodG1wcGF0aCwgcG50KTsKKwkgICAgICAKKwkgICAgICBzdGF0dXMgPSBzdGF0KHRtcHBhdGgsICZzdGF0YnVmKTsKKwkgICAgICBpZiggc3RhdHVzICE9IC0xICkKKwkJeworCQkgIGJyZWFrOworCQl9CisJICAgIH0KKwkgIAorCSAgaWYoIHNsID09IE5VTEwgKQorCSAgICB7CisJICAgICAgLyoKKwkgICAgICAgKiBTdGlsbCBjb3VsZG4ndCBmaW5kIGl0LiAgQXNrIHVzZXIgZm9yIHBhdGggdG8gYWRkLgorCSAgICAgICAqLworCSAgICAgIGZwcmludGYoc3RkZXJyLCJFbnRlciBwYXRoIHRvIGZpbGUgJXM6ICIsIHNvdXJjZWZpbGUpOworCSAgICAgIGZnZXRzKHRtcHBhdGgsIHNpemVvZih0bXBwYXRoKSwgc3RkaW4pOworCSAgICAgIAorCSAgICAgIGlmKCB0bXBwYXRoW3N0cmxlbih0bXBwYXRoKS0xXSA9PSAnXG4nICkKKwkJeworCQkgIHRtcHBhdGhbc3RybGVuKHRtcHBhdGgpLTFdID0gJ1wwJzsKKwkJfQorCSAgICAgIAorCSAgICAgIGlmKCB0bXBwYXRoW3N0cmxlbih0bXBwYXRoKS0xXSAhPSAnLycgKQorCQl7CisJCSAgc3RyY2F0KHRtcHBhdGgsICIvIik7CisJCX0KKwkgICAgICAvKgorCSAgICAgICAqIE5vdyBhcHBlbmQgdGhlIGJhc2UgZmlsZSBuYW1lLgorCSAgICAgICAqLworCSAgICAgIHN0cmNhdCh0bXBwYXRoLCBwbnQpOworCSAgICAgIAorCSAgICAgIHN0YXR1cyA9IHN0YXQodG1wcGF0aCwgJnN0YXRidWYpOworCSAgICAgIGlmKCBzdGF0dXMgPT0gLTEgKQorCQl7CisJCSAgLyoKKwkJICAgKiBPSywgSSBndWVzcyB0aGUgdXNlciBkb2Vzbid0IHJlYWxseSB3YW50IHRvIHNlZSBpdAorCQkgICAqIGFmdGVyIGFsbC4KKwkJICAgKi8KKwkJICBvbCA9IChzdHJ1Y3Qgb3Blbl9maWxlbGlzdCAqKSB4bWFsbG9jKHNpemVvZigqb2wpKTsKKwkJICBvbC0+cGF0aCA9IHhzdHJkdXAoc291cmNlZmlsZSk7CisJCSAgb2wtPnJlYWxfcGF0aCA9IE5VTEw7CisJCSAgb2wtPm5leHQgPSBvZmlsZXM7CisJCSAgb2wtPm5saW5lcyA9IDA7CisJCSAgb2wtPmxpbmVsaXN0ID0gTlVMTDsKKwkJICBvZmlsZXMgPSBvbDsKKwkJICBmcHJpbnRmKHN0ZGVyciwiVW5hYmxlIHRvIG9wZW4gZmlsZSAlc1xuIiwgdG1wcGF0aCk7CisJCSAgcmV0dXJuOworCQl9CisJICAgIH0KKwl9CisgICAgICAvKgorICAgICAgICogQ3JlYXRlIGhlYWRlciBmb3IgZmlsZS4KKyAgICAgICAqLworICAgICAgb2wgPSAoc3RydWN0IG9wZW5fZmlsZWxpc3QgKikgeG1hbGxvYyhzaXplb2YoKm9sKSk7CisgICAgICBvbC0+cGF0aCA9IHhzdHJkdXAoc291cmNlZmlsZSk7CisgICAgICBvbC0+cmVhbF9wYXRoID0geHN0cmR1cCh0bXBwYXRoKTsKKyAgICAgIG9sLT5uZXh0ID0gb2ZpbGVzOworICAgICAgb2wtPm5saW5lcyA9IDA7CisgICAgICBvbC0+bGluZWxpc3QgPSBOVUxMOworICAgICAgb2wtPnNpemUgPSBzdGF0YnVmLnN0X3NpemU7CisgICAgICBvZmlsZXMgPSBvbDsKKworICAgICAgLyoKKyAgICAgICAqIE5vdyBvcGVuIGFuZCBtYXAgdGhlIGZpbGUuCisgICAgICAgKi8KKyAgICAgIGZkID0gb3Blbih0bXBwYXRoLCBPX1JET05MWSk7CisgICAgICBpZiggZmQgPT0gLTEgKQorCXsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIGFkZHIgPSBtbWFwKDAsIHN0YXRidWYuc3Rfc2l6ZSwgUFJPVF9SRUFELCBNQVBfUFJJVkFURSwgZmQsIDApOworICAgICAgaWYoIGFkZHIgPT0gKGNoYXIgKikgLTEgKQorCXsKKwkgIHJldHVybjsKKwl9CisKKyAgICAgIC8qCisgICAgICAgKiBOb3cgYnVpbGQgdXAgdGhlIGxpbmUgbnVtYmVyIG1hcHBpbmcgdGFibGUuCisgICAgICAgKi8KKyAgICAgIG9sLT5ubGluZXMgPSAxOworICAgICAgcG50ID0gYWRkcjsKKyAgICAgIHdoaWxlKHBudCA8IGFkZHIgKyBvbC0+c2l6ZSApCisJeworCSAgaWYoICpwbnQrKyA9PSAnXG4nICkKKwkgICAgeworCSAgICAgIG9sLT5ubGluZXMrKzsKKwkgICAgfQorCX0KKworICAgICAgb2wtPm5saW5lcysrOworICAgICAgb2wtPmxpbmVsaXN0ID0gKHVuc2lnbmVkIGludCopIHhtYWxsb2Mob2wtPm5saW5lcyAqIHNpemVvZih1bnNpZ25lZCBpbnQpICk7CisKKyAgICAgIG5saW5lcyA9IDA7CisgICAgICBwbnQgPSBhZGRyOworICAgICAgb2wtPmxpbmVsaXN0W25saW5lcysrXSA9IDA7CisgICAgICB3aGlsZShwbnQgPCBhZGRyICsgb2wtPnNpemUgKQorCXsKKwkgIGlmKCAqcG50KysgPT0gJ1xuJyApCisJICAgIHsKKwkgICAgICBvbC0+bGluZWxpc3RbbmxpbmVzKytdID0gcG50IC0gYWRkcjsKKwkgICAgfQorCX0KKyAgICAgIG9sLT5saW5lbGlzdFtubGluZXMrK10gPSBwbnQgLSBhZGRyOworCisgICAgfQorICBlbHNlCisgICAgeworICAgICAgLyoKKyAgICAgICAqIFdlIGtub3cgd2hhdCB0aGUgZmlsZSBpcywgd2UganVzdCBuZWVkIHRvIHJlb3BlbiBpdCBhbmQgcmVtYXAgaXQuCisgICAgICAgKi8KKyAgICAgIGZkID0gb3BlbihvbC0+cmVhbF9wYXRoLCBPX1JET05MWSk7CisgICAgICBpZiggZmQgPT0gLTEgKQorCXsKKwkgIHJldHVybjsKKwl9CisgICAgICAKKyAgICAgIGFkZHIgPSBtbWFwKDAsIG9sLT5zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisgICAgICBpZiggYWRkciA9PSAoY2hhciAqKSAtMSApCisJeworCSAgcmV0dXJuOworCX0KKyAgICB9CisgIAorICAvKgorICAgKiBBbGwgd2UgbmVlZCB0byBkbyBpcyB0byBkaXNwbGF5IHRoZSBzb3VyY2UgbGluZXMgaGVyZS4KKyAgICovCisgIGZvcihpPXN0YXJ0IC0gMTsgaSA8PSBlbmQgLSAxOyBpKyspCisgICAgeworICAgICAgaWYoIGkgPCAwIHx8IGkgPj0gb2wtPm5saW5lcyAtIDEpCisJeworCSAgY29udGludWU7CisJfQorCisgICAgICBtZW1zZXQoJmJ1ZmZlciwgMCwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgaWYoIG9sLT5saW5lbGlzdFtpKzFdICE9IG9sLT5saW5lbGlzdFtpXSApCisJeworCSAgbWVtY3B5KCZidWZmZXIsIGFkZHIgKyBvbC0+bGluZWxpc3RbaV0sIAorCQkgKG9sLT5saW5lbGlzdFtpKzFdIC0gb2wtPmxpbmVsaXN0W2ldKSAtIDEpOworCX0KKyAgICAgIGZwcmludGYoc3RkZXJyLCIlZFx0JXNcbiIsIGkgKyAxLCAgYnVmZmVyKTsKKyAgICB9CisKKyAgbXVubWFwKGFkZHIsIG9sLT5zaXplKTsKKyAgY2xvc2UoZmQpOworCit9CisKK3ZvaWQKK0RFQlVHX0xpc3Qoc3RydWN0IGxpc3RfaWQgKiBzb3VyY2UxLCBzdHJ1Y3QgbGlzdF9pZCAqIHNvdXJjZTIsCisJCQkgaW50IGRlbHRhKQoreworICBpbnQgICAgZW5kOworICBpbnQgICAgc3RhcnQ7CisgIGNoYXIgKiBzb3VyY2VmaWxlOworCisgIC8qCisgICAqIFdlIG5lZWQgdG8gc2VlIHdoYXQgc291cmNlIGZpbGUgd2UgbmVlZC4gIEhvcGVmdWxseSB3ZSBvbmx5IGhhdmUKKyAgICogb25lIHNwZWNpZmllZCwgb3RoZXJ3aXNlIHdlIG1pZ2h0IGFzIHdlbGwgcHVudC4KKyAgICovCisgIGlmKCBzb3VyY2UxICE9IE5VTEwgCisgICAgICAmJiBzb3VyY2UyICE9IE5VTEwgCisgICAgICAmJiBzb3VyY2UxLT5zb3VyY2VmaWxlICE9IE5VTEwKKyAgICAgICYmIHNvdXJjZTItPnNvdXJjZWZpbGUgIT0gTlVMTCAKKyAgICAgICYmIHN0cmNtcChzb3VyY2UxLT5zb3VyY2VmaWxlLCBzb3VyY2UyLT5zb3VyY2VmaWxlKSAhPSAwICkKKyAgICB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIkFtYmlndW91cyBzb3VyY2UgZmlsZSBzcGVjaWZpY2F0aW9uLlxuIik7CisgICAgICByZXR1cm47CisgICAgfQorCisgIHNvdXJjZWZpbGUgPSBOVUxMOworICBpZiggc291cmNlMSAhPSBOVUxMICYmIHNvdXJjZTEtPnNvdXJjZWZpbGUgIT0gTlVMTCApCisgICAgeworICAgICAgc291cmNlZmlsZSA9IHNvdXJjZTEtPnNvdXJjZWZpbGU7CisgICAgfQorCisgIGlmKCBzb3VyY2VmaWxlID09IE5VTEwgCisgICAgICAmJiBzb3VyY2UyICE9IE5VTEwgCisgICAgICAmJiBzb3VyY2UyLT5zb3VyY2VmaWxlICE9IE5VTEwgKQorICAgIHsKKyAgICAgIHNvdXJjZWZpbGUgPSBzb3VyY2UyLT5zb3VyY2VmaWxlOworICAgIH0KKworICBpZiggc291cmNlZmlsZSA9PSBOVUxMICkKKyAgICB7CisgICAgICBzb3VyY2VmaWxlID0gKGNoYXIgKikgJkRFQlVHX2N1cnJlbnRfc291cmNlZmlsZTsKKyAgICB9CisKKyAgaWYoIHNvdXJjZWZpbGUgPT0gTlVMTCApCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJObyBzb3VyY2UgZmlsZSBzcGVjaWZpZWQuXG4iKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgLyoKKyAgICogTm93IGZpZ3VyZSBvdXQgdGhlIGxpbmUgbnVtYmVyIHJhbmdlIHRvIGJlIGxpc3RlZC4KKyAgICovCisgIHN0YXJ0ID0gLTE7CisgIGVuZCA9IC0xOworCisgIGlmKCBzb3VyY2UxICE9IE5VTEwgKQorICAgIHsKKyAgICAgIHN0YXJ0ID0gc291cmNlMS0+bGluZTsKKyAgICB9CisKKyAgaWYoIHNvdXJjZTIgIT0gTlVMTCApCisgICAgeworICAgICAgZW5kID0gc291cmNlMi0+bGluZTsKKyAgICB9CisKKyAgaWYoIHN0YXJ0ID09IC0xICYmIGVuZCA9PSAtMSApCisgICAgeworICAgICAgaWYoIGRlbHRhIDwgMCApCisJeworCSAgZW5kID0gREVCVUdfc3RhcnRfc291cmNlbGluZTsKKwkgIHN0YXJ0ID0gZW5kICsgZGVsdGE7CisJfQorICAgICAgZWxzZQorCXsKKwkgIHN0YXJ0ID0gREVCVUdfZW5kX3NvdXJjZWxpbmU7CisJICBlbmQgPSBzdGFydCArIGRlbHRhOworCX0KKyAgICB9CisgIGVsc2UgaWYoIHN0YXJ0ID09IC0xICkKKyAgICB7CisgICAgICBzdGFydCA9IGVuZCArIGRlbHRhOworICAgIH0KKyAgZWxzZSBpZiAoZW5kID09IC0xKQorICAgIHsKKyAgICAgIGVuZCA9IHN0YXJ0ICsgZGVsdGE7CisgICAgfQorCisgIC8qCisgICAqIE5vdyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gZG8gdGhlIGRpcnR5IHdvcmsuCisgICAqLworICBERUJVR19EaXNwbGF5U291cmNlKHNvdXJjZWZpbGUsIHN0YXJ0LCBlbmQpOworCisgIGlmKCBzb3VyY2VmaWxlICE9IChjaGFyICopICZERUJVR19jdXJyZW50X3NvdXJjZWZpbGUgKQorICAgIHsKKyAgICAgIHN0cmNweShERUJVR19jdXJyZW50X3NvdXJjZWZpbGUsIHNvdXJjZWZpbGUpOworICAgIH0KKyAgREVCVUdfc3RhcnRfc291cmNlbGluZSA9IHN0YXJ0OworICBERUJVR19lbmRfc291cmNlbGluZSA9IGVuZDsKK30KKworCisKKyNpZiAwCittYWluKCkKK3sKKyAgaW50IGksIGo7CisgIERFQlVHX0FkZFBhdGgoIi4uLy4uL2RlIik7CisgIHdoaWxlKDE9PTEpCisgICAgeworICAgICAgZnNjYW5mKHN0ZGluLCIlZCAlZCIsICZpLCAmaik7CisgICAgICBERUJVR19EaXNwbGF5U291cmNlKCJkdW1wZXhlLmMiLCBpLCBqKTsKKyAgICB9CisgIHJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9zdGFicy5jIGIvZGVidWdnZXIvc3RhYnMuYwppbmRleCAyMTZmZjRkLi4wYzFkZGYxIDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9zdGFicy5jCisrKyBiL2RlYnVnZ2VyL3N0YWJzLmMKQEAgLTQsMjIgKzQsMzQgQEAKICAqIENvcHlyaWdodCAoQykgMTk5NiwgRXJpYyBZb3VuZ2RhbGUuCiAgKi8KIAotI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJkZWJ1Z2dlci5oIgorI2luY2x1ZGUgInhtYWxsb2MuaCIKKworI2lmZGVmIF9fc3ZyNF9fCisjZGVmaW5lIF9fRUxGX18KKyNlbmRpZgogCiAjaWZkZWYgX19FTEZfXwogI2luY2x1ZGUgPGVsZi5oPgorI2luY2x1ZGUgPGxpbmsuaD4KKyNlbHNlCisjaW5jbHVkZSA8YS5vdXQuaD4KICNlbmRpZgogCisjaWZuZGVmIE5fVU5ERgogI2RlZmluZSBOX1VOREYJCTB4MDAKKyNlbmRpZgorCiAjZGVmaW5lIE5fR1NZTQkJMHgyMAogI2RlZmluZSBOX0ZVTgkJMHgyNAogI2RlZmluZSBOX1NUU1lNCQkweDI2CkBAIC00MCw2ICs1MiwxMyBAQAogCiAKIC8qCisgKiBUaGlzIGlzIGhvdyB3ZSB0cmFuc2xhdGUgc3RhYiB0eXBlcyBpbnRvIG91ciBpbnRlcm5hbCByZXByZXNlbnRhdGlvbnMKKyAqIG9mIGRhdGF0eXBlcy4KKyAqLworc3RhdGljIHN0cnVjdCBkYXRhdHlwZSAqKiBzdGFiX3R5cGVzID0gTlVMTDsKK3N0YXRpYyBpbnQgbnVtX3N0YWJfdHlwZXMgPSAwOworCisvKgogICogU2V0IHNvIHRoYXQgd2Uga25vdyB0aGUgbWFpbiBleGVjdXRhYmxlIG5hbWUgYW5kIHBhdGguCiAgKi8KIGNoYXIgKiBERUJVR19hcmd2MDsKQEAgLTU2LDQ0ICs3NSwzOTQgQEAKICAgdW5zaWduZWQgbG9uZyBuX3ZhbHVlOwogfTsKIAotI2lmZGVmIF9fRUxGX18KLQotaW50Ci1ERUJVR19QYXJzZVN0YWJzKGNoYXIgKiBhZGRyLCBFbGYzMl9TaGRyICogc3RhYnNlY3QsIEVsZjMyX1NoZHIgKiBzdGFic3RyKQorc3RhdGljIHZvaWQgc3RhYl9zdHJjcHkoY2hhciAqIGRlc3QsIGNvbnN0IGNoYXIgKiBzb3VyY2UpCiB7Ci0gIGludCBpOwotICBpbnQgaWdub3JlID0gRkFMU0U7Ci0gIGludCBuc3RhYjsKLSAgc3RydWN0IHN0YWJfbmxpc3QgKiBzdGFiX3B0cjsKLSAgY2hhciAqIHN0cnM7Ci0gIGNoYXIgKiBwdHI7Ci0gIGNoYXIgKiB4cHRyOwotICBjaGFyIGN1cnJwYXRoW1BBVEhfTUFYXTsKLSAgY2hhciBzeW1uYW1lWzQwOTZdOwotICBjaGFyICogc3VicGF0aCA9IE5VTEw7Ci0gIERCR19BRERSICAgICBuZXdfYWRkcjsKLSAgc3RydWN0IG5hbWVfaGFzaCAqIGN1cnJfZnVuYyA9IE5VTEw7Ci0gIGludCBzdHJ0YWJpbmM7CisgIC8qCisgICAqIEEgc3RyY3B5IHJvdXRpbmUgdGhhdCBzdG9wcyB3aGVuIHdlIGhpdCB0aGUgJzonIGNoYXJhY3Rlci4KKyAgICogRmFzdGVyIHRoYW4gY29weWluZyB0aGUgd2hvbGUgdGhpbmcsIGFuZCB0aGVuIG51a2luZyB0aGUKKyAgICogJzonLgorICAgKi8KKyAgd2hpbGUoKnNvdXJjZSAhPSAnXDAnICYmICpzb3VyY2UgIT0gJzonKQorICAgIHsKKyAgICAgICpkZXN0KysgPSAqc291cmNlKys7CisgICAgfQorICAqZGVzdCsrID0gJ1wwJzsKK30KIAotICBuc3RhYiA9IHN0YWJzZWN0LT5zaF9zaXplIC8gc2l6ZW9mKHN0cnVjdCBzdGFiX25saXN0KTsKLSAgc3RhYl9wdHIgPSAoc3RydWN0IHN0YWJfbmxpc3QgKikgKGFkZHIgKyBzdGFic2VjdC0+c2hfb2Zmc2V0KTsKLSAgc3RycyAgPSAoY2hhciAqKSAoYWRkciArIHN0YWJzdHItPnNoX29mZnNldCk7CisKK3N0YXRpYyAKK2ludAorREVCVUdfUGFyc2VUeXBlZGVmU3RhYihjaGFyICogcHRyLCBjb25zdCBjaGFyICogdHlwZW5hbWUpCit7CisgIGludAkJICAgIGFycm1heDsKKyAgaW50CQkgICAgYXJybWluOworICBjaGFyICogYzsKKyAgc3RydWN0IGRhdGF0eXBlICogY3Vycl90eXBlOworICBzdHJ1Y3QgZGF0YXR5cGUgKiBkYXRhdHlwZTsKKyAgY2hhcgkgICAgICAgICAgICBlbGVtZW50X25hbWVbMTAyNF07CisgIGludAkJICAgIG9mZnNldDsKKyAgaW50CQkgICAgcnRuID0gRkFMU0U7CisgIGludAkJICAgIHNpemU7CisgIGNoYXIJCSAgKiB0YzsKKyAgY2hhcgkJICAqIHRjMjsKKyAgaW50CQkgICAgdHlwZW51bTsKKworICAvKgorICAgKiBHbyBmcm9tIGJhY2sgdG8gZnJvbnQuICBGaXJzdCB3ZSBnbyB0aHJvdWdoIGFuZCBmaWd1cmUgb3V0IHdoYXQgdHlwZSBudW1iZXJzCisgICAqIHdlIG5lZWQsIGFuZCByZWdpc3RlciB0aG9zZSB0eXBlcy4gIFRoZW4gd2UgZ28gaW4gYW5kIGZpbGwgdGhlIGRldGFpbHMuCisgICAqLworICBmb3IoIGMgPSBzdHJjaHIocHRyLCAnPScpOyBjICE9IE5VTEw7IGMgPSBzdHJjaHIoYyArIDEsICc9JykgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBCYWNrIHVwIHVudGlsIHdlIGdldCB0byBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4gIFRoaXMgaXMgdGhlIHR5cGUKKyAgICAgICAqIG51bWJlci4KKyAgICAgICAqLworICAgICAgdGMgPSBjIC0gMTsKKyAgICAgIHdoaWxlKCAqdGMgPj0gJzAnICYmICp0YyA8PSAnOScgKQorCXsKKwkgIHRjLS07CisJfQorICAgICAgdHlwZW51bSA9IGF0b2wodGMgKyAxKTsKKyAgICAgIGlmKCBudW1fc3RhYl90eXBlcyA8PSB0eXBlbnVtICkKKwl7CisJICBudW1fc3RhYl90eXBlcyA9IHR5cGVudW0gKyAzMjsKKwkgIHN0YWJfdHlwZXMgPSAoc3RydWN0IGRhdGF0eXBlICoqKSB4cmVhbGxvYyhzdGFiX3R5cGVzLCAKKwkJCQkJCSAgICAgbnVtX3N0YWJfdHlwZXMgKiBzaXplb2Yoc3RydWN0IGRhdGF0eXBlICopKTsKKwkgIGlmKCBzdGFiX3R5cGVzID09IE5VTEwgKQorCSAgICB7CisJICAgICAgZ290byBsZWF2ZTsKKwkgICAgfQorCX0KKworICAgICAgc3dpdGNoKGNbMV0pCisJeworCWNhc2UgJyonOgorCSAgc3RhYl90eXBlc1t0eXBlbnVtXSA9IERFQlVHX05ld0RhdGFUeXBlKFBPSU5URVIsIE5VTEwpOworCSAgYnJlYWs7CisJY2FzZSAncyc6CisJY2FzZSAndSc6CisJICBzdGFiX3R5cGVzW3R5cGVudW1dID0gREVCVUdfTmV3RGF0YVR5cGUoU1RSVUNULCB0eXBlbmFtZSk7CisJICBicmVhazsKKwljYXNlICdhJzoKKwkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShBUlJBWSwgTlVMTCk7CisJICBicmVhazsKKwljYXNlICcxJzoKKwljYXNlICdyJzoKKwkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShCQVNJQywgdHlwZW5hbWUpOworCSAgYnJlYWs7CisJY2FzZSAneCc6CisJICBzdGFiX3N0cmNweShlbGVtZW50X25hbWUsIGMgKyAzKTsKKwkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShTVFJVQ1QsIGVsZW1lbnRfbmFtZSk7CisJICBicmVhazsKKwljYXNlICdlJzoKKwkgIHN0YWJfdHlwZXNbdHlwZW51bV0gPSBERUJVR19OZXdEYXRhVHlwZShFTlVNLCBOVUxMKTsKKwkgIGJyZWFrOworCWNhc2UgJ2YnOgorCSAgc3RhYl90eXBlc1t0eXBlbnVtXSA9IERFQlVHX05ld0RhdGFUeXBlKEZVTkMsIE5VTEwpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIGZwcmludGYoc3RkZXJyLCAiVW5rbm93biB0eXBlLlxuIik7CisJfQorICAgICAgdHlwZW5hbWUgPSBOVUxMOworICAgIH0KKworICAgICAvKgorICAgICAgKiBPSywgbm93IHRha2UgYSBzZWNvbmQgc3dlZXAgdGhyb3VnaC4gIE5vdyB3ZSB3aWxsIGJlIGRpZ2dpbmcgb3V0IHRoZSBkZWZpbml0aW9ucworICAgICAgKiBvZiB0aGUgdmFyaW91cyBjb21wb25lbnRzLCBhbmQgc3RvcmluZyB0aGVtIGluIHRoZSBza2VsZXRvbnMgdGhhdCB3ZSBoYXZlIGFscmVhZHkKKyAgICAgICogYWxsb2NhdGVkLiAgV2UgdGFrZSBhIHJpZ2h0LXRvIGxlZnQgc2VhcmNoIGFzIHRoaXMgaXMgbXVjaCBlYXNpZXIgdG8gcGFyc2UuCisgICAgICAqLworICBmb3IoIGMgPSBzdHJyY2hyKHB0ciwgJz0nKTsgYyAhPSBOVUxMOyBjID0gc3RycmNocihwdHIsICc9JykgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBCYWNrIHVwIHVudGlsIHdlIGdldCB0byBhIG5vbi1udW1lcmljIGNoYXJhY3Rlci4gIFRoaXMgaXMgdGhlIHR5cGUKKyAgICAgICAqIG51bWJlci4KKyAgICAgICAqLworICAgICAgdGMgPSBjIC0gMTsKKyAgICAgIHdoaWxlKCAqdGMgPj0gJzAnICYmICp0YyA8PSAnOScgKQorCXsKKwkgIHRjLS07CisJfQorICAgICAgdHlwZW51bSA9IGF0b2wodGMgKyAxKTsKKyAgICAgIGN1cnJfdHlwZSA9IHN0YWJfdHlwZXNbdHlwZW51bV07CisKKyAgICAgIHN3aXRjaChjWzFdKQorCXsKKwljYXNlICd4JzoKKwkgIHRjID0gYyArIDM7CisJICB3aGlsZSggKnRjICE9ICc6JyApCisJICAgIHsKKwkgICAgICB0YyArKzsKKwkgICAgfQorCSAgdGMrKzsKKwkgIGlmKCAqdGMgPT0gJ1wwJyApCisJICAgIHsKKwkgICAgICAqYyA9ICdcMCc7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cmNweShjLCB0Yyk7CisJICAgIH0KKworCSAgYnJlYWs7CisJY2FzZSAnKic6CisJY2FzZSAnZic6CisJICB0YyA9IGMgKyAyOworCSAgZGF0YXR5cGUgPSBzdGFiX3R5cGVzW3N0cnRvbCh0YywgJnRjLCAxMCldOworCSAgREVCVUdfU2V0UG9pbnRlclR5cGUoY3Vycl90eXBlLCBkYXRhdHlwZSk7CisJICBpZiggKnRjID09ICdcMCcgKQorCSAgICB7CisJICAgICAgKmMgPSAnXDAnOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJjcHkoYywgdGMpOworCSAgICB9CisJICBicmVhazsKKwljYXNlICcxJzoKKwljYXNlICdyJzoKKwkgIC8qCisJICAgKiBXZSBoYXZlIGFscmVhZHkgaGFuZGxlZCB0aGVzZSBhYm92ZS4KKwkgICAqLworCSAgKmMgPSAnXDAnOworCSAgYnJlYWs7CisJY2FzZSAnYSc6CisJICB0YyAgPSBjICsgNTsKKyAJICBhcnJtaW4gPSBzdHJ0b2wodGMsICZ0YywgMTApOworCSAgdGMrKzsKKyAJICBhcnJtYXggPSBzdHJ0b2wodGMsICZ0YywgMTApOworCSAgdGMrKzsKKwkgIGRhdGF0eXBlID0gc3RhYl90eXBlc1tzdHJ0b2wodGMsICZ0YywgMTApXTsKKwkgIGlmKCAqdGMgPT0gJ1wwJyApCisJICAgIHsKKwkgICAgICAqYyA9ICdcMCc7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cmNweShjLCB0Yyk7CisJICAgIH0KKwkgIAorCSAgREVCVUdfU2V0QXJyYXlQYXJhbXMoY3Vycl90eXBlLCBhcnJtaW4sIGFycm1heCwgZGF0YXR5cGUpOworCSAgYnJlYWs7CisJY2FzZSAncyc6CisJY2FzZSAndSc6CisJICB0YyA9IGMgKyAyOworCSAgREVCVUdfU2V0U3RydWN0U2l6ZShjdXJyX3R5cGUsIHN0cnRvbCh0YywgJnRjLCAxMCkpOworCSAgLyoKKwkgICAqIE5vdyBwYXJzZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlL3VuaW9uLgorCSAgICovCisJICB3aGlsZSgqdGMgIT0gJzsnKQorCSAgICB7CisJICAgICAgdGMyID0gZWxlbWVudF9uYW1lOworCSAgICAgIHdoaWxlKCp0YyAhPSAnOicpCisJCXsKKwkJICAqdGMyKysgPSAqdGMrKzsKKwkJfQorCSAgICAgIHRjKys7CisJICAgICAgKnRjMisrID0gJ1wwJzsKKwkgICAgICBkYXRhdHlwZSA9IHN0YWJfdHlwZXNbc3RydG9sKHRjLCAmdGMsIDEwKV07CisJICAgICAgdGMrKzsKKwkgICAgICBvZmZzZXQgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkgICAgICB0YysrOworCSAgICAgIHNpemUgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkgICAgICB0YysrOworCSAgICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIGRhdGF0eXBlLCBvZmZzZXQsIHNpemUpOworCSAgICB9CisJICBpZiggKnRjID09ICdcMCcgKQorCSAgICB7CisJICAgICAgKmMgPSAnXDAnOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdHJjcHkoYywgdGMgKyAxKTsKKwkgICAgfQorCSAgYnJlYWs7CisJY2FzZSAnZSc6CisJICB0YyA9IGMgKyAyOworCSAgLyoKKwkgICAqIE5vdyBwYXJzZSB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgc3RydWN0dXJlL3VuaW9uLgorCSAgICovCisJICB3aGlsZSgqdGMgIT0gJzsnKQorCSAgICB7CisJICAgICAgdGMyID0gZWxlbWVudF9uYW1lOworCSAgICAgIHdoaWxlKCp0YyAhPSAnOicpCisJCXsKKwkJICAqdGMyKysgPSAqdGMrKzsKKwkJfQorCSAgICAgIHRjKys7CisJICAgICAgKnRjMisrID0gJ1wwJzsKKwkgICAgICBvZmZzZXQgID0gc3RydG9sKHRjLCAmdGMsIDEwKTsKKwkgICAgICB0YysrOworCSAgICAgIERFQlVHX0FkZFN0cnVjdEVsZW1lbnQoY3Vycl90eXBlLCBlbGVtZW50X25hbWUsIE5VTEwsIG9mZnNldCwgMCk7CisJICAgIH0KKwkgIGlmKCAqdGMgPT0gJ1wwJyApCisJICAgIHsKKwkgICAgICAqYyA9ICdcMCc7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIHN0cmNweShjLCB0YyArIDEpOworCSAgICB9CisJICBicmVhazsKKwlkZWZhdWx0OgorCSAgZnByaW50ZihzdGRlcnIsICJVbmtub3duIHR5cGUuXG4iKTsKKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcnRuID0gVFJVRTsKKworbGVhdmU6CisKKyAgcmV0dXJuIHJ0bjsKKworfQorCitzdGF0aWMgc3RydWN0IGRhdGF0eXBlICoKK0RFQlVHX1BhcnNlU3RhYlR5cGUoY29uc3QgY2hhciAqIHN0YWIpCit7CisgIGNoYXIgKiBjOworICBpbnQgICAgdHlwZW51bTsKKworICAvKgorICAgKiBMb29rIHRocm91Z2ggdGhlIHN0YWIgZGVmaW5pdGlvbiwgYW5kIGZpZ3VyZSBvdXQgd2hhdCBkYXRhdHlwZQorICAgKiB0aGlzIHJlcHJlc2VudHMuICBJZiB3ZSBoYXZlIHNvbWV0aGluZyB3ZSBrbm93IGFib3V0LCBhc3NpZ24gdGhlCisgICAqIHR5cGUuCisgICAqLworICBjID0gc3RyY2hyKHN0YWIsICc6Jyk7CisgIGlmKCBjID09IE5VTEwgKQorICAgIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICBjKys7CisgIC8qCisgICAqIFRoZSBuZXh0IGNoYXJhY3RlciBzYXlzIG1vcmUgYWJvdXQgdGhlIHR5cGUgKGkuZS4gZGF0YSwgZnVuY3Rpb24sIGV0YykKKyAgICogb2Ygc3ltYm9sLiAgU2tpcCBpdC4KKyAgICovCisgIGMrKzsKKworICB0eXBlbnVtID0gYXRvbChjKTsKKworICBpZiggdHlwZW51bSA8IG51bV9zdGFiX3R5cGVzICYmIHN0YWJfdHlwZXNbdHlwZW51bV0gIT0gTlVMTCApCisgICAgeworICAgICAgcmV0dXJuIHN0YWJfdHlwZXNbdHlwZW51bV07CisgICAgfQorCisgIHJldHVybiBOVUxMOworfQorCitzdGF0aWMgCitpbnQKK0RFQlVHX1BhcnNlU3RhYnMoY2hhciAqIGFkZHIsIHVuc2lnbmVkIGludCBsb2FkX29mZnNldCwKKwkJIHVuc2lnbmVkIGludCBzdGFib2ZmLCBpbnQgc3RhYmxlbiwgCisJCSB1bnNpZ25lZCBpbnQgc3RydGFib2ZmLCBpbnQgc3RydGFibGVuKQoreworICBzdHJ1Y3QgbmFtZV9oYXNoICAgICogY3Vycl9mdW5jID0gTlVMTDsKKyAgc3RydWN0IHdpbmVfbG9jYWxzICAqIGN1cnJfbG9jID0gTlVMTDsKKyAgc3RydWN0IG5hbWVfaGFzaCAgICAqIGN1cnJfc3ltID0gTlVMTDsKKyAgY2hhcgkJCWN1cnJwYXRoW1BBVEhfTUFYXTsKKyAgaW50CQkJaTsKKyAgaW50CQkJaWdub3JlID0gRkFMU0U7CisgIGludAkJCWxhc3RfbnNvID0gLTE7CisgIGludAkJCWxlbjsKKyAgREJHX0FERFIJCW5ld19hZGRyOworICBpbnQJCQluc3RhYjsKKyAgY2hhcgkJICAgICAgKiBwdHI7CisgIGNoYXIJCSAgICAgICogc3RhYmJ1ZmY7CisgIGludAkJCXN0YWJidWZmbGVuOworICBzdHJ1Y3Qgc3RhYl9ubGlzdCAgICogc3RhYl9wdHI7CisgIGNoYXIJCSAgICAgICogc3RyczsKKyAgaW50CQkJc3RydGFiaW5jOworICBjaGFyCQkgICAgICAqIHN1YnBhdGggPSBOVUxMOworICBjaGFyCQkJc3ltbmFtZVs0MDk2XTsKKworICBuc3RhYiA9IHN0YWJsZW4gLyBzaXplb2Yoc3RydWN0IHN0YWJfbmxpc3QpOworICBzdGFiX3B0ciA9IChzdHJ1Y3Qgc3RhYl9ubGlzdCAqKSAoYWRkciArIHN0YWJvZmYpOworICBzdHJzICA9IChjaGFyICopIChhZGRyICsgc3RydGFib2ZmKTsKIAogICBtZW1zZXQoY3VycnBhdGgsIDAsIHNpemVvZihjdXJycGF0aCkpOwogCisgIC8qCisgICAqIEFsbG9jYXRlIGEgYnVmZmVyIGludG8gd2hpY2ggd2UgY2FuIGJ1aWxkIHN0YWIgc3RyaW5ncyBmb3IgY2FzZXMKKyAgICogd2hlcmUgdGhlIHN0YWIgaXMgY29udGludWVkIG92ZXIgbXVsdGlwbGUgbGluZXMuCisgICAqLworICBzdGFiYnVmZmxlbiA9IDY1NTM2OworICBzdGFiYnVmZiA9IChjaGFyICopIHhtYWxsb2Moc3RhYmJ1ZmZsZW4pOworICBpZiggc3RhYmJ1ZmYgPT0gTlVMTCApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKICAgc3RydGFiaW5jID0gMDsKKyAgc3RhYmJ1ZmZbMF0gPSAnXDAnOwogICBmb3IoaT0wOyBpIDwgbnN0YWI7IGkrKywgc3RhYl9wdHIrKyApCiAgICAgewogICAgICAgcHRyID0gc3RycyArICh1bnNpZ25lZCBpbnQpIHN0YWJfcHRyLT5uX3VuLm5fbmFtZTsKKyAgICAgIGlmKCBwdHJbc3RybGVuKHB0cikgLSAxXSA9PSAnXFwnICkKKwl7CisJICAvKgorCSAgICogSW5kaWNhdGVzIGNvbnRpbnVhdGlvbi4gIEFwcGVuZCB0aGlzIHRvIHRoZSBidWZmZXIsIGFuZCBnbyBvbnRvIHRoZQorCSAgICogbmV4dCByZWNvcmQuICBSZXBlYXQgdGhlIHByb2Nlc3MgdW50aWwgd2UgZmluZCBhIHN0YWIgd2l0aG91dCB0aGUKKwkgICAqICcvJyBjaGFyYWN0ZXIsIGFzIHRoaXMgaW5kaWNhdGVzIHdlIGhhdmUgdGhlIHdob2xlIHRoaW5nLgorCSAgICovCisJICBsZW4gPSBzdHJsZW4ocHRyKTsKKwkgIGlmKCBzdHJsZW4oc3RhYmJ1ZmYpICsgbGVuID4gc3RhYmJ1ZmZsZW4gKQorCSAgICB7CisJICAgICAgc3RhYmJ1ZmZsZW4gKz0gNjU1MzY7CisJICAgICAgc3RhYmJ1ZmYgPSAoY2hhciAqKSB4cmVhbGxvYyhzdGFiYnVmZiwgc3RhYmJ1ZmZsZW4pOworCSAgICAgIGlmKCBzdGFiYnVmZiA9PSBOVUxMICkKKwkJeworCQkgIGdvdG8gbGVhdmU7CisJCX0KKwkgICAgfQorCSAgc3RybmNhdChzdGFiYnVmZiwgcHRyLCBsZW4gLSAxKTsKKwkgIGNvbnRpbnVlOworCX0KKyAgICAgIGVsc2UgaWYoIHN0YWJidWZmWzBdICE9ICdcMCcgKQorCXsKKwkgIHN0cmNhdCggc3RhYmJ1ZmYsIHB0cik7CisJICBwdHIgPSBzdGFiYnVmZjsKKwl9CisKKyAgICAgIGlmKCBzdHJjaHIocHRyLCAnPScpICE9IE5VTEwgKQorCXsKKwkgIC8qCisJICAgKiBUaGUgc3RhYnMgYXJlbid0IGluIHdyaXRhYmxlIG1lbW9yeSwgc28gY29weSBpdCBvdmVyIHNvIHdlIGFyZQorCSAgICogc3VyZSB3ZSBjYW4gc2NyaWJibGUgb24gaXQuCisJICAgKi8KKwkgIGlmKCBwdHIgIT0gc3RhYmJ1ZmYgKQorCSAgICB7CisJICAgICAgc3RyY3B5KHN0YWJidWZmLCBwdHIpOworCSAgICAgIHB0ciA9IHN0YWJidWZmOworCSAgICB9CisJICBzdGFiX3N0cmNweShzeW1uYW1lLCBwdHIpOworCSAgREVCVUdfUGFyc2VUeXBlZGVmU3RhYihwdHIsIHN5bW5hbWUpOworCX0KKwogICAgICAgc3dpdGNoKHN0YWJfcHRyLT5uX3R5cGUpCiAJewogCWNhc2UgTl9HU1lNOgogCSAgLyoKLQkgICAqIFRoZXNlIGFyZSB1c2VsZXNzLiAgVGhleSBoYXZlIG5vIHZhbHVlLCBhbmQgeW91IGhhdmUgdG8KKwkgICAqIFRoZXNlIGFyZSB1c2VsZXNzIHdpdGggRUxGLiAgVGhleSBoYXZlIG5vIHZhbHVlLCBhbmQgeW91IGhhdmUgdG8KIAkgICAqIHJlYWQgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUgdG8gZ2V0IHRoZSBhZGRyZXNzLiAgVGh1cyB3ZQogCSAgICogaWdub3JlIHRoZW0sIGFuZCB3aGVuIHdlIHByb2Nlc3MgdGhlIG5vcm1hbCBzeW1ib2wgdGFibGUKIAkgICAqIHdlIHNob3VsZCBkbyB0aGUgcmlnaHQgdGhpbmcuCisJICAgKgorCSAgICogV2l0aCBhLm91dCwgdGhleSBhY3R1YWxseSBkbyBtYWtlIHNvbWUgYW1vdW50IG9mIHNlbnNlLgogCSAgICovCisJICBuZXdfYWRkci5zZWcgPSAwOworCSAgbmV3X2FkZHIudHlwZSA9IERFQlVHX1BhcnNlU3RhYlR5cGUocHRyKTsKKwkgIG5ld19hZGRyLm9mZiA9IGxvYWRfb2Zmc2V0ICsgc3RhYl9wdHItPm5fdmFsdWU7CisKKwkgIHN0YWJfc3RyY3B5KHN5bW5hbWUsIHB0cik7CisjaWZkZWYgX19FTEZfXworCSAgY3Vycl9zeW0gPSBERUJVR19BZGRTeW1ib2woIHN5bW5hbWUsICZuZXdfYWRkciwgY3VycnBhdGgsCisJCQkJICAgICAgU1lNX1dJTkUgfCBTWU1fREFUQSB8IFNZTV9JTlZBTElEKTsKKyNlbHNlCisJICBjdXJyX3N5bSA9IERFQlVHX0FkZFN5bWJvbCggc3ltbmFtZSwgJm5ld19hZGRyLCBjdXJycGF0aCwgCisJCQkJICAgICAgU1lNX1dJTkUgfCBTWU1fREFUQSApOworI2VuZGlmCisJICBicmVhazsKIAljYXNlIE5fUkJSQUM6CiAJY2FzZSBOX0xCUkFDOgogCSAgLyoKQEAgLTExMCwxNSArNDc5LDEyIEBACiAJICAgKiBUaGVzZSBhcmUgc3RhdGljIHN5bWJvbHMgYW5kIEJTUyBzeW1ib2xzLgogCSAgICovCiAJICBuZXdfYWRkci5zZWcgPSAwOwotCSAgbmV3X2FkZHIub2ZmID0gc3RhYl9wdHItPm5fdmFsdWU7CisJICBuZXdfYWRkci50eXBlID0gREVCVUdfUGFyc2VTdGFiVHlwZShwdHIpOworCSAgbmV3X2FkZHIub2ZmID0gbG9hZF9vZmZzZXQgKyBzdGFiX3B0ci0+bl92YWx1ZTsKIAotCSAgc3RyY3B5KHN5bW5hbWUsIHB0cik7Ci0JICB4cHRyID0gc3RyY2hyKHN5bW5hbWUsICc6Jyk7Ci0JICBpZiggeHB0ciAhPSBOVUxMICkKLQkgICAgewotCSAgICAgICp4cHRyID0gJ1wwJzsKLQkgICAgfQotCSAgREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIGN1cnJwYXRoICk7CisJICBzdGFiX3N0cmNweShzeW1uYW1lLCBwdHIpOworCSAgY3Vycl9zeW0gPSBERUJVR19BZGRTeW1ib2woIHN5bW5hbWUsICZuZXdfYWRkciwgY3VycnBhdGgsIAorCQkJCSAgICAgIFNZTV9XSU5FIHwgU1lNX0RBVEEgKTsKIAkgIGJyZWFrOwogCWNhc2UgTl9QU1lNOgogCSAgLyoKQEAgLTEyNyw0MSArNDkzLDMyIEBACiAJICBpZiggICAgIChjdXJyX2Z1bmMgIT0gTlVMTCkKIAkgICAgICAgJiYgKHN0YWJfcHRyLT5uX3ZhbHVlICE9IDApICkKIAkgICAgewotCSAgICAgIHN0cmNweShzeW1uYW1lLCBwdHIpOwotCSAgICAgIHhwdHIgPSBzdHJjaHIoc3ltbmFtZSwgJzonKTsKLQkgICAgICBpZiggeHB0ciAhPSBOVUxMICkKLQkJewotCQkgICp4cHRyID0gJ1wwJzsKLQkJfQotCSAgICAgIERFQlVHX0FkZExvY2FsKGN1cnJfZnVuYywgMCwgCi0JCQkgICAgIHN0YWJfcHRyLT5uX3ZhbHVlLCAwLCAwLCBzeW1uYW1lKTsKKwkgICAgICBzdGFiX3N0cmNweShzeW1uYW1lLCBwdHIpOworCSAgICAgIGN1cnJfbG9jID0gREVCVUdfQWRkTG9jYWwoY3Vycl9mdW5jLCAwLCAKKwkJCQkJc3RhYl9wdHItPm5fdmFsdWUsIDAsIDAsIHN5bW5hbWUpOworCSAgICAgIERFQlVHX1NldExvY2FsU3ltYm9sVHlwZSggY3Vycl9sb2MsIERFQlVHX1BhcnNlU3RhYlR5cGUocHRyKSk7CiAJICAgIH0KIAkgIGJyZWFrOwogCWNhc2UgTl9SU1lNOgogCSAgaWYoIGN1cnJfZnVuYyAhPSBOVUxMICkKIAkgICAgewotCSAgICAgIHN0cmNweShzeW1uYW1lLCBwdHIpOwotCSAgICAgIHhwdHIgPSBzdHJjaHIoc3ltbmFtZSwgJzonKTsKLQkgICAgICBpZiggeHB0ciAhPSBOVUxMICkKLQkJewotCQkgICp4cHRyID0gJ1wwJzsKLQkJfQotCSAgICAgIERFQlVHX0FkZExvY2FsKGN1cnJfZnVuYywgc3RhYl9wdHItPm5fdmFsdWUsIDAsIDAsIDAsIHN5bW5hbWUpOworCSAgICAgIHN0YWJfc3RyY3B5KHN5bW5hbWUsIHB0cik7CisJICAgICAgY3Vycl9sb2MgPSBERUJVR19BZGRMb2NhbChjdXJyX2Z1bmMsIHN0YWJfcHRyLT5uX3ZhbHVlLCAwLCAwLCAwLCBzeW1uYW1lKTsKKwkgICAgICBERUJVR19TZXRMb2NhbFN5bWJvbFR5cGUoIGN1cnJfbG9jLCBERUJVR19QYXJzZVN0YWJUeXBlKHB0cikpOwogCSAgICB9CiAJICBicmVhazsKIAljYXNlIE5fTFNZTToKIAkgIGlmKCAgICAgKGN1cnJfZnVuYyAhPSBOVUxMKQogCSAgICAgICAmJiAoc3RhYl9wdHItPm5fdmFsdWUgIT0gMCkgKQogCSAgICB7Ci0JICAgICAgc3RyY3B5KHN5bW5hbWUsIHB0cik7Ci0JICAgICAgeHB0ciA9IHN0cmNocihzeW1uYW1lLCAnOicpOwotCSAgICAgIGlmKCB4cHRyICE9IE5VTEwgKQotCQl7Ci0JCSAgKnhwdHIgPSAnXDAnOwotCQl9CisJICAgICAgc3RhYl9zdHJjcHkoc3ltbmFtZSwgcHRyKTsKIAkgICAgICBERUJVR19BZGRMb2NhbChjdXJyX2Z1bmMsIDAsIAogCQkJICAgICBzdGFiX3B0ci0+bl92YWx1ZSwgMCwgMCwgc3ltbmFtZSk7CiAJICAgIH0KKwkgIGVsc2UgaWYgKGN1cnJfZnVuYyA9PSBOVUxMKQorCSAgICB7CisJICAgICAgc3RhYl9zdHJjcHkoc3ltbmFtZSwgcHRyKTsKKwkgICAgfQogCSAgYnJlYWs7CiAJY2FzZSBOX1NMSU5FOgogCSAgLyoKQEAgLTE3MCwxMiArNTI3LDI5IEBACiAJICAgKi8KIAkgIGlmKCBjdXJyX2Z1bmMgIT0gTlVMTCApCiAJICAgIHsKKyNpZmRlZiBfX0VMRl9fCiAJICAgICAgREVCVUdfQWRkTGluZU51bWJlcihjdXJyX2Z1bmMsIHN0YWJfcHRyLT5uX2Rlc2MsIAogCQkJCSAgc3RhYl9wdHItPm5fdmFsdWUpOworI2Vsc2UKKyNpZiAwCisJICAgICAgLyoKKwkgICAgICAgKiBUaGlzIGlzbid0IHJpZ2h0LiAgVGhlIG9yZGVyIG9mIHRoZSBzdGFicyBpcyBkaWZmZXJlbnQgdW5kZXIKKwkgICAgICAgKiBhLm91dCwgYW5kIGFzIGEgcmVzdWx0IHdlIHdvdWxkIGVuZCB1cCBhdHRhY2hpbmcgdGhlIGxpbmUKKwkgICAgICAgKiBudW1iZXIgdG8gdGhlIHdyb25nIGZ1bmN0aW9uLgorCSAgICAgICAqLworCSAgICAgIERFQlVHX0FkZExpbmVOdW1iZXIoY3Vycl9mdW5jLCBzdGFiX3B0ci0+bl9kZXNjLCAKKwkJCQkgIHN0YWJfcHRyLT5uX3ZhbHVlIC0gY3Vycl9mdW5jLT5hZGRyLm9mZik7CisjZW5kaWYKKyNlbmRpZgogCSAgICB9CiAJICBicmVhazsKIAljYXNlIE5fRlVOOgogCSAgLyoKKwkgICAqIEZpcnN0LCBjbGVhbiB1cCB0aGUgcHJldmlvdXMgZnVuY3Rpb24gd2Ugd2VyZSB3b3JraW5nIG9uLgorCSAgICovCisJICBERUJVR19Ob3JtYWxpemUoY3Vycl9mdW5jKTsKKworCSAgLyoKIAkgICAqIEZvciBub3csIGp1c3QgZGVjbGFyZSB0aGUgdmFyaW91cyBmdW5jdGlvbnMuICBMYXRlcgogCSAgICogb24sIHdlIHdpbGwgYWRkIHRoZSBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBhbmQgdGhlCiAJICAgKiBsb2NhbCBzeW1ib2xzLgpAQCAtMTgzLDcgKzU1Nyw4IEBACiAJICBpZiggIWlnbm9yZSApCiAJICAgIHsKIAkgICAgICBuZXdfYWRkci5zZWcgPSAwOwotCSAgICAgIG5ld19hZGRyLm9mZiA9IHN0YWJfcHRyLT5uX3ZhbHVlOworCSAgICAgIG5ld19hZGRyLnR5cGUgPSBERUJVR19QYXJzZVN0YWJUeXBlKHB0cik7CisJICAgICAgbmV3X2FkZHIub2ZmID0gbG9hZF9vZmZzZXQgKyBzdGFiX3B0ci0+bl92YWx1ZTsKIAkgICAgICAvKgogCSAgICAgICAqIENvcHkgdGhlIHN0cmluZyB0byBhIHRlbXAgYnVmZmVyIHNvIHdlCiAJICAgICAgICogY2FuIGtpbGwgZXZlcnl0aGluZyBhZnRlciB0aGUgJzonLiAgV2UgZG8KQEAgLTE5MSwxMyArNTY2LDkgQEAKIAkgICAgICAgKiBhbGwgb2YgdGhlIHBhZ2VzIHJlbGF0ZWQgdG8gdGhlIHN0YWJzLCBhbmQgdGhhdAogCSAgICAgICAqIHN1Y2tzIHVwIHN3YXAgc3BhY2UgbGlrZSBjcmF6eS4KIAkgICAgICAgKi8KLQkgICAgICBzdHJjcHkoc3ltbmFtZSwgcHRyKTsKLQkgICAgICB4cHRyID0gc3RyY2hyKHN5bW5hbWUsICc6Jyk7Ci0JICAgICAgaWYoIHhwdHIgIT0gTlVMTCApCi0JCXsKLQkJICAqeHB0ciA9ICdcMCc7Ci0JCX0KLQkgICAgICBjdXJyX2Z1bmMgPSBERUJVR19BZGRTeW1ib2woIHN5bW5hbWUsICZuZXdfYWRkciwgY3VycnBhdGggKTsKKwkgICAgICBzdGFiX3N0cmNweShzeW1uYW1lLCBwdHIpOworCSAgICAgIGN1cnJfZnVuYyA9IERFQlVHX0FkZFN5bWJvbCggc3ltbmFtZSwgJm5ld19hZGRyLCBjdXJycGF0aCwKKwkJCQkJICAgU1lNX1dJTkUgfCBTWU1fRlVOQyk7CiAJICAgIH0KIAkgIGVsc2UKIAkgICAgewpAQCAtMjEzLDE5ICs1ODQsNDAgQEAKIAkgICAqIFRoaXMgaW5kaWNhdGVzIGEgbmV3IHNvdXJjZSBmaWxlLiAgQXBwZW5kIHRoZSByZWNvcmRzCiAJICAgKiB0b2dldGhlciwgdG8gYnVpbGQgdGhlIGNvcnJlY3QgcGF0aCBuYW1lLgogCSAgICovCisjaWZuZGVmIF9fRUxGX18KKwkgIC8qCisJICAgKiBXaXRoIGEub3V0LCB0aGVyZSBpcyBubyBOVUxMIHN0cmluZyBOX1NPIGVudHJ5IGF0IHRoZSBlbmQgb2YKKwkgICAqIHRoZSBmaWxlLiAgVGh1cyB3aGVuIHdlIGZpbmQgbm9uLWNvbnNlY3V0aXZlIGVudHJpZXMsCisJICAgKiB3ZSBjb25zaWRlciB0aGF0IGEgbmV3IGZpbGUgaXMgc3RhcnRlZC4KKwkgICAqLworCSAgaWYoIGxhc3RfbnNvIDwgaS0xICkKKwkgICAgeworCSAgICAgIGN1cnJwYXRoWzBdID0gJ1wwJzsKKwkgICAgICBERUJVR19Ob3JtYWxpemUoY3Vycl9mdW5jKTsKKwkgICAgICBjdXJyX2Z1bmMgPSBOVUxMOworCSAgICB9CisjZW5kaWYKKwogCSAgaWYoICpwdHIgPT0gJ1wwJyApCiAJICAgIHsKIAkgICAgICAvKgogCSAgICAgICAqIE51a2Ugb2xkIHBhdGguCiAJICAgICAgICovCiAJICAgICAgY3VycnBhdGhbMF0gPSAnXDAnOworCSAgICAgIERFQlVHX05vcm1hbGl6ZShjdXJyX2Z1bmMpOwogCSAgICAgIGN1cnJfZnVuYyA9IE5VTEw7CisJICAgICAgLyoKKwkgICAgICAgKiBUaGUgZGF0YXR5cGVzIHRoYXQgd2Ugd291bGQgbmVlZCB0byB1c2UgYXJlIHJlc2V0IHdoZW4KKwkgICAgICAgKiB3ZSBzdGFydCBhIG5ldyBmaWxlLgorCSAgICAgICAqLworCSAgICAgIG1lbXNldChzdGFiX3R5cGVzLCAwLCBudW1fc3RhYl90eXBlcyAqIHNpemVvZihzdGFiX3R5cGVzKSk7CiAJICAgIH0KIAkgIGVsc2UKIAkgICAgewogCSAgICAgIHN0cmNhdChjdXJycGF0aCwgcHRyKTsKIAkgICAgICBzdWJwYXRoID0gcHRyOwogCSAgICB9CisJICBsYXN0X25zbyA9IGk7CiAJICBicmVhazsKIAljYXNlIE5fU09MOgogCSAgLyoKQEAgLTI0MCwxMiArNjMyLDE0IEBACiAJICBlbHNlCiAJICAgIHsKIAkgICAgICBpZ25vcmUgPSBUUlVFOworCSAgICAgIERFQlVHX05vcm1hbGl6ZShjdXJyX2Z1bmMpOwogCSAgICAgIGN1cnJfZnVuYyA9IE5VTEw7CiAJICAgIH0KIAkgIGJyZWFrOwogCWNhc2UgTl9VTkRGOgogCSAgc3RycyArPSBzdHJ0YWJpbmM7CiAJICBzdHJ0YWJpbmMgPSBzdGFiX3B0ci0+bl92YWx1ZTsKKyAJICBERUJVR19Ob3JtYWxpemUoY3Vycl9mdW5jKTsKIAkgIGN1cnJfZnVuYyA9IE5VTEw7CiAJICBicmVhazsKIAljYXNlIE5fT1BUOgpAQCAtMjYzLDIwICs2NTcsMTI4IEBACiAJZGVmYXVsdDoKIAkgIGJyZWFrOwogCX0KKworICAgICAgc3RhYmJ1ZmZbMF0gPSAnXDAnOworCiAjaWYgMAogICAgICAgZnByaW50ZihzdGRlcnIsICIlZCAleCAlc1xuIiwgc3RhYl9wdHItPm5fdHlwZSwgCiAJICAgICAgKHVuc2lnbmVkIGludCkgc3RhYl9wdHItPm5fdmFsdWUsCiAJICAgICAgc3RycyArICh1bnNpZ25lZCBpbnQpIHN0YWJfcHRyLT5uX3VuLm5fbmFtZSk7CiAjZW5kaWYKICAgICB9CisKK2xlYXZlOgorCisgIGlmKCBzdGFiX3R5cGVzICE9IE5VTEwgKQorICAgIHsKKyAgICAgIGZyZWUoc3RhYl90eXBlcyk7CisgICAgICBzdGFiX3R5cGVzID0gTlVMTDsKKyAgICAgIG51bV9zdGFiX3R5cGVzID0gMDsKKyAgICB9CisKICAgcmV0dXJuIFRSVUU7CiB9CiAKKyNpZmRlZiBfX0VMRl9fCisKKy8qCisgKiBXYWxrIHRocm91Z2ggdGhlIGVudGlyZSBzeW1ib2wgdGFibGUgYW5kIGFkZCBhbnkgc3ltYm9scyB3ZSBmaW5kIHRoZXJlLgorICogVGhpcyBjYW4gYmUgdXNlZCBpbiBjYXNlcyB3aGVyZSB3ZSBoYXZlIHN0cmlwcGVkIEVMRiBzaGFyZWQgbGlicmFyaWVzLAorICogb3IgaXQgY2FuIGJlIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2UgaGF2ZSBkYXRhIHN5bWJvbHMgZm9yIHdoaWNoIHRoZSBhZGRyZXNzCisgKiBpc24ndCBlbmNvZGVkIGluIHRoZSBzdGFicy4KKyAqCisgKiBUaGlzIGlzIGFsbCByZWFsbHkgcXVpdGUgZWFzeSwgc2luY2Ugd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsaW5lCisgKiBudW1iZXJzIG9yIGxvY2FsIGRhdGEgdmFyaWFibGVzLgorICovCitzdGF0aWMKIGludAotREVCVUdfUmVhZEV4ZWN1dGFibGVEYmdJbmZvKHZvaWQpCitERUJVR19Qcm9jZXNzRWxmU3ltdGFiKGNoYXIgKiBhZGRyLCB1bnNpZ25lZCBpbnQgbG9hZF9vZmZzZXQsCisJCSAgICAgICBFbGYzMl9TaGRyICogc3ltdGFiLCBFbGYzMl9TaGRyICogc3RydGFiKQoreworICBjaGFyCQkqIGN1cmZpbGUgPSBOVUxMOworICBzdHJ1Y3QgbmFtZV9oYXNoICogY3Vycl9zeW0gPSBOVUxMOworICBpbnQJCSAgZmxhZ3M7CisgIGludAkJICBpOworICBEQkdfQUREUiAgICAgICAgbmV3X2FkZHI7CisgIGludAkJICBuc3ltOworICBjaGFyCQkqIHN0cnA7CisgIGNoYXIJCSogc3ltbmFtZTsKKyAgRWxmMzJfU3ltCSogc3ltcDsKKworCisgIHN5bXAgPSAoRWxmMzJfU3ltICopIChhZGRyICsgc3ltdGFiLT5zaF9vZmZzZXQpOworICBuc3ltID0gc3ltdGFiLT5zaF9zaXplIC8gc2l6ZW9mKCpzeW1wKTsKKyAgc3RycCA9IChjaGFyICopIChhZGRyICsgc3RydGFiLT5zaF9vZmZzZXQpOworCisgIGZvcihpPTA7IGkgPCBuc3ltOyBpKyssIHN5bXArKykKKyAgICB7CisgICAgICAvKgorICAgICAgICogSWdub3JlIGNlcnRhaW4gdHlwZXMgb2YgZW50cmllcyB3aGljaCByZWFsbHkgYXJlbid0IG9mIHRoYXQgbXVjaAorICAgICAgICogaW50ZXJlc3QuCisgICAgICAgKi8KKyAgICAgIGlmKCBFTEYzMl9TVF9UWVBFKHN5bXAtPnN0X2luZm8pID09IFNUVF9TRUNUSU9OICkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIHN5bW5hbWUgPSBzdHJwICsgc3ltcC0+c3RfbmFtZTsKKworICAgICAgLyoKKyAgICAgICAqIFNhdmUgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZmlsZSwgc28gd2UgaGF2ZSBhIHdheSBvZiB0cmFja2luZworICAgICAgICogc3RhdGljIGZ1bmN0aW9ucy9kYXRhLgorICAgICAgICovCisgICAgICBpZiggRUxGMzJfU1RfVFlQRShzeW1wLT5zdF9pbmZvKSA9PSBTVFRfRklMRSApCisJeworCSAgY3VyZmlsZSA9IHN5bW5hbWU7CisJICBjb250aW51ZTsKKwl9CisKKworICAgICAgLyoKKyAgICAgICAqIFNlZSBpZiB3ZSBhbHJlYWR5IGhhdmUgc29tZXRoaW5nIGZvciB0aGlzIHN5bWJvbC4KKyAgICAgICAqIElmIHNvLCBpZ25vcmUgdGhpcyBlbnRyeSwgYmVjYXVzZSBpdCB3b3VsZCBoYXZlIGNvbWUgZnJvbSB0aGUKKyAgICAgICAqIHN0YWJzIG9yIGZyb20gYSBwcmV2aW91cyBzeW1ib2wuICBJZiB0aGUgdmFsdWUgaXMgZGlmZmVyZW50LAorICAgICAgICogd2Ugd2lsbCBoYXZlIHRvIGtlZXAgdGhlIGRhcm5lZCB0aGluZywgYmVjYXVzZSB0aGVyZSBjYW4gYmUKKyAgICAgICAqIG11bHRpcGxlIGxvY2FsIHN5bWJvbHMgYnkgdGhlIHNhbWUgbmFtZS4KKyAgICAgICAqLworICAgICAgaWYoICAgIChERUJVR19HZXRTeW1ib2xWYWx1ZShzeW1uYW1lLCAtMSwgJm5ld19hZGRyLCBGQUxTRSApID09IFRSVUUpCisJICAmJiAobmV3X2FkZHIub2ZmID09IChsb2FkX29mZnNldCArIHN5bXAtPnN0X3ZhbHVlKSkgKQorCXsKKwkgIGNvbnRpbnVlOworCX0KKworICAgICAgbmV3X2FkZHIuc2VnID0gMDsKKyAgICAgIG5ld19hZGRyLnR5cGUgPSBOVUxMOworICAgICAgbmV3X2FkZHIub2ZmID0gbG9hZF9vZmZzZXQgKyBzeW1wLT5zdF92YWx1ZTsKKyAgICAgIGZsYWdzID0gU1lNX1dJTkUgfCAoRUxGMzJfU1RfQklORChzeW1wLT5zdF9pbmZvKSA9PSBTVFRfRlVOQyAKKwkJCSAgPyBTWU1fRlVOQyA6IFNZTV9EQVRBKTsKKyAgICAgIGlmKCBFTEYzMl9TVF9CSU5EKHN5bXAtPnN0X2luZm8pID09IFNUQl9HTE9CQUwgKQorCXsKKwkgIGN1cnJfc3ltID0gREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIE5VTEwsIGZsYWdzICk7CisJfQorICAgICAgZWxzZQorCXsKKwkgIGN1cnJfc3ltID0gREVCVUdfQWRkU3ltYm9sKCBzeW1uYW1lLCAmbmV3X2FkZHIsIGN1cmZpbGUsIGZsYWdzICk7CisJfQorCisgICAgICAvKgorICAgICAgICogUmVjb3JkIHRoZSBzaXplIG9mIHRoZSBzeW1ib2wuICBUaGlzIGNhbiBjb21lIGluIGhhbmR5IGluCisgICAgICAgKiBzb21lIGNhc2VzLiAgTm90IHJlYWxseSB1c2VkIHlldCwgaG93ZXZlci4KKyAgICAgICAqLworICAgICAgaWYoICBzeW1wLT5zdF9zaXplICE9IDAgKQorCXsKKwkgIERFQlVHX1NldFN5bWJvbFNpemUoY3Vycl9zeW0sIHN5bXAtPnN0X3NpemUpOworCX0KKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYworaW50CitERUJVR19Qcm9jZXNzRWxmT2JqZWN0KGNoYXIgKiBmaWxlbmFtZSwgdW5zaWduZWQgaW50IGxvYWRfb2Zmc2V0KQogewogICBpbnQJCQlydG4gPSBGQUxTRTsKLSAgY2hhcgkJICAgICAgKiBleGVfbmFtZTsKICAgc3RydWN0IHN0YXQJCXN0YXRidWY7CiAgIGludAkJCWZkID0gLTE7CiAgIGludAkJCXN0YXR1czsKQEAgLTI4OSw2ICs3OTEsMjM5IEBACiAgIGludAkJCXN0YWJzZWN0OwogICBpbnQJCQlzdGFic3Ryc2VjdDsKIAorCisgIC8qCisgICAqIE1ha2Ugc3VyZSB3ZSBjYW4gc3RhdCBhbmQgb3BlbiB0aGlzIGZpbGUuCisgICAqLworICBpZiggZmlsZW5hbWUgPT0gTlVMTCApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgc3RhdHVzID0gc3RhdChmaWxlbmFtZSwgJnN0YXRidWYpOworICBpZiggc3RhdHVzID09IC0xICkKKyAgICB7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICAvKgorICAgKiBOb3cgb3BlbiB0aGUgZmlsZSwgc28gdGhhdCB3ZSBjYW4gbW1hcCgpIGl0LgorICAgKi8KKyAgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisgIGlmKCBmZCA9PSAtMSApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKworICAvKgorICAgKiBOb3cgbW1hcCgpIHRoZSBmaWxlLgorICAgKi8KKyAgYWRkciA9IG1tYXAoMCwgc3RhdGJ1Zi5zdF9zaXplLCBQUk9UX1JFQUQsIAorCSAgICAgIE1BUF9QUklWQVRFLCBmZCwgMCk7CisKKyAgLyoKKyAgICogR2l2ZSBhIG5pY2Ugc3RhdHVzIG1lc3NhZ2UgaGVyZS4uLgorICAgKi8KKyAgZnByaW50ZihzdGRlcnIsICJMb2FkaW5nIHN5bWJvbHMgZnJvbSBFTEYgZmlsZSAlcy4uLlxuIiwgZmlsZW5hbWUpOworCisgIC8qCisgICAqIE5leHQsIHdlIG5lZWQgdG8gZmluZCBhIGZldyBvZiB0aGUgaW50ZXJuYWwgRUxGIGhlYWRlcnMgd2l0aGluCisgICAqIHRoaXMgdGhpbmcuICBXZSBuZWVkIHRoZSBtYWluIGV4ZWN1dGFibGUgaGVhZGVyLCBhbmQgdGhlIHNlY3Rpb24KKyAgICogdGFibGUuCisgICAqLworICBlaHB0ciA9IChFbGYzMl9FaGRyICopIGFkZHI7CisKKyAgaWYoIGxvYWRfb2Zmc2V0ID09IE5VTEwgKQorICAgIHsKKyAgICAgIERFQlVHX1JlZ2lzdGVyRUxGRGVidWdJbmZvKGVocHRyLT5lX2VudHJ5LCBzdGF0YnVmLnN0X3NpemUsIGZpbGVuYW1lKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBERUJVR19SZWdpc3RlckVMRkRlYnVnSW5mbyhsb2FkX29mZnNldCwgc3RhdGJ1Zi5zdF9zaXplLCBmaWxlbmFtZSk7CisgICAgfQorCisgIHNwbnQgPSAoRWxmMzJfU2hkciAqKSAoYWRkciArIGVocHRyLT5lX3Nob2ZmKTsKKyAgbnNlY3QgPSBlaHB0ci0+ZV9zaG51bTsKKyAgc2hzdHJ0YWIgPSAoYWRkciArIHNwbnRbZWhwdHItPmVfc2hzdHJuZHhdLnNoX29mZnNldCk7CisKKyAgc3RhYnNlY3QgPSBzdGFic3Ryc2VjdCA9IC0xOworCisgIGZvcihpPTA7IGkgPCBuc2VjdDsgaSsrKQorICAgIHsKKyAgICAgIGlmKCBzdHJjbXAoc2hzdHJ0YWIgKyBzcG50W2ldLnNoX25hbWUsICIuc3RhYiIpID09IDAgKQorCXsKKwkgIHN0YWJzZWN0ID0gaTsKKwl9CisKKyAgICAgIGlmKCBzdHJjbXAoc2hzdHJ0YWIgKyBzcG50W2ldLnNoX25hbWUsICIuc3RhYnN0ciIpID09IDAgKQorCXsKKwkgIHN0YWJzdHJzZWN0ID0gaTsKKwl9CisgICAgfQorCisgIGlmKCBzdGFic2VjdCA9PSAtMSB8fCBzdGFic3Ryc2VjdCA9PSAtMSApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyoKKyAgICogT0ssIG5vdyBqdXN0IHBhcnNlIGFsbCBvZiB0aGUgc3RhYnMuCisgICAqLworICBydG4gPSBERUJVR19QYXJzZVN0YWJzKGFkZHIsIGxvYWRfb2Zmc2V0LCAKKwkJCSBzcG50W3N0YWJzZWN0XS5zaF9vZmZzZXQsCisJCQkgc3BudFtzdGFic2VjdF0uc2hfc2l6ZSwKKwkJCSBzcG50W3N0YWJzdHJzZWN0XS5zaF9vZmZzZXQsCisJCQkgc3BudFtzdGFic3Ryc2VjdF0uc2hfc2l6ZSk7CisKKyAgaWYoIHJ0biAhPSBUUlVFICkKKyAgICB7CisgICAgICBnb3RvIGxlYXZlOworICAgIH0KKworICBmb3IoaT0wOyBpIDwgbnNlY3Q7IGkrKykKKyAgICB7CisgICAgICBpZiggICAgKHN0cmNtcChzaHN0cnRhYiArIHNwbnRbaV0uc2hfbmFtZSwgIi5zeW10YWIiKSA9PSAwKQorCSAgJiYgKHNwbnRbaV0uc2hfdHlwZSA9PSBTSFRfU1lNVEFCKSApCisJeworCSAgREVCVUdfUHJvY2Vzc0VsZlN5bXRhYihhZGRyLCBsb2FkX29mZnNldCwgCisJCQkJIHNwbnQgKyBpLCBzcG50ICsgc3BudFtpXS5zaF9saW5rKTsKKwl9CisKKyAgICAgIGlmKCAgICAoc3RyY21wKHNoc3RydGFiICsgc3BudFtpXS5zaF9uYW1lLCAiLmR5bnN5bSIpID09IDApCisJICAmJiAoc3BudFtpXS5zaF90eXBlID09IFNIVF9EWU5TWU0pICkKKwl7CisJICBERUJVR19Qcm9jZXNzRWxmU3ltdGFiKGFkZHIsIGxvYWRfb2Zmc2V0LCAKKwkJCQkgc3BudCArIGksIHNwbnQgKyBzcG50W2ldLnNoX2xpbmspOworCX0KKyAgICB9CisKK2xlYXZlOgorCisgIGlmKCBhZGRyICE9IChjaGFyICopIDB4ZmZmZmZmZmYgKQorICAgIHsKKyAgICAgIG11bm1hcChhZGRyLCBzdGF0YnVmLnN0X3NpemUpOworICAgIH0KKworICBpZiggZmQgIT0gLTEgKQorICAgIHsKKyAgICAgIGNsb3NlKGZkKTsKKyAgICB9CisKKyAgcmV0dXJuIChydG4pOworCit9CisKK2ludAorREVCVUdfUmVhZEV4ZWN1dGFibGVEYmdJbmZvKHZvaWQpCit7CisgIEVsZjMyX0VoZHIJICAgICAgKiBlaGRyOworICBjaGFyCQkgICAgICAqIGV4ZV9uYW1lOworICBFbGYzMl9EeW4JICAgICAgKiBkeW5wbnQ7CisgIHN0cnVjdCByX2RlYnVnICAgICAgKiBkYmdfaGRyOworICBzdHJ1Y3QgbGlua19tYXAgICAgICogbHBudCA9IE5VTEw7CisgIGV4dGVybiBFbGYzMl9EeW4gICAgICBfRFlOQU1JQ1tdOworICBpbnQJCQlydG4gPSBGQUxTRTsKKworICBleGVfbmFtZSA9IERFQlVHX2FyZ3YwOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB3ZSBjYW4gc3RhdCBhbmQgb3BlbiB0aGlzIGZpbGUuCisgICAqLworICBpZiggZXhlX25hbWUgPT0gTlVMTCApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgREVCVUdfUHJvY2Vzc0VsZk9iamVjdChleGVfbmFtZSwgMCk7CisKKyAgLyoKKyAgICogRmluYWxseSB3YWxrIHRoZSB0YWJsZXMgdGhhdCB0aGUgZHluYW1pYyBsb2FkZXIgbWFpbnRhaW5zIHRvIGZpbmQgYWxsCisgICAqIG9mIHRoZSBvdGhlciBzaGFyZWQgbGlicmFyaWVzIHdoaWNoIG1pZ2h0IGJlIGxvYWRlZC4gIFBlcmZvcm0gdGhlCisgICAqIHNhbWUgc3RlcCBmb3IgYWxsIG9mIHRoZXNlLgorICAgKi8KKyAgZHlucG50ID0gX0RZTkFNSUM7CisgIGlmKCBkeW5wbnQgPT0gTlVMTCApCisgICAgeworICAgICAgZ290byBsZWF2ZTsKKyAgICB9CisKKyAgLyoKKyAgICogTm93IHdhbGsgdGhlIGR5bmFtaWMgc2VjdGlvbiAob2YgdGhlIGV4ZWN1dGFibGUsIGxvb2tpbmcgZm9yIGEgRFRfREVCVUcKKyAgICogZW50cnkuCisgICAqLworICBmb3IoOyBkeW5wbnQtPmRfdGFnICE9IERUX05VTEw7IGR5bnBudCsrKQorICAgIHsKKyAgICAgIGlmKCBkeW5wbnQtPmRfdGFnID09IERUX0RFQlVHICkKKwl7CisJICBicmVhazsKKwl9CisgICAgfQorCisgIGlmKCAgICAoZHlucG50LT5kX3RhZyAhPSBEVF9ERUJVRykKKyAgICAgIHx8IChkeW5wbnQtPmRfdW4uZF9wdHIgPT0gTlVMTCkgKQorICAgIHsKKyAgICAgIGdvdG8gbGVhdmU7CisgICAgfQorCisgIC8qCisgICAqIE9LLCBub3cgZGlnIGludG8gdGhlIGFjdHVhbCB0YWJsZXMgdGhlbXNlbHZlcy4KKyAgICovCisgIGRiZ19oZHIgPSAoc3RydWN0IHJfZGVidWcgKikgZHlucG50LT5kX3VuLmRfcHRyOworICBscG50ID0gZGJnX2hkci0+cl9tYXA7CisKKyAgLyoKKyAgICogTm93IHdhbGsgdGhlIGxpbmtlZCBsaXN0LiAgSW4gYWxsIGtub3duIEVMRiBpbXBsZW1lbnRhdGlvbnMsCisgICAqIHRoZSBkeW5hbWljIGxvYWRlciBtYWludGFpbnMgdGhpcyBsaW5rZWQgbGlzdCBmb3IgdXMuICBJbiBzb21lCisgICAqIGNhc2VzIHRoZSBmaXJzdCBlbnRyeSBkb2Vzbid0IGFwcGVhciB3aXRoIGEgbmFtZSwgaW4gb3RoZXIgY2FzZXMgaXQKKyAgICogZG9lcy4KKyAgICovCisgIGZvcig7IGxwbnQ7IGxwbnQgPSBscG50LT5sX25leHQgKQorICAgIHsKKyAgICAgIC8qCisgICAgICAgKiBXZSBhbHJlYWR5IGdvdCB0aGUgc3R1ZmYgZm9yIHRoZSBleGVjdXRhYmxlIHVzaW5nIHRoZQorICAgICAgICogYXJndlswXSBlbnRyeSBhYm92ZS4gIEhlcmUgd2Ugb25seSBuZWVkIHRvIGNvbmNlbnRyYXRlIG9uIGFueQorICAgICAgICogc2hhcmVkIGxpYnJhcmllcyB3aGljaCBtYXkgYmUgbG9hZGVkLgorICAgICAgICovCisgICAgICBlaGRyID0gKEVsZjMyX0VoZHIgKikgbHBudC0+bF9hZGRyOworICAgICAgaWYoIChscG50LT5sX2FkZHIgPT0gTlVMTCkgfHwgKGVoZHItPmVfdHlwZSAhPSBFVF9EWU4pICkKKwl7CisJICBjb250aW51ZTsKKwl9CisKKyAgICAgIGlmKCBscG50LT5sX25hbWUgIT0gTlVMTCApCisJeworCSAgREVCVUdfUHJvY2Vzc0VsZk9iamVjdChscG50LT5sX25hbWUsIGxwbnQtPmxfYWRkcik7CisJfQorICAgIH0KKworICBydG4gPSBUUlVFOworCitsZWF2ZToKKworICByZXR1cm4gKHJ0bik7CisKK30KKworI2Vsc2UJLyogIV9fRUxGX18gKi8KKworI2lmZGVmIGxpbnV4CisvKgorICogYS5vdXQgbGludXguCisgKi8KK2ludAorREVCVUdfUmVhZEV4ZWN1dGFibGVEYmdJbmZvKHZvaWQpCit7CisgIGNoYXIJCSAgICAgICogYWRkciA9IChjaGFyICopIDB4ZmZmZmZmZmY7CisgIGNoYXIJCSAgICAgICogZXhlX25hbWU7CisgIHN0cnVjdCBleGVjCSAgICAgICogYWhkcjsKKyAgaW50CQkJZmQgPSAtMTsKKyAgaW50CQkJcnRuID0gRkFMU0U7CisgIHVuc2lnbmVkIGludAkJc3RhYm9mZjsKKyAgc3RydWN0IHN0YXQJCXN0YXRidWY7CisgIGludAkJCXN0YXR1czsKKyAgdW5zaWduZWQgaW50CQlzdHJvZmY7CisKICAgZXhlX25hbWUgPSBERUJVR19hcmd2MDsKIAogICAvKgpAQCAtMzIxLDQwICsxMDU2LDIyIEBACiAgIGFkZHIgPSBtbWFwKDAsIHN0YXRidWYuc3Rfc2l6ZSwgUFJPVF9SRUFELCAKIAkgICAgICBNQVBfUFJJVkFURSwgZmQsIDApOwogCi0gIC8qCi0gICAqIE5leHQsIHdlIG5lZWQgdG8gZmluZCBhIGZldyBvZiB0aGUgaW50ZXJuYWwgRUxGIGhlYWRlcnMgd2l0aGluCi0gICAqIHRoaXMgdGhpbmcuICBXZSBuZWVkIHRoZSBtYWluIGV4ZWN1dGFibGUgaGVhZGVyLCBhbmQgdGhlIHNlY3Rpb24KLSAgICogdGFibGUuCi0gICAqLwotICBlaHB0ciA9IChFbGYzMl9FaGRyICopIGFkZHI7Ci0gIHNwbnQgPSAoRWxmMzJfU2hkciAqKSAoYWRkciArIGVocHRyLT5lX3Nob2ZmKTsKLSAgbnNlY3QgPSBlaHB0ci0+ZV9zaG51bTsKLSAgc2hzdHJ0YWIgPSAoYWRkciArIHNwbnRbZWhwdHItPmVfc2hzdHJuZHhdLnNoX29mZnNldCk7CisgIGFoZHIgPSAoc3RydWN0IGV4ZWMgKikgYWRkcjsKIAotICBzdGFic2VjdCA9IHN0YWJzdHJzZWN0ID0gLTE7Ci0KLSAgZm9yKGk9MDsgaSA8IG5zZWN0OyBpKyspCi0gICAgewotICAgICAgaWYoIHN0cmNtcChzaHN0cnRhYiArIHNwbnRbaV0uc2hfbmFtZSwgIi5zdGFiIikgPT0gMCApCi0JewotCSAgc3RhYnNlY3QgPSBpOwotCX0KLQotICAgICAgaWYoIHN0cmNtcChzaHN0cnRhYiArIHNwbnRbaV0uc2hfbmFtZSwgIi5zdGFic3RyIikgPT0gMCApCi0JewotCSAgc3RhYnN0cnNlY3QgPSBpOwotCX0KLSAgICB9Ci0KLSAgaWYoIHN0YWJzZWN0ID09IC0xIHx8IHN0YWJzdHJzZWN0ID09IC0xICkKLSAgICB7Ci0gICAgICBnb3RvIGxlYXZlOwotICAgIH0KKyAgc3RhYm9mZiA9IE5fU1lNT0ZGKCphaGRyKTsKKyAgc3Ryb2ZmID0gTl9TVFJPRkYoKmFoZHIpOworICBydG4gPSBERUJVR19QYXJzZVN0YWJzKGFkZHIsIDAsIAorCQkJIHN0YWJvZmYsIAorCQkJIGFoZHItPmFfc3ltcywKKwkJCSBzdHJvZmYsCisJCQkgc3RhdGJ1Zi5zdF9zaXplIC0gc3Ryb2ZmKTsKIAogICAvKgotICAgKiBPSywgbm93IGp1c3QgcGFyc2UgYWxsIG9mIHRoZSBzdGFicy4KKyAgICogR2l2ZSBhIG5pY2Ugc3RhdHVzIG1lc3NhZ2UgaGVyZS4uLgogICAgKi8KLSAgcnRuID0gREVCVUdfUGFyc2VTdGFicyhhZGRyLCBzcG50ICsgc3RhYnNlY3QsIHNwbnQgKyBzdGFic3Ryc2VjdCk7CisgIGZwcmludGYoc3RkZXJyLCAiTG9hZGluZyBzeW1ib2xzIGZyb20gYS5vdXQgZmlsZSAlcy4uLlxuIiwgZXhlX25hbWUpOworCisgIHJ0biA9IFRSVUU7CiAKIGxlYXZlOgogCkBAIC0zNzEsMTMgKzEwODgsMTUgQEAKICAgcmV0dXJuIChydG4pOwogCiB9Ci0KLSNlbHNlCS8qICFfX0VMRl9fICovCi0KKyNlbHNlCisvKgorICogTm9uLWxpbnV4LCBub24tRUxGIHBsYXRmb3Jtcy4KKyAqLwogaW50CiBERUJVR19SZWFkRXhlY3V0YWJsZURiZ0luZm8odm9pZCkKIHsKIHJldHVybiBGQUxTRTsKIH0KKyNlbmRpZgogCiAjZW5kaWYgIC8qIF9fRUxGX18gKi8KZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3N0YWNrLmMgYi9kZWJ1Z2dlci9zdGFjay5jCmluZGV4IGFkYzRlODguLjhjNjY4YWQgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3N0YWNrLmMKKysrIGIvZGVidWdnZXIvc3RhY2suYwpAQCAtMTksMTcgKzE5LDE0IEBACiBzdHJ1Y3QgYnRfaW5mbwogewogICB1bnNpZ25lZCBpbnQJICAgICBlaXA7CisgIHVuc2lnbmVkIGludAkgICAgIGVzczsKICAgdW5zaWduZWQgaW50CSAgICAgZWJwOwotICBzdHJ1Y3QgbmFtZV9oYXNoICogZnJhbWU7CisgIHN0cnVjdCBzeW1ib2xfaW5mbyBmcmFtZTsKIH07CiAKIHN0YXRpYyBpbnQgbmZyYW1lOwogc3RhdGljIHN0cnVjdCBidF9pbmZvICogZnJhbWVzID0gTlVMTDsKIGludCBjdXJyX2ZyYW1lOwotc3RhdGljIGNoYXIgKiByZWdfbmFtZVtdID0KLXsKLSAgImVheCIsICJlY3giLCAiZWR4IiwgImVieCIsICJlc3AiLCAiZWJwIiwgImVzaSIsICJlZGkiCi19OwogCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNjIsMTIgKzU5LDE0IEBACiAgICAgeyAgLyogMzItYml0IG1vZGUgKi8KICAgICAgICAgYWRkci5zZWcgPSAwOwogICAgICAgICBhZGRyLm9mZiA9IEVTUF9yZWcoJkRFQlVHX2NvbnRleHQpOworCWFkZHIudHlwZSA9IE5VTEw7CiAgICAgICAgIERFQlVHX0V4YW1pbmVNZW1vcnkoICZhZGRyLCAyNCwgJ3gnICk7CiAgICAgfQogICAgIGVsc2UgIC8qIDE2LWJpdCBtb2RlICovCiAgICAgewogICAgICAgICBhZGRyLnNlZyA9IFNTX3JlZygmREVCVUdfY29udGV4dCk7CiAgICAgICAgIGFkZHIub2ZmID0gU1BfcmVnKCZERUJVR19jb250ZXh0KTsKKwlhZGRyLnR5cGUgPSBOVUxMOwogICAgICAgICBERUJVR19FeGFtaW5lTWVtb3J5KCAmYWRkciwgMjQsICd3JyApOwogICAgIH0KICAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKQEAgLTE1Myw5NCArMTUyLDc2IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERFQlVHX0dldFN5bWJvbFZhbHVlCisgKiAgICAgICAgICAgREVCVUdfU2lsZW50QmFja1RyYWNlCiAgKgotICogR2V0IHRoZSBhZGRyZXNzIG9mIGEgbmFtZWQgc3ltYm9sIGZyb20gdGhlIGN1cnJlbnQgc3RhY2sgZnJhbWUuCisgKiBEaXNwbGF5IGEgc3RhY2sgYmFjay10cmFjZS4KICAqLwotQk9PTDMyIERFQlVHX0dldFN0YWNrU3ltYm9sVmFsdWUoIGNvbnN0IGNoYXIgKiBuYW1lLCBEQkdfQUREUiAqYWRkciApCit2b2lkIERFQlVHX1NpbGVudEJhY2tUcmFjZSh2b2lkKQogewotICBzdHJ1Y3QgbmFtZV9oYXNoICogY3Vycl9mdW5jOwotICBpbnQJCSAgICAgaTsKKyAgICBEQkdfQUREUiBhZGRyOworICAgIGludCBmcmFtZW5vID0gMDsKIAotICAvKgotICAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgdmFsaWQgYmFja3RyYWNlLCB0aGVuIGp1c3QgcmV0dXJuLgotICAgKi8KLSAgaWYoIGZyYW1lcyA9PSBOVUxMICkKKyAgICBuZnJhbWUgPSAxOworICAgIGlmIChmcmFtZXMpIGZyZWUoIGZyYW1lcyApOworICAgIGZyYW1lcyA9IChzdHJ1Y3QgYnRfaW5mbyAqKSB4bWFsbG9jKCBzaXplb2Yoc3RydWN0IGJ0X2luZm8pICk7CisKKyAgICBpZiAoU1NfcmVnKCZERUJVR19jb250ZXh0KSA9PSBXSU5FX0RBVEFfU0VMRUNUT1IpICAvKiAzMi1iaXQgbW9kZSAqLwogICAgIHsKLSAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgYWRkci5zZWcgPSAwOworICAgICAgICBhZGRyLm9mZiA9IEVJUF9yZWcoJkRFQlVHX2NvbnRleHQpOworCWZyYW1lc1swXS5laXAgPSBhZGRyLm9mZjsKKwlERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsICZmcmFtZXNbMF0uZnJhbWUuc3ltLCAwLCAKKwkJCQkJCSZmcmFtZXNbMF0uZnJhbWUubGlzdCk7CisJZnJhbWVzWzBdLmVicCA9IGFkZHIub2ZmID0gRUJQX3JlZygmREVCVUdfY29udGV4dCk7CisJZnJhbWVubysrOworCisgICAgICAgIHdoaWxlIChhZGRyLm9mZikKKyAgICAgICAgeworICAgICAgICAgICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKWFkZHIub2ZmOworICAgICAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCBzaXplb2YoRlJBTUUzMikgKSkgcmV0dXJuOworICAgICAgICAgICAgaWYgKCFmcmFtZS0+aXApIGJyZWFrOworICAgICAgICAgICAgbmZyYW1lKys7CisgICAgICAgICAgICBmcmFtZXMgPSAoc3RydWN0IGJ0X2luZm8gKil4cmVhbGxvYyhmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZnJhbWUqc2l6ZW9mKHN0cnVjdCBidF9pbmZvKSk7CisgICAgICAgICAgICBhZGRyLm9mZiA9IGZyYW1lLT5pcDsKKwkgICAgZnJhbWVzW2ZyYW1lbm9dLmVpcCA9IGFkZHIub2ZmOworCSAgICBmcmFtZXNbZnJhbWVub10uZWJwID0gZnJhbWUtPmJwOworCSAgICBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggJmFkZHIsIFRSVUUsIAorCQkJCSAgICAgJmZyYW1lc1tmcmFtZW5vXS5mcmFtZS5zeW0sIGZyYW1lLT5icCwgCisJCQkJICAgICAmZnJhbWVzW2ZyYW1lbm9dLmZyYW1lLmxpc3QpOworCSAgICBmcmFtZW5vKys7CisgICAgICAgICAgICBhZGRyLm9mZiA9IGZyYW1lLT5icDsKKyAgICAgICAgfQogICAgIH0KLQotICBjdXJyX2Z1bmMgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWU7Ci0KLSAgLyoKLSAgICogSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzLCB0aGVuIHdlIGFsc28gaGF2ZQotICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgotICAgKi8KLSAgaWYoIGN1cnJfZnVuYyA9PSBOVUxMICkKLSAgICB7Ci0gICAgICByZXR1cm4gRkFMU0U7Ci0gICAgfQotCi0gIGZvcihpPTA7IGkgPCBjdXJyX2Z1bmMtPm5fbG9jYWxzOyBpKysgKQorICAgIGVsc2UgIC8qIDE2LWJpdCBtb2RlICovCiAgICAgewogICAgICAgLyoKLSAgICAgICAqIFRlc3QgdGhlIHJhbmdlIG9mIHZhbGlkaXR5IG9mIHRoZSBsb2NhbCB2YXJpYWJsZS4gIFRoaXMKLSAgICAgICAqIGNvbWVzIHVwIHdpdGggUkJSQUMvTEJSQUMgc3RhYnMgaW4gcGFydGljdWxhci4KKyAgICAgICAqIE5vdCBpbXBsZW1lbnRlZCBoZXJlLiAgSSBhbSBub3QgZW50aXJlbHkgc3VyZSBob3cgYmVzdCB0byBoYW5kbGUKKyAgICAgICAqIHRoaXMgc3R1ZmYuCiAgICAgICAgKi8KLSAgICAgIGlmKCAgICAoY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnBjX3N0YXJ0ICE9IDApCi0JICAmJiAoKGZyYW1lc1tjdXJyX2ZyYW1lXS5laXAgLSBjdXJyX2Z1bmMtPmFkZHIub2ZmKSAKLQkgICAgICA8IGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19zdGFydCkgKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLQotICAgICAgaWYoICAgIChjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ucGNfZW5kICE9IDApCi0JICAmJiAoKGZyYW1lc1tjdXJyX2ZyYW1lXS5laXAgLSBjdXJyX2Z1bmMtPmFkZHIub2ZmKSAKLQkgICAgICA+IGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19lbmQpICkKLQl7Ci0JICBjb250aW51ZTsKLQl9Ci0KLSAgICAgIGlmKCBzdHJjbXAobmFtZSwgY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLm5hbWUpID09IDAgKQotCXsKLQkgIC8qCi0JICAgKiBPSywgd2UgZm91bmQgaXQuICBOb3cgZmlndXJlIG91dCB3aGF0IHRvIGRvIHdpdGggdGhpcy4KLQkgICAqLwotCSAgaWYoIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5yZWdubyAhPSAwICkKLQkgICAgewotCSAgICAgIC8qCi0JICAgICAgICogUmVnaXN0ZXIgdmFyaWFibGUuICBXZSBkb24ndCBrbm93IGhvdyB0byB0cmVhdAotCSAgICAgICAqIHRoaXMgeWV0LgotCSAgICAgICAqLwotCSAgICAgIHJldHVybiBGQUxTRTsKLQkgICAgfQotCi0JICBhZGRyLT5zZWcgPSAwOwotCSAgYWRkci0+b2ZmID0gZnJhbWVzW2N1cnJfZnJhbWVdLmVicCArIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5vZmZzZXQ7Ci0KLQkgIHJldHVybiBUUlVFOwotCX0KICAgICB9Ci0gIHJldHVybiBGQUxTRTsKIH0KIAogaW50CiBERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpCiB7CiAgIGludAkJcnRuID0gRkFMU0U7Ci0gIC8qCi0gICAqIE5vdGhpbmcgZm9yIG5vdy4gIEFkZCBzdXBwb3J0IGxhdGVyLgotICAgKi8KIAogICBjdXJyX2ZyYW1lID0gbmV3ZnJhbWU7CisKKyAgaWYoIGN1cnJfZnJhbWUgPj0gbmZyYW1lICkKKyAgICB7CisgICAgICBjdXJyX2ZyYW1lID0gbmZyYW1lIC0gMTsKKyAgICB9CisKICAgaWYoIGN1cnJfZnJhbWUgPCAwICkKICAgICB7CiAgICAgICBjdXJyX2ZyYW1lID0gMDsKICAgICB9CiAKLSAgaWYoIGN1cnJfZnJhbWUgPj0gbmZyYW1lICkKKyAgIGlmKCBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWUubGlzdC5zb3VyY2VmaWxlICE9IE5VTEwgKQogICAgIHsKLSAgICAgIGN1cnJfZnJhbWUgPSBuZnJhbWUgLSAxOworICAgICAgREVCVUdfTGlzdCgmZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLmxpc3QsIE5VTEwsIDApOwogICAgIH0KIAogICBydG4gPSBUUlVFOwpAQCAtMjQ4LDEzICsyMjksOSBAQAogfQogCiBpbnQKLURFQlVHX0luZm9Mb2NhbHMoKQorREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgdW5zaWduZWQgaW50ICogZWlwLAorCQkgICAgICB1bnNpZ25lZCBpbnQgKiBlYnApCiB7Ci0gIHN0cnVjdCBuYW1lX2hhc2ggKiBjdXJyX2Z1bmM7Ci0gIGludAkJICAgICBpOwotICBpbnQJCXJ0biA9IEZBTFNFOwotICB1bnNpZ25lZAlpbnQgKiBwdHI7Ci0KICAgLyoKICAgICogSWYgd2UgZG9uJ3QgaGF2ZSBhIHZhbGlkIGJhY2t0cmFjZSwgdGhlbiBqdXN0IHJldHVybi4KICAgICovCkBAIC0yNjMsNTQgKzI0MCwxOSBAQAogICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICBjdXJyX2Z1bmMgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZnJhbWU7Ci0KICAgLyoKICAgICogSWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzLCB0aGVuIHdlIGFsc28gaGF2ZQogICAgKiBub3RoaW5nIHRvIHJlcG9ydCBoZXJlLgogICAgKi8KLSAgaWYoIGN1cnJfZnVuYyA9PSBOVUxMICkKKyAgaWYoIGZyYW1lc1tjdXJyX2ZyYW1lXS5mcmFtZS5zeW0gPT0gTlVMTCApCiAgICAgewogICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KIAotICBmb3IoaT0wOyBpIDwgY3Vycl9mdW5jLT5uX2xvY2FsczsgaSsrICkKLSAgICB7Ci0gICAgICAvKgotICAgICAgICogVGVzdCB0aGUgcmFuZ2Ugb2YgdmFsaWRpdHkgb2YgdGhlIGxvY2FsIHZhcmlhYmxlLiAgVGhpcwotICAgICAgICogY29tZXMgdXAgd2l0aCBSQlJBQy9MQlJBQyBzdGFicyBpbiBwYXJ0aWN1bGFyLgotICAgICAgICovCi0gICAgICBpZiggICAgKGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19zdGFydCAhPSAwKQotCSAgJiYgKChmcmFtZXNbY3Vycl9mcmFtZV0uZWlwIC0gY3Vycl9mdW5jLT5hZGRyLm9mZikgCi0JICAgICAgPCBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ucGNfc3RhcnQpICkKLQl7Ci0JICBjb250aW51ZTsKLQl9CisgICpuYW1lID0gZnJhbWVzW2N1cnJfZnJhbWVdLmZyYW1lLnN5bTsKKyAgKmVpcCA9IGZyYW1lc1tjdXJyX2ZyYW1lXS5laXA7CisgICplYnAgPSBmcmFtZXNbY3Vycl9mcmFtZV0uZWJwOwogCi0gICAgICBpZiggICAgKGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5wY19lbmQgIT0gMCkKLQkgICYmICgoZnJhbWVzW2N1cnJfZnJhbWVdLmVpcCAtIGN1cnJfZnVuYy0+YWRkci5vZmYpIAotCSAgICAgID4gY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnBjX2VuZCkgKQotCXsKLQkgIGNvbnRpbnVlOwotCX0KLSAgICAgIAotICAgICAgaWYoIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5vZmZzZXQgPT0gMCApCi0JewotCSAgZnByaW50ZihzdGRlcnIsICIlczolcyBvcHRpbWl6ZWQgaW50byByZWdpc3RlciAkJXMgXG4iLAotCQkgIGN1cnJfZnVuYy0+bmFtZSwgY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLm5hbWUsCi0JCSAgcmVnX25hbWVbY3Vycl9mdW5jLT5sb2NhbF92YXJzW2ldLnJlZ25vXSk7Ci0JfQotICAgICAgZWxzZQotCXsKLQkgIHB0ciA9ICh1bnNpZ25lZCBpbnQgKikgKGZyYW1lc1tjdXJyX2ZyYW1lXS5lYnAgCi0JCQkJICAgKyBjdXJyX2Z1bmMtPmxvY2FsX3ZhcnNbaV0ub2Zmc2V0KTsKLQkgIGZwcmludGYoc3RkZXJyLCAiJXM6JXMgPT0gMHglOC44eFxuIiwKLQkJICBjdXJyX2Z1bmMtPm5hbWUsIGN1cnJfZnVuYy0+bG9jYWxfdmFyc1tpXS5uYW1lLAotCQkgICpwdHIpOwotCX0KLSAgICB9Ci0KLSAgcnRuID0gVFJVRTsKLQotICByZXR1cm4gKHJ0bik7CisgIHJldHVybiBUUlVFOwogfQorCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci90eXBlcy5jIGIvZGVidWdnZXIvdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFkMDk2Ci0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnZXIvdHlwZXMuYwpAQCAtMCwwICsxLDgwOSBAQAorLyoKKyAqIEZpbGUgdHlwZXMuYyAtIGRhdGF0eXBlIGhhbmRsaW5nIHN0dWZmIGZvciBpbnRlcm5hbCBkZWJ1Z2dlci4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIEVyaWMgWW91bmdkYWxlLgorICoKKyAqIFRoaXMgcmVhbGx5IGRvZXNuJ3QgZG8gbXVjaCBhdCB0aGUgbW9tZW50LCBidXQgaXQgZm9ybXMgdGhlIGZyYW1ld29yaworICogdXBvbiB3aGljaCBmdWxsIHN1cHBvcnQgZm9yIGRhdGF0eXBlIGhhbmRsaW5nIHdpbGwgZXZlbnR1YWxseSBiZSBodW5nLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorCisjaW5jbHVkZSAid2luLmgiCisjaW5jbHVkZSAicGVfaW1hZ2UuaCIKKyNpbmNsdWRlICJwZWV4ZS5oIgorI2luY2x1ZGUgImRlYnVnZ2VyLmgiCisjaW5jbHVkZSAicGVleGUuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKKyNkZWZpbmUgTlJfVFlQRV9IQVNIIDUyMQorCitzdHJ1Y3QgZW5fdmFsdWVzCit7CisgIHN0cnVjdCBlbl92YWx1ZXMqIG5leHQ7CisgIGNoYXIJCSAgKiBuYW1lOworICBpbnQJCSAgICB2YWx1ZTsKK307CisKK3N0cnVjdCBtZW1iZXIKK3sKKyAgc3RydWN0IG1lbWJlciAgICogbmV4dDsKKyAgY2hhcgkJICAqIG5hbWU7CisgIHN0cnVjdCBkYXRhdHlwZSAqIHR5cGU7CisgIGludAkJICAgIG9mZnNldDsKKyAgaW50CQkgICAgc2l6ZTsKK307CisKK3N0cnVjdCBkYXRhdHlwZQoreworICBlbnVtCWRlYnVnX3R5cGUgdHlwZTsKKyAgc3RydWN0IGRhdGF0eXBlICogbmV4dDsKKyAgY2hhciAqIG5hbWU7CisgIHVuaW9uCisgIHsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBjaGFyICAgIGJhc2ljX3R5cGU7CisgICAgICBjaGFyICAqIG91dHB1dF9mb3JtYXQ7CisgICAgICBjaGFyICAgIGJhc2ljX3NpemU7CisgICAgICB1bnNpZ25lZCBiX3NpZ25lZDoxOworICAgIH0gYmFzaWM7CisgICAgc3RydWN0CisgICAgeworICAgICAgdW5zaWduZWQgc2hvcnQgYml0b2ZmOworICAgICAgdW5zaWduZWQgc2hvcnQgbmJpdHM7CisgICAgICBzdHJ1Y3QgZGF0YXR5cGUgKiBiYXNldHlwZTsKKyAgICB9IGJpdGZpZWxkOworCisgICAgc3RydWN0CisgICAgeworICAgICAgc3RydWN0IGRhdGF0eXBlICogcG9pbnRzdG87CisgICAgfSBwb2ludGVyOworICAgIHN0cnVjdAorICAgIHsKKyAgICAgIHN0cnVjdCBkYXRhdHlwZSAqIHJldHR5cGU7CisgICAgfSBmdW5jdDsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQJCXN0YXJ0OworICAgICAgaW50CQllbmQ7CisgICAgICBzdHJ1Y3QgZGF0YXR5cGUgKiBiYXNpY3R5cGU7CisgICAgfSBhcnJheTsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBpbnQJCXNpemU7CisgICAgICBzdHJ1Y3QgbWVtYmVyICogbWVtYmVyczsKKyAgICB9IHN0cnVjdHVyZTsKKyAgICBzdHJ1Y3QKKyAgICB7CisgICAgICBzdHJ1Y3QgZW5fdmFsdWVzICogbWVtYmVyczsKKyAgICB9IGVudW1lcmF0aW9uOworICB9IHVuOworfTsKKworI2RlZmluZQlCQVNJQ19JTlQJCTEKKyNkZWZpbmUgQkFTSUNfQ0hBUgkJMgorI2RlZmluZSBCQVNJQ19MT05HCQkzCisjZGVmaW5lIEJBU0lDX1VJTlQJCTQKKyNkZWZpbmUgQkFTSUNfTFVJCQk1CisjZGVmaW5lIEJBU0lDX0xPTkdMT05HCQk2CisjZGVmaW5lIEJBU0lDX1VMT05HTE9OR0kJNworI2RlZmluZSBCQVNJQ19TSE9SVAkJOAorI2RlZmluZSBCQVNJQ19TSE9SVFVJCQk5CisjZGVmaW5lIEJBU0lDX1NDSEFSCQkxMAorI2RlZmluZSBCQVNJQ19VQ0hBUgkJMTEKKyNkZWZpbmUgQkFTSUNfRkxUCQkxMgorI2RlZmluZSBCQVNJQ19MT05HX0RPVUJMRQkxMworI2RlZmluZSBCQVNJQ19ET1VCTEUJCTE0CisjZGVmaW5lIEJBU0lDX0NNUExYX0lOVAkJMTUKKyNkZWZpbmUgQkFTSUNfQ01QTFhfRkxUCQkxNgorI2RlZmluZSBCQVNJQ19DTVBMWF9EQkwJCTE3CisjZGVmaW5lIEJBU0lDX0NNUExYX0xPTkdfREJMCTE4CisjZGVmaW5lIEJBU0lDX1ZPSUQJCTE5CisKK3N0cnVjdCBkYXRhdHlwZSAqIERFQlVHX1R5cGVJbnQgPSBOVUxMOworc3RydWN0IGRhdGF0eXBlICogREVCVUdfVHlwZUludENvbnN0ID0gTlVMTDsKK3N0cnVjdCBkYXRhdHlwZSAqIERFQlVHX1R5cGVVU0ludCA9IE5VTEw7CitzdHJ1Y3QgZGF0YXR5cGUgKiBERUJVR19UeXBlU3RyaW5nID0gTlVMTDsKKworLyoKKyAqIEFsbCBvZiB0aGUgdHlwZXMgdGhhdCBoYXZlIGJlZW4gZGVmaW5lZCBzbyBmYXIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlX2hhc2hfdGFibGVbTlJfVFlQRV9IQVNIICsgMV07CitzdGF0aWMgc3RydWN0IGRhdGF0eXBlICogcG9pbnRlcl90eXBlcyA9IE5VTEw7CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgdHlwZV9oYXNoKCBjb25zdCBjaGFyICogbmFtZSApCit7CisgICAgdW5zaWduZWQgaW50IGhhc2ggPSAwOworICAgIHVuc2lnbmVkIGludCB0bXA7CisgICAgY29uc3QgY2hhciAqIHA7CisKKyAgICBwID0gbmFtZTsKKworICAgIHdoaWxlICgqcCkgCisgICAgICB7CisJaGFzaCA9IChoYXNoIDw8IDQpICsgKnArKzsKKworCWlmKCAodG1wID0gKGhhc2ggJiAweGYwMDAwMDAwKSkgKQorCSAgeworCSAgICBoYXNoIF49IHRtcCA+PiAyNDsKKwkgIH0KKwloYXNoICY9IH50bXA7CisgICAgICB9CisgICAgcmV0dXJuIGhhc2ggJSBOUl9UWVBFX0hBU0g7Cit9CisKKworc3RhdGljIHN0cnVjdCBkYXRhdHlwZSAqCitERUJVR19Jbml0QmFzaWMoaW50IHR5cGUsIGNoYXIgKiBuYW1lLCBpbnQgc2l6ZSwgaW50IGJfc2lnbmVkLCAKKwkJCSAgICBjaGFyICogb3V0cHV0X2Zvcm1hdCkKK3sKKyAgaW50IGhhc2g7CisKKyAgc3RydWN0IGRhdGF0eXBlICogZHQ7CisgIGR0ID0gKHN0cnVjdCBkYXRhdHlwZSAqKSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZGF0YXR5cGUpKTsKKworICBpZiggZHQgIT0gTlVMTCApCisgICAgeworICAgICAgaWYoIG5hbWUgIT0gTlVMTCApCisJeworCSAgaGFzaCA9IHR5cGVfaGFzaChuYW1lKTsKKwl9CisgICAgICBlbHNlCisJeworCSAgaGFzaCA9IE5SX1RZUEVfSEFTSDsKKwl9CisKKyAgICAgIGR0LT50eXBlID0gQkFTSUM7CisgICAgICBkdC0+bmFtZSA9IG5hbWU7CisgICAgICBkdC0+bmV4dCA9IHR5cGVfaGFzaF90YWJsZVtoYXNoXTsKKyAgICAgIHR5cGVfaGFzaF90YWJsZVtoYXNoXSA9IGR0OworICAgICAgZHQtPnVuLmJhc2ljLmJhc2ljX3R5cGUgPSB0eXBlOworICAgICAgZHQtPnVuLmJhc2ljLmJhc2ljX3NpemUgPSBzaXplOworICAgICAgZHQtPnVuLmJhc2ljLmJfc2lnbmVkID0gYl9zaWduZWQ7CisgICAgICBkdC0+dW4uYmFzaWMub3V0cHV0X2Zvcm1hdCA9IG91dHB1dF9mb3JtYXQ7CisgICAgfQorCisgIHJldHVybiBkdDsKK30KKworc3RydWN0IGRhdGF0eXBlICoKK0RFQlVHX05ld0RhdGFUeXBlKGVudW0gZGVidWdfdHlwZSB4dHlwZSwgY29uc3QgY2hhciAqIHR5cGVuYW1lKQoreworICBzdHJ1Y3QgZGF0YXR5cGUgKiBkdCA9IE5VTEw7CisgIGludCBoYXNoOworCisgIC8qCisgICAqIFRoZSBsYXN0IGJ1Y2tldCBpcyBzcGVjaWFsLCBhbmQgaXMgdXNlZCB0byBob2xkIHR5cGVsZXNzIG5hbWVzLgorICAgKi8KKyAgaWYoIHR5cGVuYW1lID09IE5VTEwgKQorICAgIHsKKyAgICAgIGhhc2ggPSBOUl9UWVBFX0hBU0g7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgaGFzaCA9IHR5cGVfaGFzaCh0eXBlbmFtZSk7CisgICAgfQorCisgIGlmKCB0eXBlbmFtZSAhPSBOVUxMICkKKyAgICB7CisgICAgICBmb3IoIGR0ID0gdHlwZV9oYXNoX3RhYmxlW2hhc2hdOyBkdDsgZHQgPSBkdC0+bmV4dCApCisJeworCSAgaWYoIHh0eXBlICE9IGR0LT50eXBlIHx8IGR0LT5uYW1lID09IE5VTEwgCisJICAgICAgfHwgZHQtPm5hbWVbMF0gIT0gdHlwZW5hbWVbMF0pCisJICAgIHsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgCSAgCisJICBpZiggc3RyY21wKGR0LT5uYW1lLCB0eXBlbmFtZSkgPT0gMCApCisJICAgIHsKKwkgICAgICByZXR1cm4gZHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmKCBkdCA9PSBOVUxMICkKKyAgICB7CisgICAgICBkdCA9IChzdHJ1Y3QgZGF0YXR5cGUgKikgeG1hbGxvYyhzaXplb2Yoc3RydWN0IGRhdGF0eXBlKSk7CisgICAgICAKKyAgICAgIGlmKCBkdCAhPSBOVUxMICkKKwl7CisJICBtZW1zZXQoZHQsIDAsIHNpemVvZigqZHQpKTsKKyAgICAgIAorCSAgZHQtPnR5cGUgPSB4dHlwZTsKKwkgIGlmKCB0eXBlbmFtZSAhPSBOVUxMICkKKwkgICAgeworCSAgICAgIGR0LT5uYW1lID0geHN0cmR1cCh0eXBlbmFtZSk7CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGR0LT5uYW1lID0gTlVMTDsKKwkgICAgfQorCSAgaWYoIHh0eXBlID09IFBPSU5URVIgKQorCSAgICB7CisJICAgICAgZHQtPm5leHQgPSBwb2ludGVyX3R5cGVzOworCSAgICAgIHBvaW50ZXJfdHlwZXMgPSBkdDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgZHQtPm5leHQgPSB0eXBlX2hhc2hfdGFibGVbaGFzaF07CisJICAgICAgdHlwZV9oYXNoX3RhYmxlW2hhc2hdID0gZHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIHJldHVybiBkdDsKK30KKworc3RydWN0IGRhdGF0eXBlICoKK0RFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZShzdHJ1Y3QgZGF0YXR5cGUgKiByZWZ0eXBlKQoreworICBzdHJ1Y3QgZGF0YXR5cGUgKiBkdCA9IE5VTEw7CisKKyAgaWYoIHJlZnR5cGUgIT0gTlVMTCApCisgICAgeworICAgICAgZm9yKCBkdCA9IHBvaW50ZXJfdHlwZXM7IGR0OyBkdCA9IGR0LT5uZXh0ICkKKwl7CisJICBpZiggZHQtPnR5cGUgIT0gUE9JTlRFUiApCisJICAgIHsKKwkgICAgICBjb250aW51ZTsKKwkgICAgfQorCSAgCSAgCisJICBpZiggZHQtPnVuLnBvaW50ZXIucG9pbnRzdG8gPT0gcmVmdHlwZSApCisJICAgIHsKKwkgICAgICByZXR1cm4gZHQ7CisJICAgIH0KKwl9CisgICAgfQorCisgIGlmKCBkdCA9PSBOVUxMICkKKyAgICB7CisgICAgICBkdCA9IChzdHJ1Y3QgZGF0YXR5cGUgKikgeG1hbGxvYyhzaXplb2Yoc3RydWN0IGRhdGF0eXBlKSk7CisgICAgICAKKyAgICAgIGlmKCBkdCAhPSBOVUxMICkKKwl7CisJICBkdC0+dHlwZSA9IFBPSU5URVI7CisJICBkdC0+dW4ucG9pbnRlci5wb2ludHN0byA9IHJlZnR5cGU7CisJICBkdC0+bmV4dCA9IHBvaW50ZXJfdHlwZXM7CisJICBwb2ludGVyX3R5cGVzID0gZHQ7CisJfQorICAgIH0KKworICByZXR1cm4gZHQ7Cit9CisKK3ZvaWQKK0RFQlVHX0luaXRUeXBlcygpCit7CisgIHN0YXRpYyBpbnQgYmVlbmhlcmUgPSAwOworICBzdHJ1Y3QgZGF0YXR5cGUgKiBjaGFydHlwZTsKKworICBpZiggYmVlbmhlcmUrKyAhPSAwICkKKyAgICB7CisgICAgICByZXR1cm47CisgICAgfQorCisgIC8qCisgICAqIFNwZWNpYWwgdmVyc2lvbiBvZiBpbnQgdXNlZCB3aXRoIGNvbnN0YW50cyBvZiB2YXJpb3VzIGtpbmRzLgorICAgKi8KKyAgREVCVUdfVHlwZUludENvbnN0ID0gREVCVUdfSW5pdEJhc2ljKEJBU0lDX0lOVCxOVUxMLDQsMSwiJWQiKTsKKworICAvKgorICAgKiBJbml0aWFsaXplIGEgZmV3IGJ1aWx0aW4gdHlwZXMuCisgICAqLworCisKKyAgREVCVUdfVHlwZUludCA9IERFQlVHX0luaXRCYXNpYyhCQVNJQ19JTlQsImludCIsNCwxLCIlZCIpOworICBjaGFydHlwZSA9IERFQlVHX0luaXRCYXNpYyhCQVNJQ19DSEFSLCJjaGFyIiwxLDEsIiclYyciKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX0xPTkcsImxvbmcgaW50Iiw0LDEsIiVkIik7CisgIERFQlVHX1R5cGVVU0ludCA9IERFQlVHX0luaXRCYXNpYyhCQVNJQ19VSU5ULCJ1bnNpZ25lZCBpbnQiLDQsMCwiJWQiKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX0xVSSwibG9uZyB1bnNpZ25lZCBpbnQiLDQsMCwiJWQiKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX0xPTkdMT05HLCJsb25nIGxvbmcgaW50Iiw4LDEsIiVsZCIpOworICBERUJVR19Jbml0QmFzaWMoQkFTSUNfVUxPTkdMT05HSSwibG9uZyBsb25nIHVuc2lnbmVkIGludCIsOCwwLCIlbGQiKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX1NIT1JULCJzaG9ydCBpbnQiLDIsMSwiJWQiKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX1NIT1JUVUksInNob3J0IHVuc2lnbmVkIGludCIsMiwwLCIlZCIpOworICBERUJVR19Jbml0QmFzaWMoQkFTSUNfU0NIQVIsInNpZ25lZCBjaGFyIiwxLDEsIiclYyciKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX1VDSEFSLCJ1bnNpZ25lZCBjaGFyIiwxLDAsIiclYyciKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX0ZMVCwiZmxvYXQiLDQsMCwiJWYiKTsKKyAgREVCVUdfSW5pdEJhc2ljKEJBU0lDX0xPTkdfRE9VQkxFLCJkb3VibGUiLDgsMCwiJWxmIik7CisgIERFQlVHX0luaXRCYXNpYyhCQVNJQ19ET1VCTEUsImxvbmcgZG91YmxlIiwxMiwwLE5VTEwpOworICBERUJVR19Jbml0QmFzaWMoQkFTSUNfQ01QTFhfSU5ULCJjb21wbGV4IGludCIsOCwxLE5VTEwpOworICBERUJVR19Jbml0QmFzaWMoQkFTSUNfQ01QTFhfRkxULCJjb21wbGV4IGZsb2F0Iiw4LDAsTlVMTCk7CisgIERFQlVHX0luaXRCYXNpYyhCQVNJQ19DTVBMWF9EQkwsImNvbXBsZXggZG91YmxlIiwxNiwwLE5VTEwpOworICBERUJVR19Jbml0QmFzaWMoQkFTSUNfQ01QTFhfTE9OR19EQkwsImNvbXBsZXggbG9uZyBkb3VibGUiLDI0LDAsTlVMTCk7CisgIERFQlVHX0luaXRCYXNpYyhCQVNJQ19WT0lELCJ2b2lkIiwwLDAsTlVMTCk7CisKKyAgREVCVUdfVHlwZVN0cmluZyA9IERFQlVHX05ld0RhdGFUeXBlKFBPSU5URVIsIE5VTEwpOworICBERUJVR19TZXRQb2ludGVyVHlwZShERUJVR19UeXBlU3RyaW5nLCBjaGFydHlwZSk7CisKKyAgLyoKKyAgICogTm93IGluaXRpYWxpemUgdGhlIGJ1aWx0aW5zIGZvciBjb2Rldmlldy4KKyAgICovCisgIERFQlVHX0luaXRDVkRhdGFUeXBlcygpOworCit9CisKK2xvbmcgbG9uZyBpbnQKK0RFQlVHX0dldEV4cHJWYWx1ZShEQkdfQUREUiAqIGFkZHIsIGNoYXIgKiogZm9ybWF0KQoreworICB1bnNpZ25lZCBpbnQgcnRuOworICBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlMiA9IE5VTEw7CisgIHN0cnVjdCBlbl92YWx1ZXMgKiBlOworICBjaGFyICogZGVmX2Zvcm1hdCA9ICIweCV4IjsKKworICBydG4gPSAwOworICBhc3NlcnQoYWRkci0+dHlwZSAhPSBOVUxMKTsKKworICBzd2l0Y2goYWRkci0+dHlwZS0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBCQVNJQzoKKyAgICAgIG1lbWNweSgmcnRuLCAoY2hhciAqKSBhZGRyLT5vZmYsIGFkZHItPnR5cGUtPnVuLmJhc2ljLmJhc2ljX3NpemUpOworICAgICAgaWYoICAgIChhZGRyLT50eXBlLT51bi5iYXNpYy5iX3NpZ25lZCkKKwkgICYmICgoYWRkci0+dHlwZS0+dW4uYmFzaWMuYmFzaWNfc2l6ZSAmIDMpICE9IDApCisJICAmJiAoKHJ0biA+PiAoYWRkci0+dHlwZS0+dW4uYmFzaWMuYmFzaWNfc2l6ZSAqIDggLSAxKSkgIT0gMCkgKQorCXsKKwkgIHJ0biA9IHJ0biB8ICgoLTEpIDw8IChhZGRyLT50eXBlLT51bi5iYXNpYy5iYXNpY19zaXplICogOCkpOworCX0KKyAgICAgIGlmKCBhZGRyLT50eXBlLT51bi5iYXNpYy5vdXRwdXRfZm9ybWF0ICE9IE5VTEwgKQorCXsKKwkgIGRlZl9mb3JtYXQgPSBhZGRyLT50eXBlLT51bi5iYXNpYy5vdXRwdXRfZm9ybWF0OworCX0KKworICAgICAgLyoKKyAgICAgICAqIENoZWNrIGZvciBzaW5nbGUgY2hhcmFjdGVyIHByaW50cyB0aGF0IGFyZSBvdXQgb2YgcmFuZ2UuCisgICAgICAgKi8KKyAgICAgIGlmKCBhZGRyLT50eXBlLT51bi5iYXNpYy5iYXNpY19zaXplID09IDEKKwkgICYmIHN0cmNtcChkZWZfZm9ybWF0LCAiJyVjJyIpID09IDAgCisJICAmJiAoKHJ0biA8IDB4MjApIHx8IChydG4gPiAweDgwKSkgKQorCXsKKwkgIGRlZl9mb3JtYXQgPSAiJWQiOworCX0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgUE9JTlRFUjoKKyAgICAgIGlmICghREJHX0NIRUNLX1JFQURfUFRSKCBhZGRyLCAxICkpIHJldHVybiAwOworICAgICAgcnRuID0gKHVuc2lnbmVkIGludCkgICooKHVuc2lnbmVkIGNoYXIgKiopYWRkci0+b2ZmKTsKKyAgICAgIHR5cGUyID0gYWRkci0+dHlwZS0+dW4ucG9pbnRlci5wb2ludHN0bzsKKyAgICAgIGlmKCB0eXBlMi0+dHlwZSA9PSBCQVNJQyAmJiB0eXBlMi0+dW4uYmFzaWMuYmFzaWNfc2l6ZSA9PSAxICkKKwl7CisJICBkZWZfZm9ybWF0ID0gIlwiJXNcIiI7CisJICBicmVhazsKKwl9CisgICAgICBlbHNlCisJeworCSAgZGVmX2Zvcm1hdCA9ICIweCU4Ljh4IjsKKwl9CisgICAgICBicmVhazsKKyAgICBjYXNlIEFSUkFZOgorICAgIGNhc2UgU1RSVUNUOgorICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoIGFkZHIsIDEgKSkgcmV0dXJuIDA7CisgICAgICBydG4gPSAodW5zaWduZWQgaW50KSAgKigodW5zaWduZWQgY2hhciAqKilhZGRyLT5vZmYpOworICAgICAgZGVmX2Zvcm1hdCA9ICIweCU4Ljh4IjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRU5VTToKKyAgICAgIHJ0biA9ICh1bnNpZ25lZCBpbnQpICAqKCh1bnNpZ25lZCBjaGFyICoqKWFkZHItPm9mZik7CisgICAgICBmb3IoZSA9IGFkZHItPnR5cGUtPnVuLmVudW1lcmF0aW9uLm1lbWJlcnM7IGU7IGUgPSBlLT5uZXh0ICkKKwl7CisJICBpZiggZS0+dmFsdWUgPT0gcnRuICkKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgaWYoIGUgIT0gTlVMTCApCisJeworCSAgcnRuID0gKGludCkgZS0+bmFtZTsKKwkgIGRlZl9mb3JtYXQgPSAiJXMiOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBkZWZfZm9ybWF0ID0gIiVkIjsKKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgcnRuID0gMDsKKyAgICAgIGJyZWFrOworICAgIH0KKworCisgIGlmKCBmb3JtYXQgIT0gTlVMTCApCisgICAgeworICAgICAgKmZvcm1hdCA9IGRlZl9mb3JtYXQ7CisgICAgfQorICByZXR1cm4gcnRuOworfQorCit1bnNpZ25lZCBpbnQKK0RFQlVHX1R5cGVEZXJlZlBvaW50ZXIoREJHX0FERFIgKiBhZGRyLCBzdHJ1Y3QgZGF0YXR5cGUgKiogbmV3dHlwZSkKK3sKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoYXQgdGhpcyByZWFsbHkgbWFrZXMgc2Vuc2UuCisgICAqLworICBpZiggYWRkci0+dHlwZS0+dHlwZSAhPSBQT0lOVEVSICkKKyAgICB7CisgICAgICAqbmV3dHlwZSA9IE5VTEw7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgKm5ld3R5cGUgPSBhZGRyLT50eXBlLT51bi5wb2ludGVyLnBvaW50c3RvOworICByZXR1cm4gKih1bnNpZ25lZCBpbnQqKSAoYWRkci0+b2ZmKTsKK30KKwordW5zaWduZWQgaW50CitERUJVR19GaW5kU3RydWN0RWxlbWVudChEQkdfQUREUiAqIGFkZHIsIGNvbnN0IGNoYXIgKiBlbGVfbmFtZSwgaW50ICogdG1wYnVmKQoreworICBzdHJ1Y3QgbWVtYmVyICogbTsKKyAgdW5zaWduZWQgaW50ICAgIG1hc2s7CisKKyAgLyoKKyAgICogTWFrZSBzdXJlIHRoYXQgdGhpcyByZWFsbHkgbWFrZXMgc2Vuc2UuCisgICAqLworICBpZiggYWRkci0+dHlwZS0+dHlwZSAhPSBTVFJVQ1QgKQorICAgIHsKKyAgICAgIGFkZHItPnR5cGUgPSBOVUxMOworICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICBmb3IobSA9IGFkZHItPnR5cGUtPnVuLnN0cnVjdHVyZS5tZW1iZXJzOyBtOyBtID0gbS0+bmV4dCkKKyAgICB7CisgICAgICBpZiggc3RyY21wKG0tPm5hbWUsIGVsZV9uYW1lKSA9PSAwICkKKwl7CisJICBhZGRyLT50eXBlID0gbS0+dHlwZTsKKwkgIGlmKCAobS0+b2Zmc2V0ICYgNykgIT0gMCB8fCAobS0+c2l6ZSAmIDcpICE9IDApCisJICAgIHsKKwkgICAgICAvKgorCSAgICAgICAqIEJpdGZpZWxkIG9wZXJhdGlvbi4gIFdlIGhhdmUgdG8gZXh0cmFjdCB0aGUgZmllbGQgYW5kIHN0b3JlCisJICAgICAgICogaXQgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyIHNvIHRoYXQgd2UgZ2V0IGl0IGFsbCByaWdodC4KKwkgICAgICAgKi8KKwkgICAgICAqdG1wYnVmID0gKCgqKGludCogKSAoYWRkci0+b2ZmICsgKG0tPm9mZnNldCA+PiAzKSkpID4+IChtLT5vZmZzZXQgJiA3KSk7CisJICAgICAgYWRkci0+b2ZmID0gKGludCkgdG1wYnVmOworCisJICAgICAgbWFzayA9IDB4ZmZmZmZmZmYgPDwgKG0tPnNpemUpOworCSAgICAgICp0bXBidWYgJj0gfm1hc2s7CisJICAgICAgLyoKKwkgICAgICAgKiBPSywgbm93IHdlIGhhdmUgdGhlIGNvcnJlY3QgcGFydCBvZiB0aGUgbnVtYmVyLgorCSAgICAgICAqIENoZWNrIHRvIHNlZSB3aGV0aGVyIHRoZSBiYXNpYyB0eXBlIGlzIHNpZ25lZCBvciBub3QsIGFuZCBpZiBzbywKKwkgICAgICAgKiB3ZSBuZWVkIHRvIHNpZ24gZXh0ZW5kIHRoZSBudW1iZXIuCisJICAgICAgICovCisJICAgICAgaWYoIG0tPnR5cGUtPnR5cGUgPT0gQkFTSUMgJiYgbS0+dHlwZS0+dW4uYmFzaWMuYl9zaWduZWQgIT0gMAorCQkgICYmICgqdG1wYnVmICYgKDEgPDwgKG0tPnNpemUgLSAxKSkpICE9IDAgKQorCQl7CisJCSAgKnRtcGJ1ZiB8PSBtYXNrOworCQl9CisJICAgIH0KKwkgIGVsc2UKKwkgICAgeworCSAgICAgIGFkZHItPm9mZiArPSAobS0+b2Zmc2V0ID4+IDMpOworCSAgICB9CisJICByZXR1cm4gVFJVRTsKKwl9CisgICAgfQorCisgIGFkZHItPnR5cGUgPSBOVUxMOworICByZXR1cm4gRkFMU0U7Cit9CisKK2ludAorREVCVUdfU2V0U3RydWN0U2l6ZShzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgaW50IHNpemUpCit7CisgIGFzc2VydChkdC0+dHlwZSA9PSBTVFJVQ1QpOworICBkdC0+dW4uc3RydWN0dXJlLnNpemUgPSBzaXplOworICBkdC0+dW4uc3RydWN0dXJlLm1lbWJlcnMgPSBOVUxMOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK0RFQlVHX0NvcHlGaWVsZGxpc3Qoc3RydWN0IGRhdGF0eXBlICogZHQsIHN0cnVjdCBkYXRhdHlwZSAqIGR0MikKK3sKKworICBhc3NlcnQoIGR0LT50eXBlID09IGR0Mi0+dHlwZSAmJiAoKGR0LT50eXBlID09IFNUUlVDVCkgfHwgKGR0LT50eXBlID09IEVOVU0pKSk7CisKKyAgaWYoIGR0LT50eXBlID09IFNUUlVDVCApCisgICAgeworICAgICAgZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzID0gZHQyLT51bi5zdHJ1Y3R1cmUubWVtYmVyczsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBkdC0+dW4uZW51bWVyYXRpb24ubWVtYmVycyA9IGR0Mi0+dW4uZW51bWVyYXRpb24ubWVtYmVyczsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorREVCVUdfQWRkU3RydWN0RWxlbWVudChzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgY2hhciAqIG5hbWUsIHN0cnVjdCBkYXRhdHlwZSAqIHR5cGUsIAorCQkgICAgICAgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisgIHN0cnVjdCBtZW1iZXIgKiBtOworICBzdHJ1Y3QgbWVtYmVyICogbGFzdDsKKyAgc3RydWN0IGVuX3ZhbHVlcyAqIGU7CisKKyAgaWYoIGR0LT50eXBlID09IFNUUlVDVCApCisgICAgeworICAgICAgZm9yKGxhc3QgPSBkdC0+dW4uc3RydWN0dXJlLm1lbWJlcnM7IGxhc3Q7IGxhc3QgPSBsYXN0LT5uZXh0KQorCXsKKwkgIGlmKCAgICAobGFzdC0+bmFtZVswXSA9PSBuYW1lWzBdKSAKKwkgICAgICAmJiAoc3RyY21wKGxhc3QtPm5hbWUsIG5hbWUpID09IDApICkKKwkgICAgeworCSAgICAgIHJldHVybiBUUlVFOworCSAgICB9CisJICBpZiggbGFzdC0+bmV4dCA9PSBOVUxMICkKKwkgICAgeworCSAgICAgIGJyZWFrOworCSAgICB9CisJfQorICAgICAgbSA9IChzdHJ1Y3QgbWVtYmVyICopIHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBtZW1iZXIpKTsKKyAgICAgIGlmKCBtID09IEZBTFNFICkKKwl7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgCisgICAgICBtLT5uYW1lID0geHN0cmR1cChuYW1lKTsKKyAgICAgIG0tPnR5cGUgPSB0eXBlOworICAgICAgbS0+b2Zmc2V0ID0gb2Zmc2V0OworICAgICAgbS0+c2l6ZSA9IHNpemU7CisgICAgICBpZiggbGFzdCA9PSBOVUxMICkKKwl7CisJICBtLT5uZXh0ID0gZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzOworCSAgZHQtPnVuLnN0cnVjdHVyZS5tZW1iZXJzID0gbTsKKwl9CisgICAgICBlbHNlCisJeworCSAgbGFzdC0+bmV4dCA9IG07CisJICBtLT5uZXh0ID0gTlVMTDsKKwl9CisgICAgICAvKgorICAgICAgICogSWYgdGhlIGJhc2UgdHlwZSBpcyBiaXRmaWVsZCwgdGhlbiBhZGp1c3QgdGhlIG9mZnNldHMgaGVyZSBzbyB0aGF0IHdlCisgICAgICAgKiBhcmUgYWJsZSB0byBsb29rIHRoaW5ncyB1cCB3aXRob3V0IGxvdHMgb2YgZmFsdGVyLWFsbC4KKyAgICAgICAqLworICAgICAgaWYoIHR5cGUtPnR5cGUgPT0gQklURklFTEQgKQorCXsKKwkgIG0tPm9mZnNldCArPSBtLT50eXBlLT51bi5iaXRmaWVsZC5iaXRvZmY7CisJICBtLT5zaXplID0gbS0+dHlwZS0+dW4uYml0ZmllbGQubmJpdHM7CisJICBtLT50eXBlID0gbS0+dHlwZS0+dW4uYml0ZmllbGQuYmFzZXR5cGU7CisJfQorICAgIH0KKyAgZWxzZSBpZiggZHQtPnR5cGUgPT0gRU5VTSApCisgICAgeworICAgICAgZSA9IChzdHJ1Y3QgZW5fdmFsdWVzICopIHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBlbl92YWx1ZXMpKTsKKyAgICAgIGlmKCBlID09IEZBTFNFICkKKwl7CisJICByZXR1cm4gRkFMU0U7CisJfQorICAgICAgCisgICAgICBlLT5uYW1lID0geHN0cmR1cChuYW1lKTsKKyAgICAgIGUtPnZhbHVlID0gb2Zmc2V0OworICAgICAgZS0+bmV4dCA9IGR0LT51bi5lbnVtZXJhdGlvbi5tZW1iZXJzOworICAgICAgZHQtPnVuLmVudW1lcmF0aW9uLm1lbWJlcnMgPSBlOworICAgIH0KKyAgZWxzZQorICAgIHsKKyAgICAgIGFzc2VydChGQUxTRSk7CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RydWN0IGRhdGF0eXBlICogCitERUJVR19HZXRQb2ludGVyVHlwZShzdHJ1Y3QgZGF0YXR5cGUgKiBkdCkKK3sKKyAgaWYoIGR0LT50eXBlID09IFBPSU5URVIgKQorICAgIHsKKyAgICAgIHJldHVybiBkdC0+dW4ucG9pbnRlci5wb2ludHN0bzsKKyAgICB9CisKKyAgcmV0dXJuIE5VTEw7Cit9CisKK2ludAorREVCVUdfU2V0UG9pbnRlclR5cGUoc3RydWN0IGRhdGF0eXBlICogZHQsIHN0cnVjdCBkYXRhdHlwZSAqIGR0MikKK3sKKyAgc3dpdGNoKGR0LT50eXBlKQorICAgIHsKKyAgICBjYXNlIFBPSU5URVI6CisgICAgICBkdC0+dW4ucG9pbnRlci5wb2ludHN0byA9IGR0MjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRlVOQzoKKyAgICAgIGR0LT51bi5mdW5jdC5yZXR0eXBlID0gZHQyOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGFzc2VydChGQUxTRSk7CisgICAgfQorCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK0RFQlVHX1NldEFycmF5UGFyYW1zKHN0cnVjdCBkYXRhdHlwZSAqIGR0LCBpbnQgbWluLCBpbnQgbWF4LCBzdHJ1Y3QgZGF0YXR5cGUgKiBkdDIpCit7CisgIGFzc2VydChkdC0+dHlwZSA9PSBBUlJBWSk7CisgIGR0LT51bi5hcnJheS5zdGFydCA9IG1pbjsKKyAgZHQtPnVuLmFycmF5LmVuZCAgID0gbWF4OworICBkdC0+dW4uYXJyYXkuYmFzaWN0eXBlID0gZHQyOworCisgIHJldHVybiBUUlVFOworfQorCitpbnQKK0RFQlVHX1NldEJpdGZpZWxkUGFyYW1zKHN0cnVjdCBkYXRhdHlwZSAqIGR0LCBpbnQgb2Zmc2V0LCBpbnQgbmJpdHMsIAorCQkJc3RydWN0IGRhdGF0eXBlICogZHQyKQoreworICBhc3NlcnQoZHQtPnR5cGUgPT0gQklURklFTEQpOworICBkdC0+dW4uYml0ZmllbGQuYml0b2ZmICAgPSBvZmZzZXQ7CisgIGR0LT51bi5iaXRmaWVsZC5uYml0cyAgICA9IG5iaXRzOworICBkdC0+dW4uYml0ZmllbGQuYmFzZXR5cGUgPSBkdDI7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBERUJVR19HZXRPYmplY3RTaXplKHN0cnVjdCBkYXRhdHlwZSAqIGR0KQoreworICBpZiggZHQgPT0gTlVMTCApCisgICAgeworICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgIHN3aXRjaChkdC0+dHlwZSkKKyAgICB7CisgICAgY2FzZSBCQVNJQzoKKyAgICAgIHJldHVybiBkdC0+dW4uYmFzaWMuYmFzaWNfc2l6ZTsKKyAgICBjYXNlIFBPSU5URVI6CisgICAgICByZXR1cm4gc2l6ZW9mKGludCAqKTsKKyAgICBjYXNlIFNUUlVDVDoKKyAgICAgIHJldHVybiBkdC0+dW4uc3RydWN0dXJlLnNpemU7CisgICAgY2FzZSBFTlVNOgorICAgICAgcmV0dXJuIHNpemVvZihpbnQpOworICAgIGNhc2UgQVJSQVk6CisgICAgICByZXR1cm4gKGR0LT51bi5hcnJheS5lbmQgLSBkdC0+dW4uYXJyYXkuc3RhcnQpIAorCSogREVCVUdfR2V0T2JqZWN0U2l6ZShkdC0+dW4uYXJyYXkuYmFzaWN0eXBlKTsKKyAgICBjYXNlIEJJVEZJRUxEOgorICAgICAgLyoKKyAgICAgICAqIEJpdGZpZWxkcyBoYXZlIHRvIGJlIGhhbmRsZWQgc2VwZXJhdGVseSBsYXRlciBvbgorICAgICAgICogd2hlbiB3ZSBpbnNlcnQgdGhlIGVsZW1lbnQgaW50byB0aGUgc3RydWN0dXJlLgorICAgICAgICovCisgICAgICByZXR1cm4gMDsKKyAgICBjYXNlIFRZUEVERUY6CisgICAgY2FzZSBGVU5DOgorICAgIGNhc2UgQ09OU1Q6CisgICAgICBhc3NlcnQoRkFMU0UpOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3Vuc2lnbmVkIGludAorREVCVUdfQXJyYXlJbmRleChEQkdfQUREUiAqIGFkZHIsIERCR19BRERSICogcmVzdWx0LCBpbnQgaW5kZXgpCit7CisgIGludCBzaXplOworCisgIC8qCisgICAqIE1ha2Ugc3VyZSB0aGF0IHRoaXMgcmVhbGx5IG1ha2VzIHNlbnNlLgorICAgKi8KKyAgaWYoIGFkZHItPnR5cGUtPnR5cGUgPT0gUE9JTlRFUiApCisgICAgeworICAgICAgLyoKKyAgICAgICAqIEdldCB0aGUgYmFzZSB0eXBlLCBzbyB3ZSBrbm93IGhvdyBtdWNoIHRvIGluZGV4IGJ5LgorICAgICAgICovCisgICAgICBzaXplID0gREVCVUdfR2V0T2JqZWN0U2l6ZShhZGRyLT50eXBlLT51bi5wb2ludGVyLnBvaW50c3RvKTsKKyAgICAgIHJlc3VsdC0+dHlwZSA9IGFkZHItPnR5cGUtPnVuLnBvaW50ZXIucG9pbnRzdG87CisgICAgICByZXN1bHQtPm9mZiA9ICgqKHVuc2lnbmVkIGludCopIChhZGRyLT5vZmYpKSArIHNpemUgKiBpbmRleDsKKyAgICB9CisgIGVsc2UgaWYgKGFkZHItPnR5cGUtPnR5cGUgPT0gQVJSQVkpCisgICAgeworICAgICAgc2l6ZSA9IERFQlVHX0dldE9iamVjdFNpemUoYWRkci0+dHlwZS0+dW4uYXJyYXkuYmFzaWN0eXBlKTsKKyAgICAgIHJlc3VsdC0+dHlwZSA9IGFkZHItPnR5cGUtPnVuLmFycmF5LmJhc2ljdHlwZTsKKyAgICAgIHJlc3VsdC0+b2ZmID0gYWRkci0+b2ZmICsgc2l6ZSAqIChpbmRleCAtIGFkZHItPnR5cGUtPnVuLmFycmF5LnN0YXJ0KTsKKyAgICB9CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERFQlVHX1ByaW50CisgKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlICdwcmludCcgY29tbWFuZC4KKyAqLwordm9pZCBERUJVR19QcmludCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQsIGludCBsZXZlbCApCit7CisgIERCR19BRERSCSAgYWRkcjE7CisgIGludAkJICBpOworICBzdHJ1Y3QgbWVtYmVyICogbTsKKyAgY2hhcgkJKiBwbnQ7CisgIGludAkJICBzaXplOworICBsb25nIGxvbmcgaW50ICAgdmFsdWU7CisKKyAgaWYgKGNvdW50ICE9IDEpCisgICAgeworICAgICAgZnByaW50Ziggc3RkZXJyLCAiQ291bnQgb3RoZXIgdGhhbiAxIGlzIG1lYW5pbmdsZXNzIGluICdwcmludCcgY29tbWFuZFxuIiApOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmKCBhZGRyLT50eXBlID09IE5VTEwgKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiVW5hYmxlIHRvIGV2YWx1YXRlIGV4cHJlc3Npb25cbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgCisgIGlmKCBmb3JtYXQgPT0gJ2knIHx8IGZvcm1hdCA9PSAncycgfHwgZm9ybWF0ID09ICd3JyB8fCBmb3JtYXQgPT0gJ2InICkKKyAgICB7CisgICAgICBmcHJpbnRmKCBzdGRlcnIsICJGb3JtYXQgc3BlY2lmaWVyICclYycgaXMgbWVhbmluZ2xlc3MgaW4gJ3ByaW50JyBjb21tYW5kXG4iLCBmb3JtYXQgKTsKKyAgICAgIGZvcm1hdCA9ICdcMCc7CisgICAgfQorCisgIHN3aXRjaChhZGRyLT50eXBlLT50eXBlKQorICAgIHsKKyAgICBjYXNlIEJBU0lDOgorICAgIGNhc2UgRU5VTToKKyAgICBjYXNlIENPTlNUOgorICAgIGNhc2UgUE9JTlRFUjoKKyAgICAgIERFQlVHX1ByaW50QmFzaWMoYWRkciwgMSwgZm9ybWF0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgU1RSVUNUOgorICAgICAgZnByaW50ZihzdGRlcnIsICJ7Iik7CisgICAgICBmb3IobSA9IGFkZHItPnR5cGUtPnVuLnN0cnVjdHVyZS5tZW1iZXJzOyBtOyBtID0gbS0+bmV4dCkKKwl7CisJICBhZGRyMSA9ICphZGRyOworCSAgREVCVUdfRmluZFN0cnVjdEVsZW1lbnQoJmFkZHIxLCBtLT5uYW1lLAorCQkJCSAgKGludCAqKSAmdmFsdWUpOworCSAgZnByaW50ZihzdGRlcnIsICIlcz0iLCBtLT5uYW1lKTsKKwkgIERFQlVHX1ByaW50KCZhZGRyMSwgMSwgZm9ybWF0LCBsZXZlbCArIDEpOworCSAgaWYoIG0tPm5leHQgIT0gTlVMTCApCisJICAgIHsKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIiwgIik7CisJICAgIH0KKwl9CisgICAgICBmcHJpbnRmKHN0ZGVyciwgIn0iKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVJSQVk6CisgICAgICAvKgorICAgICAgICogTG9vcCBvdmVyIGFsbCBvZiB0aGUgZW50cmllcywgcHJpbnRpbmcgc3R1ZmYgYXMgd2UgZ28uCisgICAgICAgKi8KKyAgICAgIHNpemUgPSBERUJVR19HZXRPYmplY3RTaXplKGFkZHItPnR5cGUtPnVuLmFycmF5LmJhc2ljdHlwZSk7CisgICAgICBpZiggc2l6ZSA9PSAxICkKKwl7CisJICAvKgorCSAgICogU3BlY2lhbCBoYW5kbGluZyBmb3IgY2hhcmFjdGVyIGFycmF5cy4KKwkgICAqLworCSAgcG50ID0gKGNoYXIgKikgYWRkci0+b2ZmOworCSAgZnByaW50ZihzdGRlcnIsICJcIiIpOworCSAgZm9yKCBpPWFkZHItPnR5cGUtPnVuLmFycmF5LnN0YXJ0OyBpIDwgYWRkci0+dHlwZS0+dW4uYXJyYXkuZW5kOyBpKysgKQorCSAgICB7CisJICAgICAgZnB1dGMoKnBudCsrLCBzdGRlcnIpOworCSAgICB9CisJICBmcHJpbnRmKHN0ZGVyciwgIlwiIik7CisJICBicmVhazsKKwl9CisgICAgICBhZGRyMSA9ICphZGRyOworICAgICAgYWRkcjEudHlwZSA9IGFkZHItPnR5cGUtPnVuLmFycmF5LmJhc2ljdHlwZTsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAieyIpOworICAgICAgZm9yKCBpPWFkZHItPnR5cGUtPnVuLmFycmF5LnN0YXJ0OyBpIDw9IGFkZHItPnR5cGUtPnVuLmFycmF5LmVuZDsgaSsrICkKKwl7CisJICBERUJVR19QcmludCgmYWRkcjEsIDEsIGZvcm1hdCwgbGV2ZWwgKyAxKTsKKwkgIGFkZHIxLm9mZiArPSBzaXplOworCSAgaWYoIGkgPT0gYWRkci0+dHlwZS0+dW4uYXJyYXkuZW5kICkKKwkgICAgeworCSAgICAgIGZwcmludGYoc3RkZXJyLCAifSIpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBmcHJpbnRmKHN0ZGVyciwgIiwgIik7CisJICAgIH0KKwl9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgYXNzZXJ0KEZBTFNFKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICBpZiggbGV2ZWwgPT0gMCApCisgICAgeworICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2RvY3VtZW50YXRpb24vd2luZV9vczIudHh0IGIvZG9jdW1lbnRhdGlvbi93aW5lX29zMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxYzBlMwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3VtZW50YXRpb24vd2luZV9vczIudHh0CkBAIC0wLDAgKzEsMzUgQEAKKwlSdW5uaW5nICYgQ29tcGlsaW5nIFdJTkUgaW4gT1MvMgorCitIZXJlIGlzIHdoYXQgeW91IG5lZWQgdG8gKHRyeSB0bykgY29tcGlsZSBXaW5lIGZvciBPUy8yOgorRU1YIDAuOWMgKGZpeCAyKQorWEZyZWU4NiAzLjIgT1MvMiAod2l0aCBkZXZlbG9wbWVudCBsaWJyYXJpZXMpCitiYXNoLCBnbnUgbWFrZSwgZ3JlcCwgdGFyLCBiaXNvbiwgZmxleAorc2VkIChhIHdvcmtpbmcgY29weSBvZikKK2RpZmYgYW5kIHBhdGNoIGFyZSByZWNvbW1lbmRlZAorCitUbyBjb21waWxlOgorc2gKK3Rvb2xzL21ha2Vfb3MyLnNoCittYWtlIGRlcGVuZAorbWFrZSAobWFrZSBkb2Vzbid0IHdvcmsgeWV0Li4uIEkgd2lsbCBuZWVkIHRvIGRvIHNvbWUgb3RoZXJzIHBhdGNoLCBvcgorICAgICAgeW91IG1heSBkbyBpdC4uLikKKworQ3VycmVudGx5OgorLSBjb25maWd1cmUgYW5kIG1ha2UgZGVwZW5kIHdvcmsuLi4KKy0gbWFrZSBkb2Vzbid0IHdvcmsKKy0gdGhlIHNlbGVjdG9ycyBudW1iZXJzICgwKSBhcmUgd3JvbmcuLi4KKworV2hhdCBuZWVkcyB0byBiZSByZWRvbmU6CitGaWxlIGZ1bmN0aW9ucywgSS9PIGFjY2VzcyAoZG8gaXQhKSwgSW50ZXJydXB0IChpZiBpbnQgdW5rbm93LCBjYWxsCitjdXJyZW50IFJlYWxNb2RlIG9uZS4uLiksIHZlcmlmeSB0aGF0IGV2ZXJ5dGhpbmcgaXMgdGhyZWFkIHNhZmUgKGhvdworZG9lcyBXaW45NS9OVCBoYW5kbGUgbXVsdGktdGhyZWFkPyksIG1vdmUgWCBmdW5jdGlvbnMgaW4gc29tZSBmaWxlcworKGFuZCBtYWtlIGEgd3JhcHBlciwgdG8gdXNlIFBNIGluc3RlYWQgbGF0dGVyKSwgZXRjLi4uCisKK1RoZSBnb29kIHRoaW5nczoKKy0gT1MvMiBoYXZlIERPUyBpbnRlcnJ1cHRzCistIE9TLzIgaGF2ZSBJL08gcG9ydCBhY2Nlc3MKKy0gT1MvMiBoYXZlIG11bHRpLXRocmVhZAorLSBNZXJsaW4gaGF2ZSBPcGVuMzIgKHRvIGJlIHVzZWQgbGF0ZXIuLi4pCisKK1JvYmVydCBQb3VsaW90IDxrcnlub3NAY2xpYy5uZXQ+CitKYW51YXJ5IDksIDE5OTcKZGlmZiAtLWdpdCBhL2ZpbGVzL2RpcmVjdG9yeS5jIGIvZmlsZXMvZGlyZWN0b3J5LmMKaW5kZXggMTU3ZmVhNC4uMWM2NGY3NCAxMDA2NDQKLS0tIGEvZmlsZXMvZGlyZWN0b3J5LmMKKysrIGIvZmlsZXMvZGlyZWN0b3J5LmMKQEAgLTYsMTMgKzYsMTMgQEAKIAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTQzLDI1ICs0MywyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKmRvc19wYXRoLCBjaGFyICoqdW5peF9wYXRoICkKIHsKICAgICBjaGFyIHBhdGhbTUFYX1BBVEhOQU1FX0xFTl07Ci0gICAgY29uc3QgY2hhciAqZG9zX25hbWUgLCp1bml4X25hbWU7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CisKICAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOwogCiAgICAgUFJPRklMRV9HZXRXaW5lSW5pU3RyaW5nKCAid2luZSIsIGtleW5hbWUsIGRlZnZhbCwgcGF0aCwgc2l6ZW9mKHBhdGgpICk7Ci0gICAgaWYgKCEodW5peF9uYW1lID0gRE9TRlNfR2V0VW5peEZpbGVOYW1lKCBwYXRoLCBUUlVFICkpIHx8Ci0gICAgICAgICFGSUxFX1N0YXQoIHVuaXhfbmFtZSwgJmluZm8gKSB8fAorICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIFRSVUUsICZmdWxsX25hbWUgKSB8fAorICAgICAgICAhRklMRV9TdGF0KCBmdWxsX25hbWUubG9uZ19uYW1lLCAmaW5mbyApIHx8CiAgICAgICAgICEoaW5mby5kd0ZpbGVBdHRyaWJ1dGVzICYgRklMRV9BVFRSSUJVVEVfRElSRUNUT1JZKSkKICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBwYXRoICclcycgZm9yICVzIGRpcmVjdG9yeVxuIiwgcGF0aCwga2V5bmFtZSk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICBpZiAoIShkb3NfbmFtZSA9IERPU0ZTX0dldERvc1RydWVOYW1lKCB1bml4X25hbWUsIFRSVUUgKSkpCi0gICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3QgZ2V0IERPUyBuYW1lIGZvciAlcyBkaXJlY3RvcnkgJyVzJ1xuIiwKLSAgICAgICAgICAgICAgICAga2V5bmFtZSwgdW5peF9uYW1lICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAqdW5peF9wYXRoID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCB1bml4X25hbWUgKTsKLSAgICAqZG9zX3BhdGggID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBkb3NfbmFtZSApOworICAgICp1bml4X3BhdGggPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKKyAgICAqZG9zX3BhdGggID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBmdWxsX25hbWUuc2hvcnRfbmFtZSApOwogICAgIHJldHVybiAxOwogfQogCkBAIC03Miw3ICs2Nyw3IEBACiB2b2lkIERJUl9QYXJzZVdpbmRvd3NQYXRoKCBjaGFyICpwYXRoICkKIHsKICAgICBjaGFyICpwOwotICAgIGNvbnN0IGNoYXIgKmRvc19uYW1lICwqdW5peF9uYW1lOworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAgICAgaW50IGk7CiAKQEAgLTg3LDIyICs4MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgTUFYX1BBVEhfRUxFTUVOVFMgKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICghKHVuaXhfbmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggcGF0aCwgVFJVRSApKSB8fAotICAgICAgICAgICAgIUZJTEVfU3RhdCggdW5peF9uYW1lLCAmaW5mbyApIHx8CisgICAgICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIFRSVUUsICZmdWxsX25hbWUgKSB8fAorICAgICAgICAgICAgIUZJTEVfU3RhdCggZnVsbF9uYW1lLmxvbmdfbmFtZSwgJmluZm8gKSB8fAogICAgICAgICAgICAgIShpbmZvLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpKQogICAgICAgICB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiV2FybmluZzogaW52YWxpZCBkaXIgJyVzJyBpbiBwYXRoLCBkZWxldGluZyBpdC5cbiIsCiAgICAgICAgICAgICAgICAgICAgIHBhdGggKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlmICghKGRvc19uYW1lID0gRE9TRlNfR2V0RG9zVHJ1ZU5hbWUoIHVuaXhfbmFtZSwgVFJVRSApKSkKLSAgICAgICAgewotICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiV2FybmluZzogY291bGQgbm90IGdldCBET1MgbmFtZSBmb3IgJyVzJyBpbiBwYXRoLCBkZWxldGluZyBpdC5cbiIsCi0gICAgICAgICAgICAgICAgICAgICB1bml4X25hbWUgKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIERJUl9Vbml4UGF0aFtESVJfUGF0aEVsZW1lbnRzXSA9IEhFQVBfc3RyZHVwQShTeXN0ZW1IZWFwLDAsdW5peF9uYW1lKTsKLSAgICAgICAgRElSX0Rvc1BhdGhbRElSX1BhdGhFbGVtZW50c10gID0gSEVBUF9zdHJkdXBBKFN5c3RlbUhlYXAsMCxkb3NfbmFtZSk7CisgICAgICAgIERJUl9Vbml4UGF0aFtESVJfUGF0aEVsZW1lbnRzXSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUubG9uZ19uYW1lICk7CisgICAgICAgIERJUl9Eb3NQYXRoW0RJUl9QYXRoRWxlbWVudHNdICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUuc2hvcnRfbmFtZSApOwogICAgICAgICBESVJfUGF0aEVsZW1lbnRzKys7CiAgICAgfQogCkBAIC0xMzcsOSArMTI4LDggQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLSAgICAgICAgY3dkID0gRE9TRlNfR2V0RG9zVHJ1ZU5hbWUoIHBhdGgsIFRSVUUgKTsKICAgICAgICAgRFJJVkVfU2V0Q3VycmVudERyaXZlKCBkcml2ZSApOwotICAgICAgICBEUklWRV9DaGRpciggZHJpdmUsIGN3ZCArIDIgKTsKKyAgICAgICAgRFJJVkVfQ2hkaXIoIGRyaXZlLCBjd2QgKTsKICAgICB9CiAKICAgICBpZiAoIShESVJfR2V0UGF0aCggIndpbmRvd3MiLCAiYzpcXHdpbmRvd3MiLApAQCAtMzQ0LDcgKzMzNCw4IEBACiAgKi8KIEJPT0wzMiBDcmVhdGVEaXJlY3RvcnkzMkEoIExQQ1NUUiBwYXRoLCBMUFNFQ1VSSVRZX0FUVFJJQlVURVMgbHBzZWNhdHRyaWJzICkKIHsKLSAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKKyAgICBMUENTVFIgdW5peE5hbWU7CiAKICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkNyZWF0ZURpcmVjdG9yeTMyQSglcywlcClcbiIsIHBhdGgsIGxwc2VjYXR0cmlicyApOwogICAgIGlmICgodW5peE5hbWUgPSBET1NGU19Jc0RldmljZSggcGF0aCApKSAhPSBOVUxMKQpAQCAtMzUzLDggKzM0NCw4IEBACiAgICAgICAgIERPU19FUlJPUiggRVJfQWNjZXNzRGVuaWVkLCBFQ19BY2Nlc3NEZW5pZWQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKCEodW5peE5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIHBhdGgsIEZBTFNFICkpKSByZXR1cm4gMDsKLSAgICBpZiAoKG1rZGlyKCB1bml4TmFtZSwgMDc3NyApID09IC0xKSAmJiAoZXJybm8gIT0gRUVYSVNUKSkKKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBwYXRoLCBGQUxTRSwgJmZ1bGxfbmFtZSApKSByZXR1cm4gMDsKKyAgICBpZiAoKG1rZGlyKCBmdWxsX25hbWUubG9uZ19uYW1lLCAwNzc3ICkgPT0gLTEpICYmIChlcnJubyAhPSBFRVhJU1QpKQogICAgIHsKICAgICAgICAgRklMRV9TZXREb3NFcnJvcigpOwogICAgICAgICByZXR1cm4gRkFMU0U7CkBAIC00MDksNyArNDAwLDggQEAKICAqLwogQk9PTDMyIFJlbW92ZURpcmVjdG9yeTMyQSggTFBDU1RSIHBhdGggKQogewotICAgIGNvbnN0IGNoYXIgKnVuaXhOYW1lOworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOworICAgIExQQ1NUUiB1bml4TmFtZTsKIAogICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJSZW1vdmVEaXJlY3Rvcnk6ICclcydcbiIsIHBhdGggKTsKIApAQCAtNDE5LDggKzQxMSw4IEBACiAgICAgICAgIERPU19FUlJPUiggRVJfRmlsZU5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgIH0KLSAgICBpZiAoISh1bml4TmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggcGF0aCwgVFJVRSApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmIChybWRpciggdW5peE5hbWUgKSA9PSAtMSkKKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBwYXRoLCBUUlVFLCAmZnVsbF9uYW1lICkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAocm1kaXIoIGZ1bGxfbmFtZS5sb25nX25hbWUgKSA9PSAtMSkKICAgICB7CiAgICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtNDQyLDYgKzQzNCw1NiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERJUl9UcnlQYXRoCisgKgorICogSGVscGVyIGZ1bmN0aW9uIGZvciBESVJfU2VhcmNoUGF0aC4KKyAqLworc3RhdGljIEJPT0wzMiBESVJfVHJ5UGF0aCggTFBDU1RSIHVuaXhfZGlyLCBMUENTVFIgZG9zX2RpciwgTFBDU1RSIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBET1NfRlVMTF9OQU1FICpmdWxsX25hbWUgKQoreworICAgIExQU1RSIHBfbCA9IGZ1bGxfbmFtZS0+bG9uZ19uYW1lICsgc3RybGVuKHVuaXhfZGlyKSArIDE7CisgICAgTFBTVFIgcF9zID0gZnVsbF9uYW1lLT5zaG9ydF9uYW1lICsgc3RybGVuKGRvc19kaXIpICsgMTsKKworICAgIGlmICgocF9zID49IGZ1bGxfbmFtZS0+c2hvcnRfbmFtZSArIHNpemVvZihmdWxsX25hbWUtPnNob3J0X25hbWUpIC0gMTQpIHx8CisgICAgICAgIChwX2wgPj0gZnVsbF9uYW1lLT5sb25nX25hbWUgKyBzaXplb2YoZnVsbF9uYW1lLT5sb25nX25hbWUpIC0gMSkpCisgICAgeworICAgICAgICBET1NfRVJST1IoIEVSX1BhdGhOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKCFET1NGU19GaW5kVW5peE5hbWUoIHVuaXhfZGlyLCBuYW1lLCBwX2wsCisgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZ1bGxfbmFtZS0+bG9uZ19uYW1lKSAtIChwX2wgLSBmdWxsX25hbWUtPmxvbmdfbmFtZSksCisgICAgICAgICAgICAgICAgICAgcF9zLCBEUklWRV9HZXRGbGFncyggZG9zX2RpclswXSAtICdBJyApICkpCisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICBzdHJjcHkoIGZ1bGxfbmFtZS0+bG9uZ19uYW1lLCB1bml4X2RpciApOworICAgIHBfbFstMV0gPSAnLyc7CisgICAgc3RyY3B5KCBmdWxsX25hbWUtPnNob3J0X25hbWUsIGRvc19kaXIgKTsKKyAgICBwX3NbLTFdID0gJ1xcJzsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBESVJfVHJ5TW9kdWxlUGF0aAorICoKKyAqIEhlbHBlciBmdW5jdGlvbiBmb3IgRElSX1NlYXJjaFBhdGguCisgKi8KK3N0YXRpYyBCT09MMzIgRElSX1RyeU1vZHVsZVBhdGgoIExQQ1NUUiBuYW1lLCBET1NfRlVMTF9OQU1FICpmdWxsX25hbWUgKQoreworICAgIC8qIEZJWE1FOiBmb3Igbm93LCBHZXRNb2R1bGVGaWxlTmFtZTMyQSBjYW4ndCByZXR1cm4gbW9yZSAqLworICAgIC8qIHRoYW4gT0ZTX01BWFBBVEhOQU1FLiBUaGlzIG1heSBjaGFuZ2Ugd2l0aCBXaW4zMi4gKi8KKyAgICBjaGFyIGJ1ZmZlcltPRlNfTUFYUEFUSE5BTUVdOworICAgIExQU1RSIHA7CisKKyAgICBpZiAoIUdldEN1cnJlbnRUYXNrKCkpIHJldHVybiBGQUxTRTsKKyAgICBHZXRNb2R1bGVGaWxlTmFtZTMyQSggR2V0Q3VycmVudFRhc2soKSwgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOworICAgIGlmICghKHAgPSBzdHJyY2hyKCBidWZmZXIsICdcXCcgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoc2l6ZW9mKGJ1ZmZlcikgLSAoKytwIC0gYnVmZmVyKSA8PSBzdHJsZW4obmFtZSkpIHJldHVybiBGQUxTRTsKKyAgICBzdHJjcHkoIHAsIG5hbWUgKTsKKyAgICByZXR1cm4gRE9TRlNfR2V0RnVsbE5hbWUoIGJ1ZmZlciwgVFJVRSwgZnVsbF9uYW1lICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRElSX1NlYXJjaFBhdGgKICAqCiAgKiBJbXBsZW1lbnRhdGlvbiBvZiBTZWFyY2hQYXRoMzJBLiAnd2luMzInIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZWFyY2gKQEAgLTQ1MCwxNyArNDkyLDI0IEBACiAgKiBGSVhNRTogc2hvdWxkIHJldHVybiBsb25nIHBhdGggbmFtZXMuCiAgKi8KIERXT1JEIERJUl9TZWFyY2hQYXRoKCBMUENTVFIgcGF0aCwgTFBDU1RSIG5hbWUsIExQQ1NUUiBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgRFdPUkQgYnVmbGVuLCBMUFNUUiBidWZmZXIsIExQU1RSICpsYXN0cGFydCwKLSAgICAgICAgICAgICAgICAgICAgICBCT09MMzIgd2luMzIgKQorICAgICAgICAgICAgICAgICAgICAgIERPU19GVUxMX05BTUUgKmZ1bGxfbmFtZSwgQk9PTDMyIHdpbjMyICkKIHsKICAgICBEV09SRCBsZW47Ci0gICAgTFBTVFIgdG1wOworICAgIExQQ1NUUiBwOwogICAgIGludCBpOworICAgIExQU1RSIHRtcCA9IE5VTEw7CisgICAgQk9PTDMyIHJldCA9IFRSVUU7CiAKICAgICAvKiBGaXJzdCBjaGVjayB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycyAqLwogCi0gICAgaWYgKHN0cmNociggbmFtZSwgJy4nICkpIGV4dCA9IE5VTEw7ICAvKiBJZ25vcmUgdGhlIHNwZWNpZmllZCBleHRlbnNpb24gKi8KKyAgICBpZiAoIShwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgcCA9IG5hbWU7CisgICAgaWYgKCEocCA9IHN0cnJjaHIoIHAsICcvJyApKSkgcCA9IG5hbWU7CisgICAgaWYgKHN0cmNociggcCwgJy4nICkpIGV4dCA9IE5VTEw7ICAvKiBJZ25vcmUgdGhlIHNwZWNpZmllZCBleHRlbnNpb24gKi8KKyAgICBpZiAoKCpuYW1lICYmIChuYW1lWzFdID09ICc6JykpIHx8CisgICAgICAgIHN0cmNociggbmFtZSwgJy8nICkgfHwgc3RyY2hyKCBuYW1lLCAnXFwnICkpCisgICAgICAgIHBhdGggPSBOVUxMOyAgLyogSWdub3JlIHBhdGggaWYgbmFtZSBhbHJlYWR5IGNvbnRhaW5zIGEgcGF0aCAqLwogICAgIGlmIChwYXRoICYmICEqcGF0aCkgcGF0aCA9IE5VTEw7ICAvKiBJZ25vcmUgZW1wdHkgcGF0aCAqLworCiAgICAgbGVuID0gc3RybGVuKG5hbWUpOwogICAgIGlmIChleHQpIGxlbiArPSBzdHJsZW4oZXh0KTsKICAgICBpZiAocGF0aCkgbGVuICs9IHN0cmxlbihwYXRoKSArIDE7CkBAIC00ODIsMTEwICs1MzEsNTIgQEAKICAgICAgICAgfQogICAgICAgICBlbHNlIHN0cmNweSggdG1wLCBuYW1lICk7CiAgICAgICAgIGlmIChleHQpIHN0cmNhdCggdG1wLCBleHQgKTsKKyAgICAgICAgbmFtZSA9IHRtcDsKICAgICB9Ci0gICAgZWxzZSB0bXAgPSAoTFBTVFIpbmFtZTsKICAgICAKICAgICAvKiBJZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHBhdGgsIGV2ZXJ5dGhpbmcncyBlYXN5ICovCiAKLSAgICBpZiAocGF0aCB8fCAoKnRtcCAmJiAodG1wWzFdID09ICc6JykpIHx8Ci0gICAgICAgIHN0cmNociggdG1wLCAnLycgKSB8fCBzdHJjaHIoIHRtcCwgJ1xcJyApKQorICAgIGlmIChwYXRoIHx8ICgqbmFtZSAmJiAobmFtZVsxXSA9PSAnOicpKSB8fAorICAgICAgICBzdHJjaHIoIG5hbWUsICcvJyApIHx8IHN0cmNociggbmFtZSwgJ1xcJyApKQogICAgIHsKLSAgICAgICAgaWYgKCFET1NGU19HZXRVbml4RmlsZU5hbWUoIHRtcCwgVFJVRSApKSBnb3RvIG5vdF9mb3VuZDsKLSAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgdG1wLCBidWZsZW4gKTsKLSAgICAgICAgaWYgKHRtcCAhPSBuYW1lKSBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdG1wICk7Ci0gICAgICAgIHJldHVybiBsZW47CisgICAgICAgIHJldCA9IERPU0ZTX0dldEZ1bGxOYW1lKCBuYW1lLCBUUlVFLCBmdWxsX25hbWUgKTsKKyAgICAgICAgZ290byBkb25lOwogICAgIH0KIAogICAgIC8qIFRyeSB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCBleGVjdXRhYmxlIChmb3IgV2luMzIgc2VhcmNoIG9yZGVyKSAqLwogCi0gICAgaWYgKHdpbjMyICYmIEdldEN1cnJlbnRUYXNrKCkpCi0gICAgewotICAgICAgICBMUFNUUiBwOwotICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZTMyQSggR2V0Q3VycmVudFRhc2soKSwgYnVmZmVyLCBidWZsZW4gKTsKLSAgICAgICAgaWYgKChwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsc3RyY3B5bjMyQSggcCArIDEsIHRtcCwgKElOVDMyKWJ1ZmxlbiAtIChwIC0gYnVmZmVyKSApOwotICAgICAgICAgICAgaWYgKERPU0ZTX0dldFVuaXhGaWxlTmFtZSggYnVmZmVyLCBUUlVFICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKHdpbjMyICYmIERJUl9UcnlNb2R1bGVQYXRoKCBuYW1lLCBmdWxsX25hbWUgKSkgZ290byBkb25lOwogCiAgICAgLyogVHJ5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSAqLwogCi0gICAgaWYgKERPU0ZTX0dldFVuaXhGaWxlTmFtZSggdG1wLCBUUlVFICkpCi0gICAgewotICAgICAgICBHZXRDdXJyZW50RGlyZWN0b3J5MzJBKCBidWZsZW4sIGJ1ZmZlciApOwotICAgICAgICBnb3RvIGZvdW5kOwotICAgIH0KKyAgICBpZiAoRE9TRlNfR2V0RnVsbE5hbWUoIG5hbWUsIFRSVUUsIGZ1bGxfbmFtZSApKSBnb3RvIGRvbmU7CiAKICAgICAvKiBUcnkgdGhlIFdpbmRvd3MgZGlyZWN0b3J5ICovCiAKLSAgICBpZiAoRE9TRlNfRmluZFVuaXhOYW1lKCBESVJfV2luZG93c1VuaXhEaXIsIG5hbWUsIE5VTEwsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVfR2V0RmxhZ3MoIERJUl9XaW5kb3dzRG9zRGlyWzBdIC0gJ0EnICkgKSkKLSAgICB7Ci0gICAgICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIERJUl9XaW5kb3dzRG9zRGlyLCBidWZsZW4gKTsKLSAgICAgICAgZ290byBmb3VuZDsKLSAgICB9CisgICAgaWYgKERJUl9UcnlQYXRoKCBESVJfV2luZG93c1VuaXhEaXIsIERJUl9XaW5kb3dzRG9zRGlyLCBuYW1lLCBmdWxsX25hbWUgKSkKKyAgICAgICAgZ290byBkb25lOwogCiAgICAgLyogVHJ5IHRoZSBXaW5kb3dzIHN5c3RlbSBkaXJlY3RvcnkgKi8KIAotICAgIGlmIChET1NGU19GaW5kVW5peE5hbWUoIERJUl9TeXN0ZW1Vbml4RGlyLCBuYW1lLCBOVUxMLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERSSVZFX0dldEZsYWdzKCBESVJfU3lzdGVtRG9zRGlyWzBdIC0gJ0EnICkgKSkKLSAgICB7Ci0gICAgICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIERJUl9TeXN0ZW1Eb3NEaXIsIGJ1ZmxlbiApOwotICAgICAgICBnb3RvIGZvdW5kOwotICAgIH0KKyAgICBpZiAoRElSX1RyeVBhdGgoIERJUl9TeXN0ZW1Vbml4RGlyLCBESVJfU3lzdGVtRG9zRGlyLCBuYW1lLCBmdWxsX25hbWUgKSkKKyAgICAgICAgZ290byBkb25lOwogCiAgICAgLyogVHJ5IHRoZSBwYXRoIG9mIHRoZSBjdXJyZW50IGV4ZWN1dGFibGUgKGZvciBXaW4xNiBzZWFyY2ggb3JkZXIpICovCiAKLSAgICBpZiAoIXdpbjMyICYmIEdldEN1cnJlbnRUYXNrKCkpCi0gICAgewotICAgICAgICBMUFNUUiBwOwotICAgICAgICBHZXRNb2R1bGVGaWxlTmFtZTMyQSggR2V0Q3VycmVudFRhc2soKSwgYnVmZmVyLCBidWZsZW4gKTsKLSAgICAgICAgaWYgKChwID0gc3RycmNociggYnVmZmVyLCAnXFwnICkpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsc3RyY3B5bjMyQSggcCArIDEsIHRtcCwgKElOVDMyKWJ1ZmxlbiAtIChwIC0gYnVmZmVyKSApOwotICAgICAgICAgICAgaWYgKERPU0ZTX0dldFVuaXhGaWxlTmFtZSggYnVmZmVyLCBUUlVFICkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKnAgPSAnXDAnOwotICAgICAgICAgICAgICAgIGdvdG8gZm91bmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9CisgICAgaWYgKCF3aW4zMiAmJiBESVJfVHJ5TW9kdWxlUGF0aCggbmFtZSwgZnVsbF9uYW1lICkpIGdvdG8gZG9uZTsKKwogICAgIC8qIFRyeSBhbGwgZGlyZWN0b3JpZXMgaW4gcGF0aCAqLwogCiAgICAgZm9yIChpID0gMDsgaSA8IERJUl9QYXRoRWxlbWVudHM7IGkrKykKICAgICB7Ci0gICAgICAgIGlmIChET1NGU19GaW5kVW5peE5hbWUoIERJUl9Vbml4UGF0aFtpXSwgbmFtZSwgTlVMTCwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFJJVkVfR2V0RmxhZ3MoIERJUl9Eb3NQYXRoW2ldWzBdIC0gJ0EnICkgKSkKLSAgICAgICAgewotICAgICAgICAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgRElSX0Rvc1BhdGhbaV0sIGJ1ZmxlbiApOwotICAgICAgICAgICAgZ290byBmb3VuZDsKLSAgICAgICAgfQorICAgICAgICBpZiAoRElSX1RyeVBhdGgoIERJUl9Vbml4UGF0aFtpXSwgRElSX0Rvc1BhdGhbaV0sIG5hbWUsIGZ1bGxfbmFtZSApKQorICAgICAgICAgICAgZ290byBkb25lOwogICAgIH0KIAotbm90X2ZvdW5kOgotICAgIGlmICh0bXAgIT0gbmFtZSkgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRtcCApOwotICAgIFNldExhc3RFcnJvciggRVJST1JfRklMRV9OT1RfRk9VTkQgKTsKLSAgICBET1NfRVJST1IoIEVSX0ZpbGVOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7Ci0gICAgcmV0dXJuIDA7Ci0KLWZvdW5kOgotICAgIGxlbiA9IHN0cmxlbihidWZmZXIpOwotICAgIGlmIChsYXN0cGFydCkgKmxhc3RwYXJ0ID0gYnVmZmVyICsgbGVuICsgMTsKLSAgICBpZiAobGVuICsgMSA8IGJ1ZmxlbikKLSAgICB7Ci0gICAgICAgIGJ1ZmZlciArPSBsZW47Ci0gICAgICAgICpidWZmZXIrKyA9ICdcXCc7Ci0gICAgICAgIGJ1ZmxlbiAtPSBsZW4gKyAxOwotICAgICAgICBsc3RyY3B5bjMyQSggYnVmZmVyLCB0bXAsIGJ1ZmxlbiApOwotICAgIH0KLSAgICBsZW4gKz0gc3RybGVuKHRtcCkgKyAxOwotICAgIGlmICh0bXAgIT0gbmFtZSkgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHRtcCApOwotICAgIHJldHVybiBsZW47CisgICAgcmV0ID0gRkFMU0U7Citkb25lOgorICAgIGlmICh0bXApIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB0bXAgKTsKKyAgICByZXR1cm4gcmV0OwogfQogCiAKQEAgLTU5NSw3ICs1ODYsMTcgQEAKIERXT1JEIFNlYXJjaFBhdGgzMkEoIExQQ1NUUiBwYXRoLCBMUENTVFIgbmFtZSwgTFBDU1RSIGV4dCwgRFdPUkQgYnVmbGVuLAogICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyLCBMUFNUUiAqbGFzdHBhcnQgKQogewotICAgIHJldHVybiBESVJfU2VhcmNoUGF0aCggcGF0aCwgbmFtZSwgZXh0LCBidWZsZW4sIGJ1ZmZlciwgbGFzdHBhcnQsIFRSVUUgKTsKKyAgICBMUFNUUiBwLCByZXM7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CisKKyAgICBpZiAoIURJUl9TZWFyY2hQYXRoKCBwYXRoLCBuYW1lLCBleHQsICZmdWxsX25hbWUsIFRSVUUgKSkgcmV0dXJuIDA7CisgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciwgZnVsbF9uYW1lLnNob3J0X25hbWUsIGJ1ZmxlbiApOworICAgIHJlcyA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKworICAgICAgICAgICAgICBzdHJsZW4oRFJJVkVfR2V0Um9vdCggZnVsbF9uYW1lLnNob3J0X25hbWVbMF0gLSAnQScgKSk7CisgICAgaWYgKCpyZXMgJiYgKGJ1ZmxlbiA+IDMpKSBsc3RyY3B5bjMyQSggYnVmZmVyICsgMywgcmVzICsgMSwgYnVmbGVuIC0gMyApOworICAgIGZvciAocCA9IGJ1ZmZlcjsgKnA7IHArKykgaWYgKCpwID09ICcvJykgKnAgPSAnXFwnOworICAgIGlmIChsYXN0cGFydCkgKmxhc3RwYXJ0ID0gc3RycmNociggYnVmZmVyLCAnXFwnICkgKyAxOworICAgIHJldHVybiAqcmVzID8gc3RybGVuKHJlcykgKyAyIDogMzsKIH0KIAogCkBAIC02MDUsMjUgKzYwNiwzMCBAQAogRFdPUkQgU2VhcmNoUGF0aDMyVyggTFBDV1NUUiBwYXRoLCBMUENXU1RSIG5hbWUsIExQQ1dTVFIgZXh0LCBEV09SRCBidWZsZW4sCiAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgYnVmZmVyLCBMUFdTVFIgKmxhc3RwYXJ0ICkKIHsKKyAgICBMUFdTVFIgcDsKKyAgICBMUFNUUiByZXM7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CisKICAgICBMUFNUUiBwYXRoQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcGF0aCApOwogICAgIExQU1RSIG5hbWVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lICk7CiAgICAgTFBTVFIgZXh0QSAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGV4dCApOwotICAgIExQU1RSIGxhc3RwYXJ0QTsKLSAgICBMUFNUUiBidWZmZXJBID0gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZsZW4gKyAxICk7Ci0KLSAgICBEV09SRCByZXQgPSBESVJfU2VhcmNoUGF0aCggcGF0aEEsIG5hbWVBLCBleHRBLCBidWZsZW4sIGJ1ZmZlckEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsYXN0cGFydEEsIFRSVUUgKTsKLSAgICBsc3RyY3B5QXRvVyggYnVmZmVyLCBidWZmZXJBICk7Ci0gICAgaWYgKGxhc3RwYXJ0KQotICAgIHsKLSAgICAgICAgaWYgKGxhc3RwYXJ0QSkgKmxhc3RwYXJ0ID0gYnVmZmVyICsgKGxhc3RwYXJ0QSAtIGJ1ZmZlckEpOwotICAgICAgICBlbHNlICpsYXN0cGFydCA9IE5VTEw7Ci0gICAgfQotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBidWZmZXJBICk7CisgICAgRFdPUkQgcmV0ID0gRElSX1NlYXJjaFBhdGgoIHBhdGhBLCBuYW1lQSwgZXh0QSwgJmZ1bGxfbmFtZSwgVFJVRSApOwogICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBleHRBICk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWVBICk7CiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHBhdGhBICk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBpZiAoIXJldCkgcmV0dXJuIDA7CisKKyAgICBsc3RyY3B5bkF0b1coIGJ1ZmZlciwgZnVsbF9uYW1lLnNob3J0X25hbWUsIGJ1ZmxlbiApOworICAgIHJlcyA9IGZ1bGxfbmFtZS5sb25nX25hbWUgKworICAgICAgICAgICAgICBzdHJsZW4oRFJJVkVfR2V0Um9vdCggZnVsbF9uYW1lLnNob3J0X25hbWVbMF0gLSAnQScgKSk7CisgICAgaWYgKCpyZXMgJiYgKGJ1ZmxlbiA+IDMpKSBsc3RyY3B5bkF0b1coIGJ1ZmZlciArIDMsIHJlcyArIDEsIGJ1ZmxlbiAtIDMgKTsKKyAgICBmb3IgKHAgPSBidWZmZXI7ICpwOyBwKyspIGlmICgqcCA9PSAnLycpICpwID0gJ1xcJzsKKyAgICBpZiAobGFzdHBhcnQpCisgICAgeworICAgICAgICBmb3IgKHAgPSAqbGFzdHBhcnQgPSBidWZmZXI7ICpwOyBwKyspCisgICAgICAgICAgICBpZiAoKnAgPT0gJ1xcJykgKmxhc3RwYXJ0ID0gcCArIDE7CisgICAgfQorICAgIHJldHVybiAqcmVzID8gc3RybGVuKHJlcykgKyAyIDogMzsKIH0KIAogCmRpZmYgLS1naXQgYS9maWxlcy9kb3NfZnMuYyBiL2ZpbGVzL2Rvc19mcy5jCmluZGV4IGZiM2MwZTcuLjliMDgxYTAgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2Rvc19mcy5jCisrKyBiL2ZpbGVzL2Rvc19mcy5jCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJkcml2ZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFwLmgiCkBAIC0zMSwxMyArMzAsMTIgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogCiAvKiBEZWZpbmUgdGhlIFZGQVQgaW9jdGwgdG8gZ2V0IGJvdGggc2hvcnQgYW5kIGxvbmcgZmlsZSBuYW1lcyAqLwotI2lmIDAgIC8qIG5vdCB3b3JraW5nIHlldCAqLworLyogRklYTUU6IGlzIGl0IHBvc3NpYmxlIHRvIGdldCB0aGlzIHRvIHdvcmsgb24gb3RoZXIgc3lzdGVtcz8gKi8KICNpZmRlZiBsaW51eAogI2RlZmluZSBWRkFUX0lPQ1RMX1JFQURESVJfQk9USCAgX0lPUigncicsIDEsIGxvbmcpCiAjZWxzZSAgIC8qIGxpbnV4ICovCiAjdW5kZWYgVkZBVF9JT0NUTF9SRUFERElSX0JPVEggIC8qIGp1c3QgaW4gY2FzZS4uLiAqLwogI2VuZGlmICAvKiBsaW51eCAqLwotI2VuZGlmCiAKIC8qIENoYXJzIHdlIGRvbid0IHdhbnQgdG8gc2VlIGluIERPUyBmaWxlIG5hbWVzICovCiAjZGVmaW5lIElOVkFMSURfRE9TX0NIQVJTICAiKj88PnxcIis9LDtbXSBcMzQ1IgpAQCAtNTgsNiArNTYsNyBAQAogICAgIHsgIkNPTTQiLCAiIiB9CiB9OwogCisKICNkZWZpbmUgR0VUX0RSSVZFKHBhdGgpIFwKICAgICAoKChwYXRoKVsxXSA9PSAnOicpID8gdG91cHBlcigocGF0aClbMF0pIC0gJ0EnIDogRE9TRlNfQ3VyRHJpdmUpCiAKQEAgLTEzNCw0NyArMTMzLDE3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgRE9TRlNfQ2hlY2tEb3REb3QKLSAqCi0gKiBSZW1vdmUgYWxsICcuJyBhbmQgJy4uJyBhdCB0aGUgYmVnaW5uaW5nIG9mICduYW1lJy4KLSAqLwotc3RhdGljIGNvbnN0IGNoYXIgKiBET1NGU19DaGVja0RvdERvdCggY29uc3QgY2hhciAqbmFtZSwgY2hhciAqYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzZXAgLCBpbnQgKmxlbiApCi17Ci0gICAgY2hhciAqcCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOwotCi0gICAgd2hpbGUgKCpuYW1lID09ICcuJykKLSAgICB7Ci0gICAgICAgIGlmIChJU19FTkRfT0ZfTkFNRShuYW1lWzFdKSkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSsrOwotICAgICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKChuYW1lWzFdID09ICcuJykgJiYgSVNfRU5EX09GX05BTUUobmFtZVsyXSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG5hbWUgKz0gMjsKLSAgICAgICAgICAgIHdoaWxlICgoKm5hbWUgPT0gJ1xcJykgfHwgKCpuYW1lID09ICcvJykpIG5hbWUrKzsKLSAgICAgICAgICAgIHdoaWxlICgocCA+IGJ1ZmZlcikgJiYgKCpwICE9IHNlcCkpIHsgcC0tOyAoKmxlbikrKzsgfQotICAgICAgICAgICAgKnAgPSAnXDAnOyAgLyogUmVtb3ZlIHRyYWlsaW5nIHNlcGFyYXRvciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBuYW1lOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIERPU0ZTX1RvRG9zRkNCRm9ybWF0CiAgKgogICogQ29udmVydCBhIGZpbGUgbmFtZSB0byBET1MgRkNCIGZvcm1hdCAoOCszIGNoYXJzLCBwYWRkZWQgd2l0aCBibGFua3MpLAogICogZXhwYW5kaW5nIHdpbGQgY2FyZHMgYW5kIGNvbnZlcnRpbmcgdG8gdXBwZXItY2FzZSBpbiB0aGUgcHJvY2Vzcy4KICAqIEZpbGUgbmFtZSBjYW4gYmUgdGVybWluYXRlZCBieSAnXDAnLCAnXFwnIG9yICcvJy4KLSAqIFJldHVybiBOVUxMIGlmIHRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIERPUyBuYW1lLgorICogUmV0dXJuIEZBTFNFIGlmIHRoZSBuYW1lIGlzIG5vdCBhIHZhbGlkIERPUyBuYW1lLgorICogJ2J1ZmZlcicgbXVzdCBiZSBhdCBsZWFzdCAxMiBjaGFyYWN0ZXJzIGxvbmcuCiAgKi8KLWNvbnN0IGNoYXIgKkRPU0ZTX1RvRG9zRkNCRm9ybWF0KCBjb25zdCBjaGFyICpuYW1lICkKK0JPT0wzMiBET1NGU19Ub0Rvc0ZDQkZvcm1hdCggTFBDU1RSIG5hbWUsIExQU1RSIGJ1ZmZlciApCiB7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9jaGFyc1tdID0gSU5WQUxJRF9ET1NfQ0hBUlM7Ci0gICAgc3RhdGljIGNoYXIgYnVmZmVyWzEyXTsKICAgICBjb25zdCBjaGFyICpwID0gbmFtZTsKICAgICBpbnQgaTsKIApAQCAtMTg4LDcgKzE1Nyw3IEBACiAgICAgICAgICAgICBidWZmZXJbMV0gPSAnLic7CiAgICAgICAgICAgICBwKys7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuICghKnAgfHwgKCpwID09ICcvJykgfHwgKCpwID09ICdcXCcpKSA/IGJ1ZmZlciA6IE5VTEw7CisgICAgICAgIHJldHVybiAoISpwIHx8ICgqcCA9PSAnLycpIHx8ICgqcCA9PSAnXFwnKSk7CiAgICAgfQogCiAgICAgZm9yIChpID0gMDsgaSA8IDg7IGkrKykKQEAgLTIwOCw3ICsxNzcsNyBAQAogICAgICAgICAgICAgYnVmZmVyW2ldID0gJz8nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoc3RyY2hyKCBpbnZhbGlkX2NoYXJzLCAqcCApKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChzdHJjaHIoIGludmFsaWRfY2hhcnMsICpwICkpIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHRvdXBwZXIoKnApOwogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMjMsNyArMTkyLDcgQEAKICAgICBlbHNlCiAgICAgewogICAgICAgICAvKiBDaGVjayBpZiBuYW1lIHRvbyBsb25nICovCi0gICAgICAgIGlmICgqcCAmJiAoKnAgIT0gJy8nKSAmJiAoKnAgIT0gJ1xcJykgJiYgKCpwICE9ICcuJykpIHJldHVybiBOVUxMOworICAgICAgICBpZiAoKnAgJiYgKCpwICE9ICcvJykgJiYgKCpwICE9ICdcXCcpICYmICgqcCAhPSAnLicpKSByZXR1cm4gRkFMU0U7CiAgICAgfQogICAgIGlmICgqcCA9PSAnLicpIHArKzsgIC8qIFNraXAgZG90ICovCiAKQEAgLTIzNyw3ICsyMDYsNyBAQAogICAgICAgICAgICAgYnVmZmVyW2ldID0gJyAnOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgJy4nOgotICAgICAgICAgICAgcmV0dXJuIE5VTEw7ICAvKiBTZWNvbmQgZXh0ZW5zaW9uIG5vdCBhbGxvd2VkICovCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7ICAvKiBTZWNvbmQgZXh0ZW5zaW9uIG5vdCBhbGxvd2VkICovCiAgICAgICAgIGNhc2UgJz8nOgogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoICovCkBAIC0yNDUsMTQgKzIxNCwxNCBAQAogICAgICAgICAgICAgYnVmZmVyW2ldID0gJz8nOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpZiAoc3RyY2hyKCBpbnZhbGlkX2NoYXJzLCAqcCApKSByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmIChzdHJjaHIoIGludmFsaWRfY2hhcnMsICpwICkpIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgIGJ1ZmZlcltpXSA9IHRvdXBwZXIoKnApOwogICAgICAgICAgICAgcCsrOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAgICAgYnVmZmVyWzExXSA9ICdcMCc7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCkBAIC0yNjIsMTEgKzIzMSwxMCBAQAogICogQ29udmVydCBhIGZpbGUgbmFtZSBmcm9tIEZDQiB0byBEVEEgZm9ybWF0IChuYW1lLmV4dCwgbnVsbC10ZXJtaW5hdGVkKQogICogY29udmVydGluZyB0byB1cHBlci1jYXNlIGluIHRoZSBwcm9jZXNzLgogICogRmlsZSBuYW1lIGNhbiBiZSB0ZXJtaW5hdGVkIGJ5ICdcMCcsICdcXCcgb3IgJy8nLgotICogUmV0dXJuIE5VTEwgaWYgdGhlIG5hbWUgaXMgbm90IGEgdmFsaWQgRE9TIG5hbWUuCisgKiAnYnVmZmVyJyBtdXN0IGJlIGF0IGxlYXN0IDEzIGNoYXJhY3RlcnMgbG9uZy4KICAqLwotY29uc3QgY2hhciAqRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIGNvbnN0IGNoYXIgKm5hbWUgKQorc3RhdGljIHZvaWQgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIExQQ1NUUiBuYW1lLCBMUFNUUiBidWZmZXIgKQogewotICAgIHN0YXRpYyBjaGFyIGJ1ZmZlclsxM107CiAgICAgY2hhciAqcDsKIAogICAgIG1lbWNweSggYnVmZmVyLCBuYW1lLCA4ICk7CkBAIC0yNzYsNyArMjQ0LDYgQEAKICAgICBmb3IgKHAgKz0gMzsgcFstMV0gPT0gJyAnOyBwLS0pOwogICAgIGlmIChwWy0xXSA9PSAnLicpIHAtLTsKICAgICAqcCA9ICdcMCc7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAogCkBAIC0zOTcsMTMgKzM2NCwxMSBAQAogI2lmZGVmIFZGQVRfSU9DVExfUkVBRERJUl9CT1RICiAgICAgaWYgKGRpci0+ZmQgIT0gLTEpCiAgICAgewotICAgICAgICBMUENTVFIgZmNiX25hbWU7CiAgICAgICAgIGlmIChpb2N0bCggZGlyLT5mZCwgVkZBVF9JT0NUTF9SRUFERElSX0JPVEgsIChsb25nKWRpci0+ZGlyZW50ICkgPT0gLTEpCiAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIGlmICghZGlyLT5kaXJlbnRbMF0uZF9yZWNsZW4pIHJldHVybiBGQUxTRTsKLSAgICAgICAgZmNiX25hbWUgPSBET1NGU19Ub0Rvc0ZDQkZvcm1hdCggZGlyLT5kaXJlbnRbMF0uZF9uYW1lICk7Ci0gICAgICAgIGlmIChmY2JfbmFtZSkgc3RyY3B5KCBkaXItPnNob3J0X25hbWUsIGZjYl9uYW1lICk7Ci0gICAgICAgIGVsc2UgZGlyLT5zaG9ydF9uYW1lWzBdID0gJ1wwJzsKKyAgICAgICAgaWYgKCFET1NGU19Ub0Rvc0ZDQkZvcm1hdCggZGlyLT5kaXJlbnRbMF0uZF9uYW1lLCBkaXItPnNob3J0X25hbWUgKSkKKyAgICAgICAgICAgIGRpci0+c2hvcnRfbmFtZVswXSA9ICdcMCc7CiAgICAgICAgICpzaG9ydF9uYW1lID0gZGlyLT5zaG9ydF9uYW1lOwogICAgICAgICBpZiAoZGlyLT5kaXJlbnRbMV0uZF9uYW1lWzBdKSAqbG9uZ19uYW1lID0gZGlyLT5kaXJlbnRbMV0uZF9uYW1lOwogICAgICAgICBlbHNlICpsb25nX25hbWUgPSBkaXItPmRpcmVudFswXS5kX25hbWU7CkBAIC00MTksODAgKzM4NCwyMCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERPU0ZTX1RvRG9zRGF0ZVRpbWUKLSAqCi0gKiBDb252ZXJ0IGEgVW5peCB0aW1lIGluIHRoZSBET1MgZGF0ZS90aW1lIGZvcm1hdC4KLSAqLwotdm9pZCBET1NGU19Ub0Rvc0RhdGVUaW1lKCB0aW1lX3QgdW5peHRpbWUsIFdPUkQgKnBEYXRlLCBXT1JEICpwVGltZSApCi17Ci0gICAgc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSggJnVuaXh0aW1lICk7Ci0gICAgaWYgKHBUaW1lKQotICAgICAgICAqcFRpbWUgPSAodG0tPnRtX2hvdXIgPDwgMTEpICsgKHRtLT50bV9taW4gPDwgNSkgKyAodG0tPnRtX3NlYyAvIDIpOwotICAgIGlmIChwRGF0ZSkKLSAgICAgICAgKnBEYXRlID0gKCh0bS0+dG1feWVhciAtIDgwKSA8PCA5KSArICgodG0tPnRtX21vbiArIDEpIDw8IDUpCi0gICAgICAgICAgICAgICAgICsgdG0tPnRtX21kYXk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERPU0ZTX0Rvc0RhdGVUaW1lVG9Vbml4VGltZQotICoKLSAqIENvbnZlcnQgZnJvbSB0aGUgRE9TIChGQVQpIGRhdGUvdGltZSBmb3JtYXQgaW50byBVbml4IHRpbWUKLSAqIChib3Jyb3dlZCBmcm9tIGZpbGVzL2ZpbGUuYykKLSAqLwotdGltZV90IERPU0ZTX0Rvc0RhdGVUaW1lVG9Vbml4VGltZSggV09SRCBkYXRlLCBXT1JEIHRpbWUgKQotewotICAgIHN0cnVjdCB0bSBuZXd0bTsKLQotICAgIG5ld3RtLnRtX3NlYyAgPSAodGltZSAmIDB4MWYpICogMjsKLSAgICBuZXd0bS50bV9taW4gID0gKHRpbWUgPj4gNSkgJiAweDNmOwotICAgIG5ld3RtLnRtX2hvdXIgPSAodGltZSA+PiAxMSk7Ci0gICAgbmV3dG0udG1fbWRheSA9IChkYXRlICYgMHgxZik7Ci0gICAgbmV3dG0udG1fbW9uICA9ICgoZGF0ZSA+PiA1KSAmIDB4MGYpIC0gMTsKLSAgICBuZXd0bS50bV95ZWFyID0gKGRhdGUgPj4gOSkgKyA4MDsKLSAgICByZXR1cm4gbWt0aW1lKCAmbmV3dG0gKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUKLSAqCi0gKiBDb252ZXJ0IGEgVW5peCB0aW1lIHRvIEZJTEVUSU1FIGZvcm1hdC4KLSAqLwotdm9pZCBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHRpbWVfdCB1bml4dGltZSwgRklMRVRJTUUgKmZpbGV0aW1lICkKLXsKLSAgICAvKiBGSVhNRSA6LSkgKi8KLSAgICBmaWxldGltZS0+ZHdMb3dEYXRlVGltZSAgPSB1bml4dGltZTsKLSAgICBmaWxldGltZS0+ZHdIaWdoRGF0ZVRpbWUgPSAwOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZQotICoKLSAqIENvbnZlcnQgYSBGSUxFVElNRSBmb3JtYXQgdG8gVW5peCB0aW1lLgotICovCi10aW1lX3QgRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCBjb25zdCBGSUxFVElNRSAqZmlsZXRpbWUgKQotewotICAgIC8qIEZJWE1FIDotKSAqLwotICAgIHJldHVybiBmaWxldGltZS0+ZHdMb3dEYXRlVGltZTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBET1NGU19IYXNoCiAgKgogICogVHJhbnNmb3JtIGEgVW5peCBmaWxlIG5hbWUgaW50byBhIGhhc2hlZCBET1MgbmFtZS4gSWYgdGhlIG5hbWUgaXMgYSB2YWxpZAogICogRE9TIG5hbWUsIGl0IGlzIGNvbnZlcnRlZCB0byB1cHBlci1jYXNlOyBvdGhlcndpc2UgaXQgaXMgcmVwbGFjZWQgYnkgYQogICogaGFzaGVkIHZlcnNpb24gdGhhdCBmaXRzIGluIDguMyBmb3JtYXQuCiAgKiBGaWxlIG5hbWUgY2FuIGJlIHRlcm1pbmF0ZWQgYnkgJ1wwJywgJ1xcJyBvciAnLycuCisgKiAnYnVmZmVyJyBtdXN0IGJlIGF0IGxlYXN0IDEzIGNoYXJhY3RlcnMgbG9uZy4KICAqLwotc3RhdGljIGNvbnN0IGNoYXIgKkRPU0ZTX0hhc2goIGNvbnN0IGNoYXIgKm5hbWUsIGludCBkaXJfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZ25vcmVfY2FzZSApCitzdGF0aWMgdm9pZCBET1NGU19IYXNoKCBMUENTVFIgbmFtZSwgTFBTVFIgYnVmZmVyLCBCT09MMzIgZGlyX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpZ25vcmVfY2FzZSApCiB7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgaW52YWxpZF9jaGFyc1tdID0gSU5WQUxJRF9ET1NfQ0hBUlMgIn4uIjsKICAgICBzdGF0aWMgY29uc3QgY2hhciBoYXNoX2NoYXJzWzMyXSA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWjAxMjM0NSI7CiAKLSAgICBzdGF0aWMgY2hhciBidWZmZXJbMTNdOwogICAgIGNvbnN0IGNoYXIgKnAsICpleHQ7CiAgICAgY2hhciAqZHN0OwogICAgIHVuc2lnbmVkIHNob3J0IGhhc2g7CkBAIC01MDgsNyArNDEzLDcgQEAKICAgICAgICAgICAgIGJ1ZmZlclswXSA9ICcuJzsKICAgICAgICAgICAgIGlmICghZGlyX2Zvcm1hdCkgYnVmZmVyWzFdID0gYnVmZmVyWzJdID0gJ1wwJzsKICAgICAgICAgICAgIGlmIChuYW1lWzFdID09ICcuJykgYnVmZmVyWzFdID0gJy4nOwotICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIC8qIFNpbXBseSBjb3B5IHRoZSBuYW1lLCBjb252ZXJ0aW5nIHRvIHVwcGVyY2FzZSAqLwpAQCAtNTIzLDU1ICs0MjgsNTMgQEAKICAgICAgICAgICAgICAgICAqZHN0KysgPSB0b3VwcGVyKCpuYW1lKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWRpcl9mb3JtYXQpICpkc3QgPSAnXDAnOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLyogQ29tcHV0ZSB0aGUgaGFzaCBjb2RlIG9mIHRoZSBmaWxlIG5hbWUgKi8KKyAgICAvKiBJZiB5b3Uga25vdyBzb21ldGhpbmcgYWJvdXQgaGFzaCBmdW5jdGlvbnMsIGZlZWwgZnJlZSB0byAqLworICAgIC8qIGluc2VydCBhIGJldHRlciBhbGdvcml0aG0gaGVyZS4uLiAqLworICAgIGlmIChpZ25vcmVfY2FzZSkKKyAgICB7CisgICAgICAgIGZvciAocCA9IG5hbWUsIGhhc2ggPSAweGJlZWY7ICFJU19FTkRfT0ZfTkFNRShwWzFdKTsgcCsrKQorICAgICAgICAgICAgaGFzaCA9IChoYXNoPDwzKSBeIChoYXNoPj41KSBeIHRvbG93ZXIoKnApIF4gKHRvbG93ZXIocFsxXSkgPDwgOCk7CisgICAgICAgIGhhc2ggPSAoaGFzaDw8MykgXiAoaGFzaD4+NSkgXiB0b2xvd2VyKCpwKTsgLyogTGFzdCBjaGFyYWN0ZXIqLwogICAgIH0KICAgICBlbHNlCiAgICAgewotICAgICAgICAvKiBDb21wdXRlIHRoZSBoYXNoIGNvZGUgb2YgdGhlIGZpbGUgbmFtZSAqLwotICAgICAgICAvKiBJZiB5b3Uga25vdyBzb21ldGhpbmcgYWJvdXQgaGFzaCBmdW5jdGlvbnMsIGZlZWwgZnJlZSB0byAqLwotICAgICAgICAvKiBpbnNlcnQgYSBiZXR0ZXIgYWxnb3JpdGhtIGhlcmUuLi4gKi8KLSAgICAgICAgaWYgKGlnbm9yZV9jYXNlKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHAgPSBuYW1lLCBoYXNoID0gMHhiZWVmOyAhSVNfRU5EX09GX05BTUUocFsxXSk7IHArKykKLSAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgMykgXiAoaGFzaCA+PiA1KSBeIHRvbG93ZXIoKnApIF4gKHRvbG93ZXIocFsxXSkgPDwgOCk7Ci0gICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgMykgXiAoaGFzaCA+PiA1KSBeIHRvbG93ZXIoKnApOyAvKiBMYXN0IGNoYXJhY3RlciovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKHAgPSBuYW1lLCBoYXNoID0gMHhiZWVmOyAhSVNfRU5EX09GX05BTUUocFsxXSk7IHArKykKLSAgICAgICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgMykgXiAoaGFzaCA+PiA1KSBeICpwIF4gKHBbMV0gPDwgOCk7Ci0gICAgICAgICAgICBoYXNoID0gKGhhc2ggPDwgMykgXiAoaGFzaCA+PiA1KSBeICpwOyAgLyogTGFzdCBjaGFyYWN0ZXIgKi8KLSAgICAgICAgfQotCi0gICAgICAgIC8qIEZpbmQgbGFzdCBkb3QgZm9yIHN0YXJ0IG9mIHRoZSBleHRlbnNpb24gKi8KLSAgICAgICAgZm9yIChwID0gbmFtZSsxLCBleHQgPSBOVUxMOyAhSVNfRU5EX09GX05BTUUoKnApOyBwKyspCi0gICAgICAgICAgICBpZiAoKnAgPT0gJy4nKSBleHQgPSBwOwotICAgICAgICBpZiAoZXh0ICYmIElTX0VORF9PRl9OQU1FKGV4dFsxXSkpCi0gICAgICAgICAgICBleHQgPSBOVUxMOyAgLyogRW1wdHkgZXh0ZW5zaW9uIGlnbm9yZWQgKi8KLQotICAgICAgICAvKiBDb3B5IGZpcnN0IDQgY2hhcnMsIHJlcGxhY2luZyBpbnZhbGlkIGNoYXJzIHdpdGggJ18nICovCi0gICAgICAgIGZvciAoaSA9IDQsIHAgPSBuYW1lLCBkc3QgPSBidWZmZXI7IGkgPiAwOyBpLS0sIHArKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElTX0VORF9PRl9OQU1FKCpwKSB8fCAocCA9PSBleHQpKSBicmVhazsKLSAgICAgICAgICAgICpkc3QrKyA9IHN0cmNociggaW52YWxpZF9jaGFycywgKnAgKSA/ICdfJyA6IHRvdXBwZXIoKnApOwotICAgICAgICB9Ci0gICAgICAgIC8qIFBhZCB0byA1IGNoYXJzIHdpdGggJ34nICovCi0gICAgICAgIHdoaWxlIChpLS0gPj0gMCkgKmRzdCsrID0gJ34nOwotCi0gICAgICAgIC8qIEluc2VydCBoYXNoIGNvZGUgY29udmVydGVkIHRvIDMgQVNDSUkgY2hhcnMgKi8KLSAgICAgICAgKmRzdCsrID0gaGFzaF9jaGFyc1soaGFzaCA+PiAxMCkgJiAweDFmXTsKLSAgICAgICAgKmRzdCsrID0gaGFzaF9jaGFyc1soaGFzaCA+PiA1KSAmIDB4MWZdOwotICAgICAgICAqZHN0KysgPSBoYXNoX2NoYXJzW2hhc2ggJiAweDFmXTsKLQotICAgICAgICAvKiBDb3B5IHRoZSBmaXJzdCAzIGNoYXJzIG9mIHRoZSBleHRlbnNpb24gKGlmIGFueSkgKi8KLSAgICAgICAgaWYgKGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFkaXJfZm9ybWF0KSAqZHN0KysgPSAnLic7Ci0gICAgICAgICAgICBmb3IgKGkgPSAzLCBleHQrKzsgKGkgPiAwKSAmJiAhSVNfRU5EX09GX05BTUUoKmV4dCk7IGktLSwgZXh0KyspCi0gICAgICAgICAgICAgICAgKmRzdCsrID0gc3RyY2hyKCBpbnZhbGlkX2NoYXJzLCAqZXh0ICkgPyAnXycgOiB0b3VwcGVyKCpleHQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghZGlyX2Zvcm1hdCkgKmRzdCA9ICdcMCc7CisgICAgICAgIGZvciAocCA9IG5hbWUsIGhhc2ggPSAweGJlZWY7ICFJU19FTkRfT0ZfTkFNRShwWzFdKTsgcCsrKQorICAgICAgICAgICAgaGFzaCA9IChoYXNoIDw8IDMpIF4gKGhhc2ggPj4gNSkgXiAqcCBeIChwWzFdIDw8IDgpOworICAgICAgICBoYXNoID0gKGhhc2ggPDwgMykgXiAoaGFzaCA+PiA1KSBeICpwOyAgLyogTGFzdCBjaGFyYWN0ZXIgKi8KICAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKworICAgIC8qIEZpbmQgbGFzdCBkb3QgZm9yIHN0YXJ0IG9mIHRoZSBleHRlbnNpb24gKi8KKyAgICBmb3IgKHAgPSBuYW1lKzEsIGV4dCA9IE5VTEw7ICFJU19FTkRfT0ZfTkFNRSgqcCk7IHArKykKKyAgICAgICAgaWYgKCpwID09ICcuJykgZXh0ID0gcDsKKyAgICBpZiAoZXh0ICYmIElTX0VORF9PRl9OQU1FKGV4dFsxXSkpCisgICAgICAgIGV4dCA9IE5VTEw7ICAvKiBFbXB0eSBleHRlbnNpb24gaWdub3JlZCAqLworCisgICAgLyogQ29weSBmaXJzdCA0IGNoYXJzLCByZXBsYWNpbmcgaW52YWxpZCBjaGFycyB3aXRoICdfJyAqLworICAgIGZvciAoaSA9IDQsIHAgPSBuYW1lLCBkc3QgPSBidWZmZXI7IGkgPiAwOyBpLS0sIHArKykKKyAgICB7CisgICAgICAgIGlmIChJU19FTkRfT0ZfTkFNRSgqcCkgfHwgKHAgPT0gZXh0KSkgYnJlYWs7CisgICAgICAgICpkc3QrKyA9IHN0cmNociggaW52YWxpZF9jaGFycywgKnAgKSA/ICdfJyA6IHRvdXBwZXIoKnApOworICAgIH0KKyAgICAvKiBQYWQgdG8gNSBjaGFycyB3aXRoICd+JyAqLworICAgIHdoaWxlIChpLS0gPj0gMCkgKmRzdCsrID0gJ34nOworCisgICAgLyogSW5zZXJ0IGhhc2ggY29kZSBjb252ZXJ0ZWQgdG8gMyBBU0NJSSBjaGFycyAqLworICAgICpkc3QrKyA9IGhhc2hfY2hhcnNbKGhhc2ggPj4gMTApICYgMHgxZl07CisgICAgKmRzdCsrID0gaGFzaF9jaGFyc1soaGFzaCA+PiA1KSAmIDB4MWZdOworICAgICpkc3QrKyA9IGhhc2hfY2hhcnNbaGFzaCAmIDB4MWZdOworCisgICAgLyogQ29weSB0aGUgZmlyc3QgMyBjaGFycyBvZiB0aGUgZXh0ZW5zaW9uIChpZiBhbnkpICovCisgICAgaWYgKGV4dCkKKyAgICB7CisgICAgICAgIGlmICghZGlyX2Zvcm1hdCkgKmRzdCsrID0gJy4nOworICAgICAgICBmb3IgKGkgPSAzLCBleHQrKzsgKGkgPiAwKSAmJiAhSVNfRU5EX09GX05BTUUoKmV4dCk7IGktLSwgZXh0KyspCisgICAgICAgICAgICAqZHN0KysgPSBzdHJjaHIoIGludmFsaWRfY2hhcnMsICpleHQgKSA/ICdfJyA6IHRvdXBwZXIoKmV4dCk7CisgICAgfQorICAgIGlmICghZGlyX2Zvcm1hdCkgKmRzdCA9ICdcMCc7CiB9CiAKIApAQCAtNTgxLDMxICs0ODQsMzQgQEAKICAqIEZpbmQgdGhlIFVuaXggZmlsZSBuYW1lIGluIGEgZ2l2ZW4gZGlyZWN0b3J5IHRoYXQgY29ycmVzcG9uZHMgdG8KICAqIGEgZmlsZSBuYW1lIChlaXRoZXIgaW4gVW5peCBvciBET1MgZm9ybWF0KS4KICAqIEZpbGUgbmFtZSBjYW4gYmUgdGVybWluYXRlZCBieSAnXDAnLCAnXFwnIG9yICcvJy4KLSAqIFJldHVybiAxIGlmIE9LLCAwIGlmIG5vIGZpbGUgbmFtZSBtYXRjaGVzLgorICogUmV0dXJuIFRSVUUgaWYgT0ssIEZBTFNFIGlmIG5vIGZpbGUgbmFtZSBtYXRjaGVzLgorICoKKyAqICdsb25nX2J1ZicgbXVzdCBiZSBhdCBsZWFzdCAnbG9uZ19sZW4nIGNoYXJhY3RlcnMgbG9uZy4gSWYgdGhlIGxvbmcgbmFtZQorICogdHVybnMgb3V0IHRvIGJlIGxhcmdlciB0aGFuIHRoYXQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIEZBTFNFLgorICogJ3Nob3J0X2J1ZicgbXVzdCBiZSBhdCBsZWFzdCAxMyBjaGFyYWN0ZXJzIGxvbmcuCiAgKi8KLUJPT0wzMiBET1NGU19GaW5kVW5peE5hbWUoIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIGludCBtYXhsZW4sIFVJTlQzMiBkcml2ZV9mbGFncyApCitCT09MMzIgRE9TRlNfRmluZFVuaXhOYW1lKCBMUENTVFIgcGF0aCwgTFBDU1RSIG5hbWUsIExQU1RSIGxvbmdfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgbG9uZ19sZW4sIExQU1RSIHNob3J0X2J1ZiwgQk9PTDMyIGlnbm9yZV9jYXNlKQogewogICAgIERPU19ESVIgKmRpcjsKICAgICBMUENTVFIgbG9uZ19uYW1lLCBzaG9ydF9uYW1lOwotICAgIGNoYXIgZG9zX25hbWVbMTJdOworICAgIGNoYXIgZG9zX25hbWVbMTJdLCB0bXBfYnVmWzEzXTsKICAgICBCT09MMzIgcmV0OwogCiAgICAgY29uc3QgY2hhciAqcCA9IHN0cmNociggbmFtZSwgJy8nICk7CiAgICAgaW50IGxlbiA9IHAgPyAoaW50KShwIC0gbmFtZSkgOiBzdHJsZW4obmFtZSk7CisgICAgaWYgKChwID0gc3RyY2hyKCBuYW1lLCAnXFwnICkpKSBsZW4gPSBNSU4oIChpbnQpKHAgLSBuYW1lKSwgbGVuICk7CisgICAgaWYgKGxvbmdfbGVuIDwgbGVuICsgMSkgcmV0dXJuIEZBTFNFOwogCiAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lOiAlcywlc1xuIiwgcGF0aCwgbmFtZSApOwogCi0gICAgaWYgKChwID0gc3RyY2hyKCBuYW1lLCAnXFwnICkpKSBsZW4gPSBNSU4oIChpbnQpKHAgLSBuYW1lKSwgbGVuICk7Ci0KLSAgICBkb3NfbmFtZVswXSA9ICdcMCc7Ci0gICAgaWYgKChwID0gRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIG5hbWUgKSkpIHN0cmNweSggZG9zX25hbWUsIHAgKTsKKyAgICBpZiAoIURPU0ZTX1RvRG9zRkNCRm9ybWF0KCBuYW1lLCBkb3NfbmFtZSApKSBkb3NfbmFtZVswXSA9ICdcMCc7CiAKICAgICBpZiAoIShkaXIgPSBET1NGU19PcGVuRGlyKCBwYXRoICkpKQogICAgIHsKICAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lKCVzLCVzKTogY2FuJ3Qgb3BlbiBkaXJcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUgKTsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CiAKICAgICB3aGlsZSAoKHJldCA9IERPU0ZTX1JlYWREaXIoIGRpciwgJmxvbmdfbmFtZSwgJnNob3J0X25hbWUgKSkpCkBAIC02MTMsNyArNTE5LDcgQEAKICAgICAgICAgLyogQ2hlY2sgYWdhaW5zdCBVbml4IG5hbWUgKi8KICAgICAgICAgaWYgKGxlbiA9PSBzdHJsZW4obG9uZ19uYW1lKSkKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGRyaXZlX2ZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpCisgICAgICAgICAgICBpZiAoIWlnbm9yZV9jYXNlKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGlmICghbHN0cm5jbXAzMkEoIGxvbmdfbmFtZSwgbmFtZSwgbGVuICkpIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtNjI2LDE0ICs1MzIsMjkgQEAKICAgICAgICAgewogICAgICAgICAgICAgLyogQ2hlY2sgYWdhaW5zdCBoYXNoZWQgRE9TIG5hbWUgKi8KICAgICAgICAgICAgIGlmICghc2hvcnRfbmFtZSkKLSAgICAgICAgICAgICAgICBzaG9ydF9uYW1lID0gRE9TRlNfSGFzaCggbG9uZ19uYW1lLCBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShkcml2ZV9mbGFncyAmIERSSVZFX0NBU0VfU0VOU0lUSVZFKSApOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERPU0ZTX0hhc2goIGxvbmdfbmFtZSwgdG1wX2J1ZiwgVFJVRSwgaWdub3JlX2Nhc2UgKTsKKyAgICAgICAgICAgICAgICBzaG9ydF9uYW1lID0gdG1wX2J1ZjsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghc3RyY21wKCBkb3NfbmFtZSwgc2hvcnRfbmFtZSApKSBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAocmV0ICYmIGJ1ZmZlcikgbHN0cmNweW4zMkEoIGJ1ZmZlciwgbG9uZ19uYW1lLCBtYXhsZW4gKTsKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19GaW5kVW5peE5hbWUoJXMsJXMpIC0+ICVzXG4iLAotICAgICAgICAgICAgICAgICAgIHBhdGgsIG5hbWUsIHJldCA/IGxvbmdfbmFtZSA6ICIqKiBOb3QgZm91bmQgKioiICk7CisgICAgaWYgKHJldCkKKyAgICB7CisgICAgICAgIGlmIChsb25nX2J1Zikgc3RyY3B5KCBsb25nX2J1ZiwgbG9uZ19uYW1lICk7CisgICAgICAgIGlmIChzaG9ydF9idWYpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzaG9ydF9uYW1lKQorICAgICAgICAgICAgICAgIERPU0ZTX1RvRG9zRFRBRm9ybWF0KCBzaG9ydF9uYW1lLCBzaG9ydF9idWYgKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBET1NGU19IYXNoKCBsb25nX25hbWUsIHNob3J0X2J1ZiwgRkFMU0UsIGlnbm9yZV9jYXNlICk7CisgICAgICAgIH0KKyAgICAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfRmluZFVuaXhOYW1lKCVzLCVzKSAtPiAlcyAoJXMpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBwYXRoLCBuYW1lLCBsb25nX25hbWUsIHNob3J0X2J1ZiA/IHNob3J0X2J1ZiA6ICIqKioiKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICBkcHJpbnRmX2Rvc2ZzKHN0ZGRlYiwiRE9TRlNfRmluZFVuaXhOYW1lKCVzLCVzKSAtPiAqKiBOb3QgZm91bmQgKipcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcGF0aCwgbmFtZSApOwogICAgIERPU0ZTX0Nsb3NlRGlyKCBkaXIgKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtNzAyLDE2OCArNjIzLDI3OCBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIERPU0ZTX0dldFVuaXhGaWxlTmFtZQorICogICAgICAgICAgIERPU0ZTX0dldEZ1bGxOYW1lCiAgKgotICogQ29udmVydCBhIGZpbGUgbmFtZSAoRE9TIG9yIG1peGVkIERPUy9Vbml4IGZvcm1hdCkgdG8gYSB2YWxpZCBVbml4IG5hbWUuCi0gKiBSZXR1cm4gTlVMTCBpZiBvbmUgb2YgdGhlIHBhdGggY29tcG9uZW50cyBkb2VzIG5vdCBleGlzdC4gVGhlIGxhc3QgcGF0aAorICogQ29udmVydCBhIGZpbGUgbmFtZSAoRE9TIG9yIG1peGVkIERPUy9Vbml4IGZvcm1hdCkgdG8gYSB2YWxpZAorICogVW5peCBuYW1lIC8gc2hvcnQgRE9TIG5hbWUgcGFpci4KKyAqIFJldHVybiBGQUxTRSBpZiBvbmUgb2YgdGhlIHBhdGggY29tcG9uZW50cyBkb2VzIG5vdCBleGlzdC4gVGhlIGxhc3QgcGF0aAogICogY29tcG9uZW50IGlzIG9ubHkgY2hlY2tlZCBpZiAnY2hlY2tfbGFzdCcgaXMgbm9uLXplcm8uCisgKiBUaGUgYnVmZmVycyBwb2ludGVkIHRvIGJ5ICdsb25nX2J1ZicgYW5kICdzaG9ydF9idWYnIG11c3QgYmUKKyAqIGF0IGxlYXN0IE1BWF9QQVRITkFNRV9MRU4gbG9uZy4KICAqLwotY29uc3QgY2hhciAqIERPU0ZTX0dldFVuaXhGaWxlTmFtZSggY29uc3QgY2hhciAqIG5hbWUsIGludCBjaGVja19sYXN0ICkKK0JPT0wzMiBET1NGU19HZXRGdWxsTmFtZSggTFBDU1RSIG5hbWUsIEJPT0wzMiBjaGVja19sYXN0LCBET1NfRlVMTF9OQU1FICpmdWxsICkKIHsKLSAgICBzdGF0aWMgY2hhciBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl07Ci0gICAgaW50IGRyaXZlLCBsZW47CiAgICAgQk9PTDMyIGZvdW5kOwogICAgIFVJTlQzMiBmbGFnczsKLSAgICBjaGFyICpwLCAqcm9vdDsKKyAgICBjaGFyICpwX2wsICpwX3MsICpyb290OwogCi0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfR2V0VW5peEZpbGVOYW1lOiAlc1xuIiwgbmFtZSApOworICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRPU0ZTX0dldEZ1bGxOYW1lOiAlcyAobGFzdD0lZClcbiIsCisgICAgICAgICAgICAgICAgICAgbmFtZSwgY2hlY2tfbGFzdCApOwogCi0gICAgaWYgKChkcml2ZSA9IERPU0ZTX0dldFBhdGhEcml2ZSggJm5hbWUgKSkgPT0gLTEpIHJldHVybiBOVUxMOwotICAgIGZsYWdzID0gRFJJVkVfR2V0RmxhZ3MoZHJpdmUpOwotICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIERSSVZFX0dldFJvb3QoZHJpdmUpLCBNQVhfUEFUSE5BTUVfTEVOICk7Ci0gICAgaWYgKGJ1ZmZlclsxXSkgcm9vdCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOwotICAgIGVsc2Ugcm9vdCA9IGJ1ZmZlcjsgIC8qIHJvb3QgZGlyZWN0b3J5ICovCisgICAgaWYgKChmdWxsLT5kcml2ZSA9IERPU0ZTX0dldFBhdGhEcml2ZSggJm5hbWUgKSkgPT0gLTEpIHJldHVybiBGQUxTRTsKKyAgICBmbGFncyA9IERSSVZFX0dldEZsYWdzKCBmdWxsLT5kcml2ZSApOwogCi0gICAgaWYgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkKKyAgICBsc3RyY3B5bjMyQSggZnVsbC0+bG9uZ19uYW1lLCBEUklWRV9HZXRSb290KCBmdWxsLT5kcml2ZSApLAorICAgICAgICAgICAgICAgICBzaXplb2YoZnVsbC0+bG9uZ19uYW1lKSApOworICAgIGlmIChmdWxsLT5sb25nX25hbWVbMV0pIHJvb3QgPSBmdWxsLT5sb25nX25hbWUgKyBzdHJsZW4oZnVsbC0+bG9uZ19uYW1lKTsKKyAgICBlbHNlIHJvb3QgPSBmdWxsLT5sb25nX25hbWU7ICAvKiByb290IGRpcmVjdG9yeSAqLworCisgICAgc3RyY3B5KCBmdWxsLT5zaG9ydF9uYW1lLCAiQTpcXCIgKTsKKyAgICBmdWxsLT5zaG9ydF9uYW1lWzBdICs9IGZ1bGwtPmRyaXZlOworCisgICAgaWYgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgIC8qIEFic29sdXRlIHBhdGggKi8KICAgICB7CiAgICAgICAgIHdoaWxlICgoKm5hbWUgPT0gJ1xcJykgfHwgKCpuYW1lID09ICcvJykpIG5hbWUrKzsKICAgICB9Ci0gICAgZWxzZQorICAgIGVsc2UgIC8qIFJlbGF0aXZlIHBhdGggKi8KICAgICB7Ci0gICAgICAgIGxzdHJjcHluMzJBKCByb290ICsgMSwgRFJJVkVfR2V0VW5peEN3ZChkcml2ZSksCi0gICAgICAgICAgICAgICAgICAgICBNQVhfUEFUSE5BTUVfTEVOIC0gKGludCkocm9vdCAtIGJ1ZmZlcikgLSAxICk7CisgICAgICAgIGxzdHJjcHluMzJBKCByb290ICsgMSwgRFJJVkVfR2V0VW5peEN3ZCggZnVsbC0+ZHJpdmUgKSwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmdWxsLT5sb25nX25hbWUpIC0gKHJvb3QgLSBmdWxsLT5sb25nX25hbWUpIC0gMSApOwogICAgICAgICBpZiAocm9vdFsxXSkgKnJvb3QgPSAnLyc7CisgICAgICAgIGxzdHJjcHluMzJBKCBmdWxsLT5zaG9ydF9uYW1lICsgMywgRFJJVkVfR2V0RG9zQ3dkKCBmdWxsLT5kcml2ZSApLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZ1bGwtPnNob3J0X25hbWUpIC0gMyApOwogICAgIH0KIAotICAgIHAgPSBidWZmZXJbMV0gPyBidWZmZXIgKyBzdHJsZW4oYnVmZmVyKSA6IGJ1ZmZlcjsKLSAgICBsZW4gPSBNQVhfUEFUSE5BTUVfTEVOIC0gc3RybGVuKGJ1ZmZlcik7CisgICAgcF9sID0gZnVsbC0+bG9uZ19uYW1lWzFdID8gZnVsbC0+bG9uZ19uYW1lICsgc3RybGVuKGZ1bGwtPmxvbmdfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBmdWxsLT5sb25nX25hbWU7CisgICAgcF9zID0gZnVsbC0+c2hvcnRfbmFtZVszXSA/IGZ1bGwtPnNob3J0X25hbWUgKyBzdHJsZW4oZnVsbC0+c2hvcnRfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZnVsbC0+c2hvcnRfbmFtZSArIDI7CiAgICAgZm91bmQgPSBUUlVFOworCiAgICAgd2hpbGUgKCpuYW1lICYmIGZvdW5kKQogICAgIHsKLSAgICAgICAgY29uc3QgY2hhciAqbmV3bmFtZSA9IERPU0ZTX0NoZWNrRG90RG90KCBuYW1lLCByb290LCAnLycsICZsZW4gKTsKLSAgICAgICAgaWYgKG5ld25hbWUgIT0gbmFtZSkKKyAgICAgICAgLyogQ2hlY2sgZm9yICcuJyBhbmQgJy4uJyAqLworCisgICAgICAgIGlmICgqbmFtZSA9PSAnLicpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHAgPSByb290ICsgc3RybGVuKHJvb3QpOwotICAgICAgICAgICAgbmFtZSA9IG5ld25hbWU7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGlmIChJU19FTkRfT0ZfTkFNRShuYW1lWzFdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lKys7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoKG5hbWVbMV0gPT0gJy4nKSAmJiBJU19FTkRfT0ZfTkFNRShuYW1lWzJdKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuYW1lICs9IDI7CisgICAgICAgICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOworICAgICAgICAgICAgICAgIHdoaWxlICgocF9sID4gcm9vdCkgJiYgKCpwX2wgIT0gJy8nKSkgcF9sLS07CisgICAgICAgICAgICAgICAgd2hpbGUgKChwX3MgPiBmdWxsLT5zaG9ydF9uYW1lICsgMikgJiYgKCpwX3MgIT0gJ1xcJykpIHBfcy0tOworICAgICAgICAgICAgICAgICpwX2wgPSAqcF9zID0gJ1wwJzsgIC8qIFJlbW92ZSB0cmFpbGluZyBzZXBhcmF0b3IgKi8KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBpZiAobGVuIDw9IDEpCisKKyAgICAgICAgLyogTWFrZSBzdXJlIGJ1ZmZlcnMgYXJlIGxhcmdlIGVub3VnaCAqLworCisgICAgICAgIGlmICgocF9zID49IGZ1bGwtPnNob3J0X25hbWUgKyBzaXplb2YoZnVsbC0+c2hvcnRfbmFtZSkgLSAxNCkgfHwKKyAgICAgICAgICAgIChwX2wgPj0gZnVsbC0+bG9uZ19uYW1lICsgc2l6ZW9mKGZ1bGwtPmxvbmdfbmFtZSkgLSAxKSkKICAgICAgICAgewogICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9QYXRoTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChmb3VuZCA9IERPU0ZTX0ZpbmRVbml4TmFtZSggYnVmZmVyLCBuYW1lLCBwKzEsIGxlbi0xLCBmbGFncyApKSkKKworICAgICAgICAvKiBHZXQgdGhlIGxvbmcgYW5kIHNob3J0IG5hbWUgbWF0Y2hpbmcgdGhlIGZpbGUgbmFtZSAqLworCisgICAgICAgIGlmICgoZm91bmQgPSBET1NGU19GaW5kVW5peE5hbWUoIGZ1bGwtPmxvbmdfbmFtZSwgbmFtZSwgcF9sICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZnVsbC0+bG9uZ19uYW1lKSAtIChwX2wgLSBmdWxsLT5sb25nX25hbWUpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwX3MgKyAxLCAhKGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpICkpKQogICAgICAgICB7Ci0gICAgICAgICAgICAqcCA9ICcvJzsKLSAgICAgICAgICAgIGxlbiAtPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICBwICs9IHN0cmxlbihwKTsKKyAgICAgICAgICAgICpwX2wrKyA9ICcvJzsKKyAgICAgICAgICAgIHBfbCAgICs9IHN0cmxlbihwX2wpOworICAgICAgICAgICAgKnBfcysrID0gJ1xcJzsKKyAgICAgICAgICAgIHBfcyAgICs9IHN0cmxlbihwX3MpOwogICAgICAgICAgICAgd2hpbGUgKCFJU19FTkRfT0ZfTkFNRSgqbmFtZSkpIG5hbWUrKzsKICAgICAgICAgfQogICAgICAgICBlbHNlIGlmICghY2hlY2tfbGFzdCkKICAgICAgICAgewotICAgICAgICAgICAgKnArKyA9ICcvJzsKLSAgICAgICAgICAgIGZvciAobGVuLS07ICFJU19FTkRfT0ZfTkFNRSgqbmFtZSkgJiYgKGxlbiA+IDEpOyBuYW1lKyssIGxlbi0tKQotICAgICAgICAgICAgICAgICpwKysgPSB0b2xvd2VyKCpuYW1lKTsKLSAgICAgICAgICAgICpwID0gJ1wwJzsKKyAgICAgICAgICAgICpwX2wrKyA9ICcvJzsKKyAgICAgICAgICAgICpwX3MrKyA9ICdcXCc7CisgICAgICAgICAgICB3aGlsZSAoIUlTX0VORF9PRl9OQU1FKCpuYW1lKSAmJgorICAgICAgICAgICAgICAgICAgIChwX3MgPCBmdWxsLT5zaG9ydF9uYW1lICsgc2l6ZW9mKGZ1bGwtPnNob3J0X25hbWUpIC0gMSkgJiYKKyAgICAgICAgICAgICAgICAgICAocF9sIDwgZnVsbC0+bG9uZ19uYW1lICsgc2l6ZW9mKGZ1bGwtPmxvbmdfbmFtZSkgLSAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcF9sKysgPSAqcF9zKysgPSB0b2xvd2VyKCpuYW1lKTsKKyAgICAgICAgICAgICAgICBuYW1lKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqcF9sID0gKnBfcyA9ICdcMCc7CiAgICAgICAgIH0KICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOwogICAgIH0KKwogICAgIGlmICghZm91bmQpCiAgICAgewogICAgICAgICBpZiAoY2hlY2tfbGFzdCkKICAgICAgICAgewogICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9GaWxlTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCpuYW1lKSAgLyogTm90IGxhc3QgKi8KICAgICAgICAgewogICAgICAgICAgICAgRE9TX0VSUk9SKCBFUl9QYXRoTm90Rm91bmQsIEVDX05vdEZvdW5kLCBTQV9BYm9ydCwgRUxfRGlzayApOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKCFidWZmZXJbMF0pIHN0cmNweSggYnVmZmVyLCAiLyIgKTsKLSAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19HZXRVbml4RmlsZU5hbWU6IHJldHVybmluZyAlc1xuIiwgYnVmZmVyICk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICBpZiAoIWZ1bGwtPmxvbmdfbmFtZVswXSkgc3RyY3B5KCBmdWxsLT5sb25nX25hbWUsICIvIiApOworICAgIGlmICghZnVsbC0+c2hvcnRfbmFtZVsyXSkgc3RyY3B5KCBmdWxsLT5zaG9ydF9uYW1lICsgMiwgIlxcIiApOworICAgIGRwcmludGZfZG9zZnMoIHN0ZGRlYiwgIkRPU0ZTX0dldEZ1bGxOYW1lOiByZXR1cm5pbmcgJXMgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBmdWxsLT5sb25nX25hbWUsIGZ1bGwtPnNob3J0X25hbWUgKTsKKyAgICByZXR1cm4gVFJVRTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBET1NGU19HZXREb3NUcnVlTmFtZQotICoKLSAqIENvbnZlcnQgYSBmaWxlIG5hbWUgKERPUyBvciBVbml4IGZvcm1hdCkgdG8gYSBjb21wbGV0ZSBET1MgbmFtZS4KLSAqIFJldHVybiBOVUxMIGlmIHRoZSBwYXRoIG5hbWUgaXMgaW52YWxpZCBvciB0b28gbG9uZy4KLSAqIFRoZSB1bml4X2Zvcm1hdCBmbGFnIGlzIGEgaGludCB0aGF0IHRoZSBmaWxlIG5hbWUgaXMgaW4gVW5peCBmb3JtYXQuCisgKiAgICAgICAgICAgR2V0U2hvcnRQYXRoTmFtZTMyQSAgIChLRVJORUwzMi4yNzEpCiAgKi8KLWNvbnN0IGNoYXIgKiBET1NGU19HZXREb3NUcnVlTmFtZSggY29uc3QgY2hhciAqbmFtZSwgaW50IHVuaXhfZm9ybWF0ICkKK0RXT1JEIEdldFNob3J0UGF0aE5hbWUzMkEoIExQQ1NUUiBsb25ncGF0aCwgTFBTVFIgc2hvcnRwYXRoLCBEV09SRCBzaG9ydGxlbiApCiB7Ci0gICAgc3RhdGljIGNoYXIgYnVmZmVyW01BWF9QQVRITkFNRV9MRU5dOwotICAgIGludCBkcml2ZSwgbGVuOwotICAgIFVJTlQzMiBmbGFnczsKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKKworICAgIC8qIEZJWE1FOiBpcyBpdCBjb3JyZWN0IHRvIGFsd2F5cyByZXR1cm4gYSBmdWxseSBxdWFsaWZpZWQgc2hvcnQgcGF0aD8gKi8KKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBsb25ncGF0aCwgVFJVRSwgJmZ1bGxfbmFtZSApKSByZXR1cm4gMDsKKyAgICBsc3RyY3B5bjMyQSggc2hvcnRwYXRoLCBmdWxsX25hbWUuc2hvcnRfbmFtZSwgc2hvcnRsZW4gKTsKKyAgICByZXR1cm4gc3RybGVuKCBmdWxsX25hbWUuc2hvcnRfbmFtZSApOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdldFNob3J0UGF0aE5hbWUzMlcgICAoS0VSTkVMMzIuMjcyKQorICovCitEV09SRCBHZXRTaG9ydFBhdGhOYW1lMzJXKCBMUENXU1RSIGxvbmdwYXRoLCBMUFdTVFIgc2hvcnRwYXRoLCBEV09SRCBzaG9ydGxlbiApCit7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CisgICAgRFdPUkQgcmV0ID0gMDsKKyAgICBMUFNUUiBsb25ncGF0aEEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxvbmdwYXRoICk7CisKKyAgICAvKiBGSVhNRTogaXMgaXQgY29ycmVjdCB0byBhbHdheXMgcmV0dXJuIGEgZnVsbHkgcXVhbGlmaWVkIHNob3J0IHBhdGg/ICovCisgICAgaWYgKERPU0ZTX0dldEZ1bGxOYW1lKCBsb25ncGF0aEEsIFRSVUUsICZmdWxsX25hbWUgKSkKKyAgICB7CisgICAgICAgIHJldCA9IHN0cmxlbiggZnVsbF9uYW1lLnNob3J0X25hbWUgKTsKKyAgICAgICAgbHN0cmNweW5BdG9XKCBzaG9ydHBhdGgsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lLCBzaG9ydGxlbiApOworICAgIH0KKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbG9uZ3BhdGhBICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBET1NGU19Eb0dldEZ1bGxQYXRoTmFtZQorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIEdldEZ1bGxQYXRoTmFtZTMyQS9XLgorICovCitzdGF0aWMgRFdPUkQgRE9TRlNfRG9HZXRGdWxsUGF0aE5hbWUoIExQQ1NUUiBuYW1lLCBEV09SRCBsZW4sIExQU1RSIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTDMyIHVuaWNvZGUgKQoreworICAgIGNoYXIgYnVmZmVyW01BWF9QQVRITkFNRV9MRU5dOworICAgIGludCBkcml2ZTsKICAgICBjaGFyICpwOwogCi0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfR2V0RG9zVHJ1ZU5hbWUoJXMsJWQpXG4iLCBuYW1lLCB1bml4X2Zvcm1hdCk7CisgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiR2V0RnVsbFBhdGhOYW1lOiBjb252ZXJ0aW5nICVzXG4iLCBuYW1lICk7CiAKLSAgICBpZiAoKGRyaXZlID0gRE9TRlNfR2V0UGF0aERyaXZlKCAmbmFtZSApKSA9PSAtMSkgcmV0dXJuIE5VTEw7CisgICAgaWYgKChkcml2ZSA9IERPU0ZTX0dldFBhdGhEcml2ZSggJm5hbWUgKSkgPT0gLTEpIHJldHVybiAwOwogICAgIHAgPSBidWZmZXI7CiAgICAgKnArKyA9ICdBJyArIGRyaXZlOwogICAgICpwKysgPSAnOic7Ci0gICAgaWYgKElTX0VORF9PRl9OQU1FKCpuYW1lKSkKKyAgICBpZiAoSVNfRU5EX09GX05BTUUoKm5hbWUpKSAgLyogQWJzb2x1dGUgcGF0aCAqLwogICAgIHsKICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOwogICAgIH0KLSAgICBlbHNlCisgICAgZWxzZSAgLyogUmVsYXRpdmUgcGF0aCAqLwogICAgIHsKICAgICAgICAgKnArKyA9ICdcXCc7CiAgICAgICAgIGxzdHJjcHluMzJBKCBwLCBEUklWRV9HZXREb3NDd2QoZHJpdmUpLCBzaXplb2YoYnVmZmVyKSAtIDMgKTsKICAgICAgICAgaWYgKCpwKSBwICs9IHN0cmxlbihwKTsgZWxzZSBwLS07CiAgICAgfQogICAgICpwID0gJ1wwJzsKLSAgICBsZW4gPSBNQVhfUEFUSE5BTUVfTEVOIC0gKGludCkocCAtIGJ1ZmZlcik7Ci0gICAgZmxhZ3MgPSBEUklWRV9HZXRGbGFncyhkcml2ZSk7CiAKICAgICB3aGlsZSAoKm5hbWUpCiAgICAgewotICAgICAgICBjb25zdCBjaGFyICpuZXduYW1lID0gRE9TRlNfQ2hlY2tEb3REb3QoIG5hbWUsIGJ1ZmZlcisyLCAnXFwnLCAmbGVuICk7Ci0gICAgICAgIGlmIChuZXduYW1lICE9IG5hbWUpCisgICAgICAgIGlmICgqbmFtZSA9PSAnLicpCiAgICAgICAgIHsKLSAgICAgICAgICAgIHAgPSBidWZmZXIgKyBzdHJsZW4oYnVmZmVyKTsKLSAgICAgICAgICAgIG5hbWUgPSBuZXduYW1lOwotICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBpZiAoSVNfRU5EX09GX05BTUUobmFtZVsxXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSsrOworICAgICAgICAgICAgICAgIHdoaWxlICgoKm5hbWUgPT0gJ1xcJykgfHwgKCpuYW1lID09ICcvJykpIG5hbWUrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKChuYW1lWzFdID09ICcuJykgJiYgSVNfRU5EX09GX05BTUUobmFtZVsyXSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbmFtZSArPSAyOworICAgICAgICAgICAgICAgIHdoaWxlICgoKm5hbWUgPT0gJ1xcJykgfHwgKCpuYW1lID09ICcvJykpIG5hbWUrKzsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHAgPiBidWZmZXIgKyAyKSAmJiAoKnAgIT0gJ1xcJykpIHAtLTsKKyAgICAgICAgICAgICAgICAqcCA9ICdcMCc7ICAvKiBSZW1vdmUgdHJhaWxpbmcgc2VwYXJhdG9yICovCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGxlbiA8PSAxKQorICAgICAgICBpZiAocCA+PSBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSAtIDEpCiAgICAgICAgIHsKICAgICAgICAgICAgIERPU19FUlJPUiggRVJfUGF0aE5vdEZvdW5kLCBFQ19Ob3RGb3VuZCwgU0FfQWJvcnQsIEVMX0Rpc2sgKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KICAgICAgICAgKnArKyA9ICdcXCc7Ci0gICAgICAgIGlmICh1bml4X2Zvcm1hdCkgIC8qIEhhc2ggaXQgaW50byBhIERPUyBuYW1lICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxzdHJjcHluMzJBKCBwLCBET1NGU19IYXNoKCBuYW1lLCBGQUxTRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVuICk7Ci0gICAgICAgICAgICBsZW4gLT0gc3RybGVuKHApOwotICAgICAgICAgICAgcCArPSBzdHJsZW4ocCk7Ci0gICAgICAgICAgICB3aGlsZSAoIUlTX0VORF9PRl9OQU1FKCpuYW1lKSkgbmFtZSsrOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgIC8qIEFscmVhZHkgRE9TIGZvcm1hdCwgc2ltcGx5IHVwcGVyLWNhc2UgaXQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgd2hpbGUgKCFJU19FTkRfT0ZfTkFNRSgqbmFtZSkgJiYgKGxlbiA+IDEpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpwKysgPSB0b3VwcGVyKCpuYW1lKTsKLSAgICAgICAgICAgICAgICBuYW1lKys7Ci0gICAgICAgICAgICAgICAgbGVuLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqcCA9ICdcMCc7Ci0gICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCFJU19FTkRfT0ZfTkFNRSgqbmFtZSkgJiYgKHAgPCBidWZmZXIgKyBzaXplb2YoYnVmZmVyKSAtIDEpKQorICAgICAgICAgICAgKnArKyA9ICpuYW1lKys7CisgICAgICAgICpwID0gJ1wwJzsKICAgICAgICAgd2hpbGUgKCgqbmFtZSA9PSAnXFwnKSB8fCAoKm5hbWUgPT0gJy8nKSkgbmFtZSsrOwogICAgIH0KKwogICAgIGlmICghYnVmZmVyWzJdKQogICAgIHsKICAgICAgICAgYnVmZmVyWzJdID0gJ1xcJzsKICAgICAgICAgYnVmZmVyWzNdID0gJ1wwJzsKICAgICB9Ci0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRE9TRlNfR2V0RG9zVHJ1ZU5hbWU6IHJldHVybmluZyAlc1xuIiwgYnVmZmVyICk7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICBpZiAoIShEUklWRV9HZXRGbGFncyhkcml2ZSkgJiBEUklWRV9DQVNFX1BSRVNFUlZJTkcpKQorICAgICAgICBDaGFyVXBwZXIzMkEoIGJ1ZmZlciApOworCisgICAgaWYgKHVuaWNvZGUpIGxzdHJjcHluQXRvVyggKExQV1NUUilyZXN1bHQsIGJ1ZmZlciwgbGVuICk7CisgICAgZWxzZSBsc3RyY3B5bjMyQSggcmVzdWx0LCBidWZmZXIsIGxlbiApOworCisgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiR2V0RnVsbFBhdGhOYW1lOiByZXR1cm5pbmcgJXNcbiIsIGJ1ZmZlciApOworICAgIHJldHVybiBzdHJsZW4oYnVmZmVyKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRGdWxsUGF0aE5hbWUzMkEgICAoS0VSTkVMMzIuMjcyKQorICovCitEV09SRCBHZXRGdWxsUGF0aE5hbWUzMkEoTFBDU1RSIG5hbWUsIERXT1JEIGxlbiwgTFBTVFIgYnVmZmVyLCBMUFNUUiAqbGFzdHBhcnQpCit7CisgICAgRFdPUkQgcmV0ID0gRE9TRlNfRG9HZXRGdWxsUGF0aE5hbWUoIG5hbWUsIGxlbiwgYnVmZmVyLCBGQUxTRSApOworICAgIGlmIChyZXQgJiYgbGFzdHBhcnQpCisgICAgeworICAgICAgICBMUFNUUiBwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CisgICAgICAgIHdoaWxlICgocCA+IGJ1ZmZlciArIDIpICYmICgqcCAhPSAnXFwnKSkgcC0tOworICAgICAgICAqbGFzdHBhcnQgPSBwICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRGdWxsUGF0aE5hbWUzMlcgICAoS0VSTkVMMzIuMjczKQorICovCitEV09SRCBHZXRGdWxsUGF0aE5hbWUzMlcoIExQQ1dTVFIgbmFtZSwgRFdPUkQgbGVuLCBMUFdTVFIgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdTVFIgKmxhc3RwYXJ0ICkKK3sKKyAgICBMUFNUUiBuYW1lQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIERXT1JEIHJldCA9IERPU0ZTX0RvR2V0RnVsbFBhdGhOYW1lKCBuYW1lQSwgbGVuLCAoTFBTVFIpYnVmZmVyLCBUUlVFICk7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWVBICk7CisgICAgaWYgKHJldCAmJiBsYXN0cGFydCkKKyAgICB7CisgICAgICAgIExQV1NUUiBwID0gYnVmZmVyICsgbHN0cmxlbjMyVyhidWZmZXIpOworICAgICAgICB3aGlsZSAoKHAgPiBidWZmZXIgKyAyKSAmJiAoKnAgIT0gJ1xcJykpIHAtLTsKKyAgICAgICAgKmxhc3RwYXJ0ID0gcCArIDE7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKIApAQCAtODg1LDYgKzkxNiw3IEBACiAgICAgc3RhdGljIGludCBjdXJfcG9zID0gMDsKICAgICBzdGF0aWMgaW50IGRyaXZlX3Jvb3QgPSAwOwogICAgIGNoYXIgKnA7CisgICAgY2hhciBkb3NfbmFtZVsxM107CiAgICAgTFBDU1RSIGxvbmdfbmFtZSwgc2hvcnRfbmFtZTsKICAgICBVSU5UMzIgZmxhZ3M7CiAgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKQEAgLTg5MywxNSArOTI1LDE0IEBACiAgICAgewogICAgICAgICBpZiAoc2tpcCkgcmV0dXJuIDA7CiAgICAgICAgIGVudHJ5LT5kd0ZpbGVBdHRyaWJ1dGVzICA9IEZJTEVfQVRUUklCVVRFX0xBQkVMOwotICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoICh0aW1lX3QpMCwgJmVudHJ5LT5mdENyZWF0aW9uVGltZSApOwotICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoICh0aW1lX3QpMCwgJmVudHJ5LT5mdExhc3RBY2Nlc3NUaW1lICk7Ci0gICAgICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggKHRpbWVfdCkwLCAmZW50cnktPmZ0TGFzdFdyaXRlVGltZSApOworICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoICh0aW1lX3QpMCwgJmVudHJ5LT5mdENyZWF0aW9uVGltZSwgMCApOworICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoICh0aW1lX3QpMCwgJmVudHJ5LT5mdExhc3RBY2Nlc3NUaW1lLCAwICk7CisgICAgICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggKHRpbWVfdCkwLCAmZW50cnktPmZ0TGFzdFdyaXRlVGltZSwgMCApOwogICAgICAgICBlbnRyeS0+bkZpbGVTaXplSGlnaCAgICAgPSAwOwogICAgICAgICBlbnRyeS0+bkZpbGVTaXplTG93ICAgICAgPSAwOwogICAgICAgICBlbnRyeS0+ZHdSZXNlcnZlZDAgICAgICAgPSAwOwogICAgICAgICBlbnRyeS0+ZHdSZXNlcnZlZDEgICAgICAgPSAwOwotICAgICAgICBzdHJjcHkoIGVudHJ5LT5jRmlsZU5hbWUsCi0gICAgICAgICAgICAgICAgRE9TRlNfVG9Eb3NEVEFGb3JtYXQoIERSSVZFX0dldExhYmVsKCBkcml2ZSApKSApOworICAgICAgICBET1NGU19Ub0Rvc0RUQUZvcm1hdCggRFJJVkVfR2V0TGFiZWwoIGRyaXZlICksIGVudHJ5LT5jRmlsZU5hbWUgKTsKICAgICAgICAgc3RyY3B5KCBlbnRyeS0+Y0FsdGVybmF0ZUZpbGVOYW1lLCBlbnRyeS0+Y0ZpbGVOYW1lICk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTk1Niw4ICs5ODcsMTEgQEAKICAgICAgICAgaWYgKHNob3J0X21hc2spCiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghc2hvcnRfbmFtZSkKLSAgICAgICAgICAgICAgICBzaG9ydF9uYW1lID0gRE9TRlNfSGFzaCggbG9uZ19uYW1lLCBUUlVFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpICk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRE9TRlNfSGFzaCggbG9uZ19uYW1lLCBkb3NfbmFtZSwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpICk7CisgICAgICAgICAgICAgICAgc2hvcnRfbmFtZSA9IGRvc19uYW1lOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKCFET1NGU19NYXRjaFNob3J0KCBzaG9ydF9tYXNrLCBzaG9ydF9uYW1lICkpIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTk3MywxOSArMTAwNywyMSBAQAogCiAgICAgICAgIC8qIFdlIG5vdyBoYXZlIGEgbWF0Y2hpbmcgZW50cnk7IGZpbGwgdGhlIHJlc3VsdCBhbmQgcmV0dXJuICovCiAKLSAgICAgICAgaWYgKCFzaG9ydF9uYW1lKQotICAgICAgICAgICAgc2hvcnRfbmFtZSA9IERPU0ZTX0hhc2goIGxvbmdfbmFtZSwgVFJVRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKGZsYWdzICYgRFJJVkVfQ0FTRV9TRU5TSVRJVkUpICk7Ci0KICAgICAgICAgZW50cnktPmR3RmlsZUF0dHJpYnV0ZXMgPSBpbmZvLmR3RmlsZUF0dHJpYnV0ZXM7CiAgICAgICAgIGVudHJ5LT5mdENyZWF0aW9uVGltZSAgID0gaW5mby5mdENyZWF0aW9uVGltZTsKICAgICAgICAgZW50cnktPmZ0TGFzdEFjY2Vzc1RpbWUgPSBpbmZvLmZ0TGFzdEFjY2Vzc1RpbWU7CiAgICAgICAgIGVudHJ5LT5mdExhc3RXcml0ZVRpbWUgID0gaW5mby5mdExhc3RXcml0ZVRpbWU7CiAgICAgICAgIGVudHJ5LT5uRmlsZVNpemVIaWdoICAgID0gaW5mby5uRmlsZVNpemVIaWdoOwogICAgICAgICBlbnRyeS0+bkZpbGVTaXplTG93ICAgICA9IGluZm8ubkZpbGVTaXplTG93OwotICAgICAgICBzdHJjcHkoIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUsIERPU0ZTX1RvRG9zRFRBRm9ybWF0KHNob3J0X25hbWUpICk7CisKKyAgICAgICAgaWYgKHNob3J0X25hbWUpCisgICAgICAgICAgICBET1NGU19Ub0Rvc0RUQUZvcm1hdCggc2hvcnRfbmFtZSwgZW50cnktPmNBbHRlcm5hdGVGaWxlTmFtZSApOworICAgICAgICBlbHNlCisgICAgICAgICAgICBET1NGU19IYXNoKCBsb25nX25hbWUsIGVudHJ5LT5jQWx0ZXJuYXRlRmlsZU5hbWUsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgIShmbGFncyAmIERSSVZFX0NBU0VfU0VOU0lUSVZFKSApOworCiAgICAgICAgIGxzdHJjcHluMzJBKCBlbnRyeS0+Y0ZpbGVOYW1lLCBsb25nX25hbWUsIHNpemVvZihlbnRyeS0+Y0ZpbGVOYW1lKSApOwotICAgICAgICBpZiAoIShmbGFncyAmIERSSVZFX0NBU0VfUFJFU0VSVklORykpIEFuc2lMb3dlciggZW50cnktPmNGaWxlTmFtZSApOworICAgICAgICBpZiAoIShmbGFncyAmIERSSVZFX0NBU0VfUFJFU0VSVklORykpIENoYXJMb3dlcjMyQSggZW50cnktPmNGaWxlTmFtZSApOwogICAgICAgICBkcHJpbnRmX2Rvc2ZzKCBzdGRkZWIsICJET1NGU19GaW5kTmV4dDogcmV0dXJuaW5nICVzICglcykgJTAybHggJWxkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+Y0ZpbGVOYW1lLCBlbnRyeS0+Y0FsdGVybmF0ZUZpbGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBlbnRyeS0+ZHdGaWxlQXR0cmlidXRlcywgZW50cnktPm5GaWxlU2l6ZUxvdyApOwpAQCAtMTAwNCwxNyArMTA0MCwxNyBAQAogICovCiBIQU5ETEUxNiBGaW5kRmlyc3RGaWxlMTYoIExQQ1NUUiBwYXRoLCBXSU4zMl9GSU5EX0RBVEEzMkEgKmRhdGEgKQogeworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIEhHTE9CQUwxNiBoYW5kbGU7CiAgICAgRklORF9GSVJTVF9JTkZPICppbmZvOwotICAgIExQQ1NUUiBwdHI7CiAKICAgICBpZiAoIXBhdGgpIHJldHVybiAwOwotICAgIGlmICghKHB0ciA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggcGF0aCwgRkFMU0UgKSkpCisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgRkFMU0UsICZmdWxsX25hbWUgKSkKICAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMTY7CiAgICAgaWYgKCEoaGFuZGxlID0gR2xvYmFsQWxsb2MxNiggR01FTV9NT1ZFQUJMRSwgc2l6ZW9mKEZJTkRfRklSU1RfSU5GTykgKSkpCiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTE2OwogICAgIGluZm8gPSAoRklORF9GSVJTVF9JTkZPICopR2xvYmFsTG9jazE2KCBoYW5kbGUgKTsKLSAgICBpbmZvLT5wYXRoID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBwdHIgKTsKKyAgICBpbmZvLT5wYXRoID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBmdWxsX25hbWUubG9uZ19uYW1lICk7CiAgICAgaW5mby0+bWFzayA9IHN0cnJjaHIoIGluZm8tPnBhdGgsICcvJyApOwogICAgICooaW5mby0+bWFzaysrKSA9ICdcMCc7CiAgICAgaWYgKHBhdGhbMF0gJiYgKHBhdGhbMV0gPT0gJzonKSkgaW5mby0+ZHJpdmUgPSB0b3VwcGVyKCpwYXRoKSAtICdBJzsKQEAgLTExNTYsNzIgKzExOTIsMzQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHZXRTaG9ydFBhdGhOYW1lMzJBICAgKEtFUk5FTDMyLjI3MSkKKyAqICAgICAgICAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUKKyAqCisgKiBDb252ZXJ0IGEgVW5peCB0aW1lIHRvIEZJTEVUSU1FIGZvcm1hdC4KKyAqIFRoZSBGSUxFVElNRSBzdHJ1Y3R1cmUgaXMgYSA2NC1iaXQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBudW1iZXIgb2YKKyAqIDEwMC1uYW5vc2Vjb25kIGludGVydmFscyBzaW5jZSBKYW51YXJ5IDEsIDE2MDEuCisgKiAncmVtYWluZGVyJyBpcyB0aGUgZnJhY3Rpb24gb2YgMTAwLW5zIGludGVydmFscyBzbWFsbGVyIHRoYW4gMSBzZWNvbmQKKyAqIHRoYXQgY291bGRuJ3QgYmUgc3RvcmVkIGluIHRoZSB0aW1lX3QgdmFsdWUuCiAgKi8KLURXT1JEIEdldFNob3J0UGF0aE5hbWUzMkEoIExQQ1NUUiBsb25ncGF0aCwgTFBTVFIgc2hvcnRwYXRoLCBEV09SRCBzaG9ydGxlbiApCit2b2lkIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggdGltZV90IHVuaXhfdGltZSwgRklMRVRJTUUgKmZpbGV0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHJlbWFpbmRlciApCiB7Ci0gICAgTFBDU1RSIGRvc3RydWVuYW1lOwotCi0gICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiR2V0U2hvcnRQYXRoTmFtZTMyQSglcywlcCwlbGQpXG4iLAotICAgICAgICAgICAgICAgICAgIGxvbmdwYXRoLCBzaG9ydHBhdGgsIHNob3J0bGVuICk7Ci0KLSAgICBkb3N0cnVlbmFtZSA9IERPU0ZTX0dldERvc1RydWVOYW1lKCBsb25ncGF0aCwgVFJVRSApOwotICAgIGxzdHJjcHluMzJBKCBzaG9ydHBhdGgsIGRvc3RydWVuYW1lLCBzaG9ydGxlbiApOwotICAgIHJldHVybiBzdHJsZW4oZG9zdHJ1ZW5hbWUpOworICAgIC8qIEZJWE1FIDotKSAqLworICAgIGZpbGV0aW1lLT5kd0xvd0RhdGVUaW1lICA9IHVuaXhfdGltZTsKKyAgICBmaWxldGltZS0+ZHdIaWdoRGF0ZVRpbWUgPSAwOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFNob3J0UGF0aE5hbWVXICAgKEtFUk5FTDMyLjI3MikKKyAqICAgICAgICAgICBET1NGU19GaWxlVGltZVRvVW5peFRpbWUKKyAqCisgKiBDb252ZXJ0IGEgRklMRVRJTUUgZm9ybWF0IHRvIFVuaXggdGltZS4KKyAqIElmIG5vdCBOVUxMLCAncmVtYWluZGVyJyBjb250YWlucyB0aGUgZnJhY3Rpb25hbCBwYXJ0IG9mIHRoZSBmaWxldGltZS4KICAqLwotRFdPUkQgR2V0U2hvcnRQYXRoTmFtZTMyVyggTFBDV1NUUiBsb25ncGF0aCwgTFBXU1RSIHNob3J0cGF0aCwgRFdPUkQgc2hvcnRsZW4gKQordGltZV90IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSggY29uc3QgRklMRVRJTUUgKmZpbGV0aW1lLCBEV09SRCAqcmVtYWluZGVyICkKIHsKLSAgICBMUFNUUiBsb25ncGF0aGEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxvbmdwYXRoICk7Ci0gICAgTFBDU1RSIGRvc3RydWVuYW1lID0gRE9TRlNfR2V0RG9zVHJ1ZU5hbWUoIGxvbmdwYXRoYSwgVFJVRSApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBsb25ncGF0aGEgKTsKLSAgICBsc3RyY3B5bkF0b1coIHNob3J0cGF0aCwgZG9zdHJ1ZW5hbWUsIHNob3J0bGVuICk7Ci0gICAgcmV0dXJuIHN0cmxlbihkb3N0cnVlbmFtZSk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RnVsbFBhdGhOYW1lQSAgIChLRVJORUwzMi4yNzIpCi0gKi8KLURXT1JEIEdldEZ1bGxQYXRoTmFtZTMyQSggTFBDU1RSIGZuLCBEV09SRCBidWZsZW4sIExQU1RSIGJ1ZiwgTFBTVFIgKmxhc3RwYXJ0KQotewotCWRwcmludGZfZmlsZShzdGRkZWIsIkdldEZ1bGxQYXRoTmFtZUEoJXMpXG4iLGZuKTsKLQkvKiBGSVhNRSAqLwotICAgICAgICBpZiAoYnVmKSB7Ci0gICAgICAgICAgICBsc3RyY3B5bjMyQShidWYsZm4sYnVmbGVuKTsKLSAgICAgICAgICAgIGlmIChsYXN0cGFydCkgewotCQkqbGFzdHBhcnQgPSBzdHJyY2hyKGJ1ZiwnXFwnKTsKLQkJaWYgKCEqbGFzdHBhcnQpICpsYXN0cGFydD1idWY7Ci0JICAgIH0KLQl9Ci0JcmV0dXJuIHN0cmxlbihmbik7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldEZ1bGxQYXRoTmFtZTMyVyAgIChLRVJORUwzMi4yNzMpCi0gKi8KLURXT1JEIEdldEZ1bGxQYXRoTmFtZTMyVyhMUENXU1RSIGZuLERXT1JEIGJ1ZmxlbixMUFdTVFIgYnVmLExQV1NUUiAqbGFzdHBhcnQpIHsKLQlMUFdTVFIgIHg7Ci0KLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJHZXRGdWxsUGF0aE5hbWVXKCVwKVxuIixmbik7Ci0JLyogRklYTUUgKi8KLQlpZiAoYnVmKSB7Ci0JCWxzdHJjcHluMzJXKGJ1ZixmbixidWZsZW4pOwotCQlpZiAobGFzdHBhcnQpIHsKLQkJCXggPSBidWYrbHN0cmxlbjMyVyhidWYpLTE7Ci0JCQl3aGlsZSAoeD49YnVmICYmICp4IT0nXFwnKQotCQkJeC0tOwotCQkJaWYgKHg+PWJ1ZikKLQkJCQkqbGFzdHBhcnQ9eDsKLQkJCWVsc2UKLQkJCQkqbGFzdHBhcnQ9YnVmOwotCQl9Ci0JfQotCXJldHVybiBsc3RybGVuMzJXKGZuKTsKKyAgICAvKiBGSVhNRSA6LSkgKi8KKyAgICBpZiAocmVtYWluZGVyKSAqcmVtYWluZGVyID0gMDsKKyAgICByZXR1cm4gZmlsZXRpbWUtPmR3TG93RGF0ZVRpbWU7CiB9CiAKIApAQCAtMTIzMCw4ICsxMjI4LDE1IEBACiAgKi8KIEJPT0wzMiBEb3NEYXRlVGltZVRvRmlsZVRpbWUoIFdPUkQgZmF0ZGF0ZSwgV09SRCBmYXR0aW1lLCBMUEZJTEVUSU1FIGZ0ICkKIHsKLSAgICB0aW1lX3QgdW5peHRpbWUgPSBET1NGU19Eb3NEYXRlVGltZVRvVW5peFRpbWUoZmF0ZGF0ZSxmYXR0aW1lKTsKLSAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUodW5peHRpbWUsZnQpOworICAgIHN0cnVjdCB0bSBuZXd0bTsKKworICAgIG5ld3RtLnRtX3NlYyAgPSAoZmF0dGltZSAmIDB4MWYpICogMjsKKyAgICBuZXd0bS50bV9taW4gID0gKGZhdHRpbWUgPj4gNSkgJiAweDNmOworICAgIG5ld3RtLnRtX2hvdXIgPSAoZmF0dGltZSA+PiAxMSk7CisgICAgbmV3dG0udG1fbWRheSA9IChmYXRkYXRlICYgMHgxZik7CisgICAgbmV3dG0udG1fbW9uICA9ICgoZmF0ZGF0ZSA+PiA1KSAmIDB4MGYpIC0gMTsKKyAgICBuZXd0bS50bV95ZWFyID0gKGZhdGRhdGUgPj4gOSkgKyA4MDsKKyAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIG1rdGltZSggJm5ld3RtICksIGZ0LCAwICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKQEAgLTEyNDIsOCArMTI0NywxMyBAQAogQk9PTDMyIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSggY29uc3QgRklMRVRJTUUgKmZ0LCBMUFdPUkQgZmF0ZGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExQV09SRCBmYXR0aW1lICkKIHsKLSAgICB0aW1lX3QgdW5peHRpbWUgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoZnQpOwotICAgIERPU0ZTX1RvRG9zRGF0ZVRpbWUodW5peHRpbWUsZmF0ZGF0ZSxmYXR0aW1lKTsKKyAgICB0aW1lX3QgdW5peHRpbWUgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoIGZ0LCBOVUxMICk7CisgICAgc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSggJnVuaXh0aW1lICk7CisgICAgaWYgKGZhdHRpbWUpCisgICAgICAgICpmYXR0aW1lID0gKHRtLT50bV9ob3VyIDw8IDExKSArICh0bS0+dG1fbWluIDw8IDUpICsgKHRtLT50bV9zZWMgLyAyKTsKKyAgICBpZiAoZmF0ZGF0ZSkKKyAgICAgICAgKmZhdGRhdGUgPSAoKHRtLT50bV95ZWFyIC0gODApIDw8IDkpICsgKCh0bS0+dG1fbW9uICsgMSkgPDwgNSkKKyAgICAgICAgICAgICAgICAgICArIHRtLT50bV9tZGF5OwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0xMjU0LDExICsxMjY0LDEyIEBACiBCT09MMzIgTG9jYWxGaWxlVGltZVRvRmlsZVRpbWUoIGNvbnN0IEZJTEVUSU1FICpsb2NhbGZ0LCBMUEZJTEVUSU1FIHV0Y2Z0ICkKIHsKICAgICBzdHJ1Y3QgdG0gKnh0bTsKKyAgICBEV09SRCByZW1haW5kZXI7CiAKICAgICAvKiBjb252ZXJ0IGZyb20gbG9jYWwgdG8gVVRDLiBQZXJoYXBzIG5vdCBjb3JyZWN0LiBGSVhNRSAqLwotICAgIHh0bSA9IGdtdGltZSgodGltZV90KikmKGxvY2FsZnQtPmR3TG93RGF0ZVRpbWUpKTsKLSAgICB1dGNmdC0+ZHdMb3dEYXRlVGltZSAgPSBta3RpbWUoeHRtKTsKLSAgICB1dGNmdC0+ZHdIaWdoRGF0ZVRpbWUgPSAwOworICAgIHRpbWVfdCB1bml4dGltZSA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSggbG9jYWxmdCwgJnJlbWFpbmRlciApOworICAgIHh0bSA9IGdtdGltZSggJnVuaXh0aW1lICk7CisgICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCBta3RpbWUoeHRtKSwgdXRjZnQsIHJlbWFpbmRlciApOwogICAgIHJldHVybiBUUlVFOyAKIH0KIApAQCAtMTI2OSwxMSArMTI4MCwxMiBAQAogQk9PTDMyIEZpbGVUaW1lVG9Mb2NhbEZpbGVUaW1lKCBjb25zdCBGSUxFVElNRSAqdXRjZnQsIExQRklMRVRJTUUgbG9jYWxmdCApCiB7CiAgICAgc3RydWN0IHRtICp4dG07CisgICAgRFdPUkQgcmVtYWluZGVyOwogCiAgICAgLyogY29udmVydCBmcm9tIFVUQyB0byBsb2NhbC4gUGVyaGFwcyBub3QgY29ycmVjdC4gRklYTUUgKi8KLSAgICB4dG0gPSBsb2NhbHRpbWUoKHRpbWVfdCopJih1dGNmdC0+ZHdMb3dEYXRlVGltZSkpOwotICAgIGxvY2FsZnQtPmR3TG93RGF0ZVRpbWUgID0gbWt0aW1lKHh0bSk7Ci0gICAgbG9jYWxmdC0+ZHdIaWdoRGF0ZVRpbWUgPSAwOworICAgIHRpbWVfdCB1bml4dGltZSA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSggdXRjZnQsICZyZW1haW5kZXIgKTsKKyAgICB4dG0gPSBsb2NhbHRpbWUoICZ1bml4dGltZSApOworICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggbWt0aW1lKHh0bSksIGxvY2FsZnQsIHJlbWFpbmRlciApOwogICAgIHJldHVybiBUUlVFOyAKIH0KIApAQCAtMTI4NCwxOSArMTI5Niw2OCBAQAogQk9PTDMyIEZpbGVUaW1lVG9TeXN0ZW1UaW1lKCBjb25zdCBGSUxFVElNRSAqZnQsIExQU1lTVEVNVElNRSBzeXN0ICkKIHsKICAgICBzdHJ1Y3QgdG0gKnh0bTsKLSAgICB0aW1lX3QgeHRpbWUgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoZnQpOworICAgIERXT1JEIHJlbWFpbmRlcjsKKyAgICB0aW1lX3QgeHRpbWUgPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoIGZ0LCAmcmVtYWluZGVyICk7CiAgICAgeHRtID0gZ210aW1lKCZ4dGltZSk7Ci0gICAgc3lzdC0+d1llYXIgICAgICA9IHh0bS0+dG1feWVhcjsKLSAgICBzeXN0LT53TW9udGggICAgID0geHRtLT50bV9tb247Ci0gICAgc3lzdC0+d0RheU9mV2VlayA9IHh0bS0+dG1fd2RheTsKLSAgICBzeXN0LT53RGF5CSAgICAgPSB4dG0tPnRtX21kYXk7Ci0gICAgc3lzdC0+d0hvdXIJICAgICA9IHh0bS0+dG1faG91cjsKLSAgICBzeXN0LT53TWludXRlICAgID0geHRtLT50bV9taW47Ci0gICAgc3lzdC0+d1NlY29uZCAgICA9IHh0bS0+dG1fc2VjOwotICAgIHN5c3QtPndNaWxsaXNlY29uZHMJPSAwOyAvKiBGSVhNRSAqLworICAgIHN5c3QtPndZZWFyICAgICAgICAgPSB4dG0tPnRtX3llYXI7CisgICAgc3lzdC0+d01vbnRoICAgICAgICA9IHh0bS0+dG1fbW9uOworICAgIHN5c3QtPndEYXlPZldlZWsgICAgPSB4dG0tPnRtX3dkYXk7CisgICAgc3lzdC0+d0RheQkgICAgICAgID0geHRtLT50bV9tZGF5OworICAgIHN5c3QtPndIb3VyCSAgICAgICAgPSB4dG0tPnRtX2hvdXI7CisgICAgc3lzdC0+d01pbnV0ZSAgICAgICA9IHh0bS0+dG1fbWluOworICAgIHN5c3QtPndTZWNvbmQgICAgICAgPSB4dG0tPnRtX3NlYzsKKyAgICBzeXN0LT53TWlsbGlzZWNvbmRzCT0gcmVtYWluZGVyIC8gMTAwMDA7CiAgICAgcmV0dXJuIFRSVUU7IAogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBRdWVyeURvc0RldmljZUEgICAoS0VSTkVMMzIuNDEzKQorICoKKyAqIHJldHVybnMgYXJyYXkgb2Ygc3RyaW5ncyB0ZXJtaW5hdGVkIGJ5IFwwLCB0ZXJtaW5hdGVkIGJ5IFwwCisgKi8KK0RXT1JECitRdWVyeURvc0RldmljZTMyQShMUENTVFIgZGV2bmFtZSxMUFNUUiB0YXJnZXQsRFdPUkQgYnVmc2l6ZSkKK3sKKyAgICBMUFNUUiBzOworICAgIGNoYXIgIGJ1ZmZlclsyMDBdOworCisgICAgZHByaW50Zl9kb3NmcyhzdGRkZWIsIlF1ZXJ5RG9zRGV2aWNlKCVzLC4uLilcbiIsZGV2bmFtZT9kZXZuYW1lOiI8bnVsbD4iKTsKKyAgICBpZiAoIWRldm5hbWUpIHsKKwkvKiByZXR1cm4ga25vd24gTVNET1MgZGV2aWNlcyAqLworCWxzdHJjcHkzMkEoYnVmZmVyLCJDT04gQ09NMSBDT00yIExQVDEgTlVMICIpOworCXdoaWxlICgocz1zdHJjaHIoYnVmZmVyLCcgJykpKQorCQkqcz0nXDAnOworCisJbHN0cmNweW4zMkEodGFyZ2V0LGJ1ZmZlcixidWZzaXplKTsKKwlyZXR1cm4gc3RybGVuKGJ1ZmZlcik7CisgICAgfQorICAgIGxzdHJjcHkzMkEoYnVmZmVyLCJcXERFVlxcIik7CisgICAgbHN0cmNhdDMyQShidWZmZXIsZGV2bmFtZSk7CisgICAgaWYgKHM9c3RyY2hyKGJ1ZmZlciwnOicpKQorICAgIAkqcz0nXDAnOworICAgIGxzdHJjcHluMzJBKHRhcmdldCxidWZmZXIsYnVmc2l6ZSk7CisgICAgcmV0dXJuIHN0cmxlbihidWZmZXIpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFF1ZXJ5RG9zRGV2aWNlVyAgIChLRVJORUwzMi40MTQpCisgKgorICogcmV0dXJucyBhcnJheSBvZiBzdHJpbmdzIHRlcm1pbmF0ZWQgYnkgXDAsIHRlcm1pbmF0ZWQgYnkgXDAKKyAqLworRFdPUkQKK1F1ZXJ5RG9zRGV2aWNlMzJXKExQQ1dTVFIgZGV2bmFtZSxMUFdTVFIgdGFyZ2V0LERXT1JEIGJ1ZnNpemUpCit7CisgICAgTFBTVFIgZGV2bmFtZUEgPSBkZXZuYW1lP0hFQVBfc3RyZHVwV3RvQShHZXRQcm9jZXNzSGVhcCgpLDAsZGV2bmFtZSk6TlVMTDsKKyAgICBMUFNUUiB0YXJnZXRBID0gKExQU1RSKUhFQVBfeGFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxidWZzaXplKTsKKyAgICBEV09SRCByZXQgPSBRdWVyeURvc0RldmljZTMyQShkZXZuYW1lQSx0YXJnZXRBLGJ1ZnNpemUpOworCisgICAgbHN0cmNweW5BdG9XKHRhcmdldCx0YXJnZXRBLGJ1ZnNpemUpOworICAgIGlmIChkZXZuYW1lQSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGRldm5hbWVBKTsKKyAgICBpZiAodGFyZ2V0QSkgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLHRhcmdldEEpOworICAgIHJldHVybiByZXQ7Cit9CisKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgU3lzdGVtVGltZVRvRmlsZVRpbWUgICAoS0VSTkVMMzIuNTI2KQpAQCAtMTMxMiw2ICsxMzczLDYgQEAKICAgICB4dG0udG1faG91cgk9IHN5c3QtPndIb3VyOwogICAgIHh0bS50bV9taW4JPSBzeXN0LT53TWludXRlOwogICAgIHh0bS50bV9zZWMJPSBzeXN0LT53U2Vjb25kOwotICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZShta3RpbWUoJnh0bSksZnQpOworICAgIERPU0ZTX1VuaXhUaW1lVG9GaWxlVGltZSggbWt0aW1lKCZ4dG0pLCBmdCwgc3lzdC0+d01pbGxpc2Vjb25kcyAqIDEwMDAwICk7CiAgICAgcmV0dXJuIFRSVUU7IAogfQpkaWZmIC0tZ2l0IGEvZmlsZXMvZHJpdmUuYyBiL2ZpbGVzL2RyaXZlLmMKaW5kZXggYjg3NjY3NS4uZDU5ZTAyYiAxMDA2NDQKLS0tIGEvZmlsZXMvZHJpdmUuYworKysgYi9maWxlcy9kcml2ZS5jCkBAIC0yNSw3ICsyNSw2IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgotI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKQEAgLTQxMCw4ICs0MDksOSBAQAogICovCiBpbnQgRFJJVkVfQ2hkaXIoIGludCBkcml2ZSwgY29uc3QgY2hhciAqcGF0aCApCiB7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAgICAgY2hhciBidWZmZXJbTUFYX1BBVEhOQU1FX0xFTl07Ci0gICAgY29uc3QgY2hhciAqdW5peF9jd2QsICpkb3NfY3dkOworICAgIExQU1RSIHVuaXhfY3dkOwogICAgIEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OIGluZm87CiAgICAgVERCICpwVGFzayA9IChUREIgKilHbG9iYWxMb2NrMTYoIEdldEN1cnJlbnRUYXNrKCkgKTsKIApAQCAtNDIwLDMxICs0MjAsMzAgQEAKICAgICBidWZmZXJbMF0gKz0gZHJpdmU7CiAgICAgbHN0cmNweW4zMkEoIGJ1ZmZlciArIDIsIHBhdGgsIHNpemVvZihidWZmZXIpIC0gMiApOwogCi0gICAgaWYgKCEodW5peF9jd2QgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIGJ1ZmZlciwgVFJVRSApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCFGSUxFX1N0YXQoIHVuaXhfY3dkLCAmaW5mbyApKSByZXR1cm4gMDsKKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBidWZmZXIsIFRSVUUsICZmdWxsX25hbWUgKSkgcmV0dXJuIDA7CisgICAgaWYgKCFGSUxFX1N0YXQoIGZ1bGxfbmFtZS5sb25nX25hbWUsICZpbmZvICkpIHJldHVybiAwOwogICAgIGlmICghKGluZm8uZHdGaWxlQXR0cmlidXRlcyAmIEZJTEVfQVRUUklCVVRFX0RJUkVDVE9SWSkpCiAgICAgewogICAgICAgICBET1NfRVJST1IoIEVSX0ZpbGVOb3RGb3VuZCwgRUNfTm90Rm91bmQsIFNBX0Fib3J0LCBFTF9EaXNrICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICB1bml4X2N3ZCArPSBzdHJsZW4oIERPU0RyaXZlc1tkcml2ZV0ucm9vdCApOworICAgIHVuaXhfY3dkID0gZnVsbF9uYW1lLmxvbmdfbmFtZSArIHN0cmxlbiggRE9TRHJpdmVzW2RyaXZlXS5yb290ICk7CiAgICAgd2hpbGUgKCp1bml4X2N3ZCA9PSAnLycpIHVuaXhfY3dkKys7Ci0gICAgYnVmZmVyWzJdID0gJy8nOwotICAgIGxzdHJjcHluMzJBKCBidWZmZXIgKyAzLCB1bml4X2N3ZCwgc2l6ZW9mKGJ1ZmZlcikgLSAzICk7Ci0gICAgaWYgKCEoZG9zX2N3ZCA9IERPU0ZTX0dldERvc1RydWVOYW1lKCBidWZmZXIsIFRSVUUgKSkpIHJldHVybiAwOwogCiAgICAgZHByaW50Zl9kb3Nmcyggc3RkZGViLCAiRFJJVkVfQ2hkaXIoJWM6KTogdW5peF9jd2Q9JXMgZG9zX2N3ZD0lc1xuIiwKLSAgICAgICAgICAgICAgICAgICAnQScgKyBkcml2ZSwgdW5peF9jd2QsIGRvc19jd2QgKyAzICk7CisgICAgICAgICAgICAgICAgICAgJ0EnICsgZHJpdmUsIHVuaXhfY3dkLCBmdWxsX25hbWUuc2hvcnRfbmFtZSArIDMgKTsKIAogICAgIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBET1NEcml2ZXNbZHJpdmVdLmRvc19jd2QgKTsKICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgRE9TRHJpdmVzW2RyaXZlXS51bml4X2N3ZCApOwotICAgIERPU0RyaXZlc1tkcml2ZV0uZG9zX2N3ZCAgPSBIRUFQX3N0cmR1cEEoIFN5c3RlbUhlYXAsIDAsIGRvc19jd2QgKyAzICk7CisgICAgRE9TRHJpdmVzW2RyaXZlXS5kb3NfY3dkICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWUuc2hvcnRfbmFtZSArIDMgKTsKICAgICBET1NEcml2ZXNbZHJpdmVdLnVuaXhfY3dkID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCB1bml4X2N3ZCApOwogCiAgICAgaWYgKHBUYXNrICYmIChwVGFzay0+Y3VyZHJpdmUgJiAweDgwKSAmJiAKICAgICAgICAgKChwVGFzay0+Y3VyZHJpdmUgJiB+MHg4MCkgPT0gZHJpdmUpKQogICAgIHsKLSAgICAgICAgbHN0cmNweW4zMkEoIHBUYXNrLT5jdXJkaXIsIGRvc19jd2QgKyAyLCBzaXplb2YocFRhc2stPmN1cmRpcikgKTsKKyAgICAgICAgbHN0cmNweW4zMkEoIHBUYXNrLT5jdXJkaXIsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lICsgMiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwVGFzay0+Y3VyZGlyKSApOwogICAgICAgICBEUklWRV9MYXN0VGFzayA9IEdldEN1cnJlbnRUYXNrKCk7CiAgICAgfQogICAgIHJldHVybiAxOwpkaWZmIC0tZ2l0IGEvZmlsZXMvZmlsZS5jIGIvZmlsZXMvZmlsZS5jCmluZGV4IGY4NDFiODEuLjA0OGU1OGQgMTAwNjQ0Ci0tLSBhL2ZpbGVzL2ZpbGUuYworKysgYi9maWxlcy9maWxlLmMKQEAgLTIwLDcgKzIwLDYgQEAKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5lcnJvci5oIgotI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgImRyaXZlLmgiCiAjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImdsb2JhbC5oIgpAQCAtMjEyLDExICsyMTEsOCBAQAogCiAgICAgaWYgKChmaWxlLT51bml4X2hhbmRsZSA9IG9wZW4oIG5hbWUsIG1vZGUsIDA2NjYgKSkgPT0gLTEpCiAgICAgewotICAgICAgICBpZiAoT3B0aW9ucy5hbGxvd1JlYWRPbmx5ICYmIChtb2RlID09IE9fUkRXUikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoZmlsZS0+dW5peF9oYW5kbGUgPSBvcGVuKCBuYW1lLCBPX1JET05MWSApKSAhPSAtMSkKLSAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBjb3VsZCBub3Qgb3BlbiAlcyBmb3Igd3JpdGluZywgb3BlbmluZyByZWFkLW9ubHkuXG4iLCBuYW1lICk7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCFPcHRpb25zLmZhaWxSZWFkT25seSAmJiAobW9kZSA9PSBPX1JEV1IpKQorICAgICAgICAgICAgZmlsZS0+dW5peF9oYW5kbGUgPSBvcGVuKCBuYW1lLCBPX1JET05MWSApOwogICAgIH0KICAgICBpZiAoKGZpbGUtPnVuaXhfaGFuZGxlID09IC0xKSB8fCAoZnN0YXQoIGZpbGUtPnVuaXhfaGFuZGxlLCAmc3QgKSA9PSAtMSkpCiAgICAgewpAQCAtMjQzLDYgKzIzOSw3IEBACiAgKi8KIEhGSUxFMzIgRklMRV9PcGVuKCBMUENTVFIgcGF0aCwgSU5UMzIgbW9kZSApCiB7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAgICAgY29uc3QgY2hhciAqdW5peE5hbWU7CiAKICAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCAiRklMRV9PcGVuOiAnJXMnICUwNHhcbiIsIHBhdGgsIG1vZGUgKTsKQEAgLTI1Nyw5ICsyNTQsMTEgQEAKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIC8qIGNoZWNrIGZvciBmaWxlbmFtZSwgZG9uJ3QgY2hlY2sgZm9yIGxhc3QgZW50cnkgaWYgY3JlYXRpbmcgKi8KLSAgICAgICAgaWYgKCEodW5peE5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIHBhdGgsICEobW9kZSAmIE9fQ1JFQVQpICkpKQorICAgIHsKKyAgICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggcGF0aCwgIShtb2RlICYgT19DUkVBVCksICZmdWxsX25hbWUgKSkKICAgICAgICAgICAgIHJldHVybiBIRklMRV9FUlJPUjMyOwotCisgICAgICAgIHVuaXhOYW1lID0gZnVsbF9uYW1lLmxvbmdfbmFtZTsKKyAgICB9CiAgICAgcmV0dXJuIEZJTEVfT3BlblVuaXhGaWxlKCB1bml4TmFtZSwgbW9kZSApOwogfQogCkBAIC0yNzIsNiArMjcxLDcgQEAKICAgICBIRklMRTMyIGhhbmRsZTsKICAgICBET1NfRklMRSAqZmlsZTsKICAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKIAogICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJGSUxFX0NyZWF0ZTogJyVzJyAlMDR4ICVkXG4iLCBwYXRoLCBtb2RlLCB1bmlxdWUgKTsKIApAQCAtMjg1LDEyICsyODUsMTIgQEAKICAgICBpZiAoKGhhbmRsZSA9IEZJTEVfQWxsb2MoICZmaWxlICkpID09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogCi0gICAgaWYgKCEodW5peE5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIHBhdGgsIEZBTFNFICkpKQorICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIEZBTFNFLCAmZnVsbF9uYW1lICkpCiAgICAgewogICAgICAgICBDbG9zZUhhbmRsZSggaGFuZGxlICk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogICAgIH0KLSAgICBpZiAoKGZpbGUtPnVuaXhfaGFuZGxlID0gb3BlbiggdW5peE5hbWUsCisgICAgaWYgKChmaWxlLT51bml4X2hhbmRsZSA9IG9wZW4oIGZ1bGxfbmFtZS5sb25nX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPX0NSRUFUIHwgT19UUlVOQyB8IE9fUkRXUiB8ICh1bmlxdWUgPyBPX0VYQ0wgOiAwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKSkgPT0gLTEpCiAgICAgewpAQCAtMzAxLDcgKzMwMSw3IEBACiAKICAgICAvKiBGaWxlIGNyZWF0ZWQgT0ssIG5vdyBmaWxsIHRoZSBET1NfRklMRSAqLwogCi0gICAgZmlsZS0+dW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCB1bml4TmFtZSApOworICAgIGZpbGUtPnVuaXhfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgZnVsbF9uYW1lLmxvbmdfbmFtZSApOwogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKQEAgLTMxNyw5ICszMTcsOSBAQAogICAgIGlmIChTX0lTRElSKHN0LT5zdF9tb2RlKSkKICAgICAgICAgaW5mby0+ZHdGaWxlQXR0cmlidXRlcyB8PSBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlk7CiAKLSAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHN0LT5zdF9tdGltZSwgJmluZm8tPmZ0Q3JlYXRpb25UaW1lICk7Ci0gICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCBzdC0+c3RfbXRpbWUsICZpbmZvLT5mdExhc3RXcml0ZVRpbWUgKTsKLSAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHN0LT5zdF9hdGltZSwgJmluZm8tPmZ0TGFzdEFjY2Vzc1RpbWUgKTsKKyAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHN0LT5zdF9tdGltZSwgJmluZm8tPmZ0Q3JlYXRpb25UaW1lLCAwICk7CisgICAgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCBzdC0+c3RfbXRpbWUsICZpbmZvLT5mdExhc3RXcml0ZVRpbWUsIDAgKTsKKyAgICBET1NGU19Vbml4VGltZVRvRmlsZVRpbWUoIHN0LT5zdF9hdGltZSwgJmluZm8tPmZ0TGFzdEFjY2Vzc1RpbWUsIDAgKTsKIAogICAgIGluZm8tPmR3Vm9sdW1lU2VyaWFsTnVtYmVyID0gMDsgIC8qIEZJWE1FICovCiAgICAgaW5mby0+bkZpbGVTaXplSGlnaCA9IDA7CkBAIC0zODUsOSArMzg1LDExIEBACiAgKi8KIERXT1JEIEdldEZpbGVBdHRyaWJ1dGVzMzJBKCBMUENTVFIgbmFtZSApCiB7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKIAotICAgIGlmICghRklMRV9TdGF0KCBuYW1lLCAmaW5mbyApKSByZXR1cm4gLTE7CisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKSByZXR1cm4gLTE7CisgICAgaWYgKCFGSUxFX1N0YXQoIGZ1bGxfbmFtZS5sb25nX25hbWUsICZpbmZvICkpIHJldHVybiAtMTsKICAgICByZXR1cm4gaW5mby5kd0ZpbGVBdHRyaWJ1dGVzOwogfQogCkBAIC01MDAsOCArNTAyLDkgQEAKIFVJTlQzMiBHZXRUZW1wRmlsZU5hbWUzMkEoIExQQ1NUUiBwYXRoLCBMUENTVFIgcHJlZml4LCBVSU5UMzIgdW5pcXVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBTVFIgYnVmZmVyKQogewotICAgIExQU1RSIHA7CisgICAgRE9TX0ZVTExfTkFNRSBmdWxsX25hbWU7CiAgICAgaW50IGk7CisgICAgTFBTVFIgcDsKICAgICBVSU5UMzIgbnVtID0gdW5pcXVlID8gKHVuaXF1ZSAmIDB4ZmZmZikgOiB0aW1lKE5VTEwpICYgMHhmZmZmOwogCiAgICAgaWYgKCFwYXRoKSByZXR1cm4gMDsKQEAgLTUxMSwzNiArNTE0LDM4IEBACiAgICAgZm9yIChpID0gMzsgKGkgPiAwKSAmJiAoKnByZWZpeCk7IGktLSkgKnArKyA9ICpwcmVmaXgrKzsKICAgICBzcHJpbnRmKCBwLCAiJTA0eC50bXAiLCBudW0gKTsKIAotICAgIGlmICh1bmlxdWUpCi0gICAgewotICAgICAgICBsc3RyY3B5bjMyQSggYnVmZmVyLCBET1NGU19HZXREb3NUcnVlTmFtZSggYnVmZmVyLCBGQUxTRSApLCAxNDQgKTsKLSAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJHZXRUZW1wRmlsZU5hbWU6IHJldHVybmluZyAlc1xuIiwgYnVmZmVyICk7Ci0JaWYgKC0xPT1hY2Nlc3MoRE9TRlNfR2V0VW5peEZpbGVOYW1lKGJ1ZmZlcixUUlVFKSxXX09LKSkKLQkgICAgZnByaW50ZihzdGRlcnIsIldhcm5pbmc6IEdldFRlbXBGaWxlTmFtZSByZXR1cm5zICclcycsIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSB3cml0ZWFibGUuIFBsZWFzZSBjaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24gZmlsZSBpZiB0aGlzIGdlbmVyYXRlcyBhIGZhaWx1cmUuXG4iLGJ1ZmZlcik7Ci0gICAgICAgIHJldHVybiB1bmlxdWU7Ci0gICAgfQotCiAgICAgLyogTm93IHRyeSB0byBjcmVhdGUgaXQgKi8KIAotICAgIGRvCisgICAgaWYgKCF1bmlxdWUpCiAgICAgewotICAgICAgICBIRklMRTMyIGhhbmRsZTsKLSAgICAgICAgaWYgKChoYW5kbGUgPSBGSUxFX0NyZWF0ZShidWZmZXIsMDY2NixUUlVFKSkgIT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUzMikKLSAgICAgICAgeyAgLyogV2UgY3JlYXRlZCBpdCAqLwotICAgICAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJHZXRUZW1wRmlsZU5hbWU6IGNyZWF0ZWQgJXNcbiIsIGJ1ZmZlciApOwotICAgICAgICAgICAgQ2xvc2VIYW5kbGUoIGhhbmRsZSApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERPU19FeHRlbmRlZEVycm9yICE9IEVSX0ZpbGVFeGlzdHMpIGJyZWFrOyAgLyogTm8gbmVlZCB0byBnbyBvbiAqLwotICAgICAgICBudW0rKzsKLSAgICAgICAgc3ByaW50ZiggcCwgIiUwNHgudG1wIiwgbnVtICk7Ci0gICAgfSB3aGlsZSAobnVtICE9ICh1bmlxdWUgJiAweGZmZmYpKTsKKyAgICAgICAgZG8KKyAgICAgICAgeworICAgICAgICAgICAgSEZJTEUzMiBoYW5kbGUgPSBGSUxFX0NyZWF0ZSggYnVmZmVyLCAwNjY2LCBUUlVFICk7CisgICAgICAgICAgICBpZiAoaGFuZGxlICE9IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCisgICAgICAgICAgICB7ICAvKiBXZSBjcmVhdGVkIGl0ICovCisgICAgICAgICAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJHZXRUZW1wRmlsZU5hbWU6IGNyZWF0ZWQgJXNcbiIsIGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgQ2xvc2VIYW5kbGUoIGhhbmRsZSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKERPU19FeHRlbmRlZEVycm9yICE9IEVSX0ZpbGVFeGlzdHMpCisgICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBObyBuZWVkIHRvIGdvIG9uICovCisgICAgICAgICAgICBudW0rKzsKKyAgICAgICAgICAgIHNwcmludGYoIHAsICIlMDR4LnRtcCIsIG51bSApOworICAgICAgICB9IHdoaWxlIChudW0gIT0gKHVuaXF1ZSAmIDB4ZmZmZikpOworICAgIH0KIAotICAgIGxzdHJjcHluMzJBKCBidWZmZXIsIERPU0ZTX0dldERvc1RydWVOYW1lKCBidWZmZXIsIEZBTFNFICksIDE0NCApOworICAgIC8qIEdldCB0aGUgZnVsbCBwYXRoIG5hbWUgKi8KKworICAgIGlmIChET1NGU19HZXRGdWxsTmFtZSggYnVmZmVyLCBGQUxTRSwgJmZ1bGxfbmFtZSApKQorICAgIHsKKyAgICAgICAgaWYgKGFjY2VzcyggZnVsbF9uYW1lLmxvbmdfbmFtZSwgV19PSyApID09IC0xKQorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLAorICAgICAgICAgICAgICAgICAgICAgIldhcm5pbmc6IEdldFRlbXBGaWxlTmFtZSByZXR1cm5zICclcycsIHdoaWNoIGRvZXNuJ3Qgc2VlbSB0byBiZSB3cml0ZWFibGUuXG4iCisgICAgICAgICAgICAgICAgICAgICAiUGxlYXNlIGNoZWNrIHlvdXIgY29uZmlndXJhdGlvbiBmaWxlIGlmIHRoaXMgZ2VuZXJhdGVzIGEgZmFpbHVyZS5cbiIsCisgICAgICAgICAgICAgICAgICAgICBidWZmZXIpOworICAgIH0KICAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIkdldFRlbXBGaWxlTmFtZTogcmV0dXJuaW5nICVzXG4iLCBidWZmZXIgKTsKLSAgICBpZiAoLTE9PWFjY2VzcyhET1NGU19HZXRVbml4RmlsZU5hbWUoYnVmZmVyLFRSVUUpLFdfT0spKQotCWZwcmludGYoc3RkZXJyLCJXYXJuaW5nOiBHZXRUZW1wRmlsZU5hbWUgcmV0dXJucyAnJXMnLCB3aGljaCBkb2Vzbid0IHNlZW0gdG8gYmUgd3JpdGVhYmxlLiBQbGVhc2UgY2hlY2sgeW91ciBjb25maWd1cmF0aW9uIGZpbGUgaWYgdGhpcyBnZW5lcmF0ZXMgYSBmYWlsdXJlLlxuIixidWZmZXIpOwotICAgIHJldHVybiBudW07CisgICAgcmV0dXJuIHVuaXF1ZSA/IHVuaXF1ZSA6IG51bTsKIH0KIAogCkBAIC01NzYsNyArNTgxLDcgQEAKICAgICBIRklMRTMyIGhGaWxlUmV0OwogICAgIEZJTEVUSU1FIGZpbGV0aW1lOwogICAgIFdPUkQgZmlsZWRhdGV0aW1lWzJdOwotICAgIGNvbnN0IGNoYXIgKnVuaXhOYW1lLCAqZG9zTmFtZTsKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKICAgICBjaGFyICpwOwogICAgIGludCB1bml4TW9kZTsKIApAQCAtNTg5LDkgKzU5NCwxMCBAQAogCiAgICAgaWYgKG1vZGUgJiBPRl9QQVJTRSkKICAgICB7Ci0gICAgICAgIGlmICghKGRvc05hbWUgPSBET1NGU19HZXREb3NUcnVlTmFtZSggbmFtZSwgRkFMU0UgKSkpIGdvdG8gZXJyb3I7Ci0gICAgICAgIGxzdHJjcHluMzJBKCBvZnMtPnN6UGF0aE5hbWUsIGRvc05hbWUsIHNpemVvZihvZnMtPnN6UGF0aE5hbWUpICk7Ci0gICAgICAgIG9mcy0+ZkZpeGVkRGlzayA9IChHZXREcml2ZVR5cGUxNiggZG9zTmFtZVswXS0nQScgKSAhPSBEUklWRV9SRU1PVkFCTEUpOworICAgICAgICBpZiAoIUdldEZ1bGxQYXRoTmFtZTMyQSggbmFtZSwgc2l6ZW9mKG9mcy0+c3pQYXRoTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnMtPnN6UGF0aE5hbWUsIE5VTEwgKSkgZ290byBlcnJvcjsKKyAgICAgICAgb2ZzLT5mRml4ZWREaXNrID0gKEdldERyaXZlVHlwZTE2KCBvZnMtPnN6UGF0aE5hbWVbMF0tJ0EnICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IERSSVZFX1JFTU9WQUJMRSk7CiAgICAgICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiT3BlbkZpbGUoJXMpOiBPRl9QQVJTRSwgcmVzID0gJyVzJ1xuIiwKICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBvZnMtPnN6UGF0aE5hbWUgKTsKICAgICAgICAgcmV0dXJuIDA7CkBAIC02MDQsOCArNjEwLDggQEAKICAgICB7CiAgICAgICAgIGlmICgoaEZpbGVSZXQgPSBGSUxFX0NyZWF0ZShuYW1lLDA2NjYsRkFMU0UpKT09IElOVkFMSURfSEFORExFX1ZBTFVFMzIpCiAgICAgICAgICAgICBnb3RvIGVycm9yOwotICAgICAgICBsc3RyY3B5bjMyQSggb2ZzLT5zelBhdGhOYW1lLCBET1NGU19HZXREb3NUcnVlTmFtZSggbmFtZSwgRkFMU0UgKSwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVvZihvZnMtPnN6UGF0aE5hbWUpICk7CisgICAgICAgIEdldEZ1bGxQYXRoTmFtZTMyQSggbmFtZSwgc2l6ZW9mKG9mcy0+c3pQYXRoTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZzLT5zelBhdGhOYW1lLCBOVUxMICk7CiAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICB9CiAKQEAgLTYxNCwxMSArNjIwLDcgQEAKICAgICBpZiAoKG1vZGUgJiBPRl9TRUFSQ0gpICYmICEobW9kZSAmIE9GX1JFT1BFTikpCiAgICAgewogICAgICAgICAvKiBGaXJzdCB0cnkgdGhlIGZpbGUgbmFtZSBhcyBpcyAqLwotICAgICAgICBpZiAoKHVuaXhOYW1lID0gRE9TRlNfR2V0VW5peEZpbGVOYW1lKCBuYW1lLCBUUlVFICkpICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxzdHJjcHluMzJBKCBvZnMtPnN6UGF0aE5hbWUsIG5hbWUsIHNpemVvZihvZnMtPnN6UGF0aE5hbWUpICk7Ci0gICAgICAgICAgICBnb3RvIGZvdW5kOwotICAgICAgICB9CisgICAgICAgIGlmIChET1NGU19HZXRGdWxsTmFtZSggbmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKSBnb3RvIGZvdW5kOwogICAgICAgICAvKiBOb3cgcmVtb3ZlIHRoZSBwYXRoICovCiAgICAgICAgIGlmIChuYW1lWzBdICYmIChuYW1lWzFdID09ICc6JykpIG5hbWUgKz0gMjsKICAgICAgICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOwpAQCAtNjI4LDIwICs2MzAsMTcgQEAKIAogICAgIC8qIE5vdyBsb29rIGZvciB0aGUgZmlsZSAqLwogCi0gICAgaWYgKCFESVJfU2VhcmNoUGF0aCggTlVMTCwgbmFtZSwgTlVMTCwgc2l6ZW9mKG9mcy0+c3pQYXRoTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgb2ZzLT5zelBhdGhOYW1lLCBOVUxMLCB3aW4zMiApKQotICAgICAgICBnb3RvIG5vdF9mb3VuZDsKLSAgICBpZiAoISh1bml4TmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggb2ZzLT5zelBhdGhOYW1lLCBUUlVFICkpKQotICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICBpZiAoIURJUl9TZWFyY2hQYXRoKCBOVUxMLCBuYW1lLCBOVUxMLCAmZnVsbF9uYW1lLCB3aW4zMiApKSBnb3RvIG5vdF9mb3VuZDsKIAogZm91bmQ6Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJPcGVuRmlsZTogZm91bmQgJyVzJ1xuIiwgdW5peE5hbWUgKTsKLSAgICBsc3RyY3B5bjMyQShvZnMtPnN6UGF0aE5hbWUsIERPU0ZTX0dldERvc1RydWVOYW1lKCBvZnMtPnN6UGF0aE5hbWUsIEZBTFNFKSwKLSAgICAgICAgICAgICAgICBzaXplb2Yob2ZzLT5zelBhdGhOYW1lKSApOworICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiT3BlbkZpbGU6IGZvdW5kICVzID0gJXNcbiIsCisgICAgICAgICAgICAgICAgICBmdWxsX25hbWUubG9uZ19uYW1lLCBmdWxsX25hbWUuc2hvcnRfbmFtZSApOworICAgIGxzdHJjcHluMzJBKCBvZnMtPnN6UGF0aE5hbWUsIGZ1bGxfbmFtZS5zaG9ydF9uYW1lLAorICAgICAgICAgICAgICAgICBzaXplb2Yob2ZzLT5zelBhdGhOYW1lKSApOwogCiAgICAgaWYgKG1vZGUgJiBPRl9ERUxFVEUpCiAgICAgewotICAgICAgICBpZiAodW5saW5rKCB1bml4TmFtZSApID09IC0xKSBnb3RvIG5vdF9mb3VuZDsKKyAgICAgICAgaWYgKHVubGluayggZnVsbF9uYW1lLmxvbmdfbmFtZSApID09IC0xKSBnb3RvIG5vdF9mb3VuZDsKICAgICAgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJPcGVuRmlsZSglcyk6IE9GX0RFTEVURSByZXR1cm4gPSBPS1xuIiwgbmFtZSk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KQEAgLTY1Nyw4ICs2NTYsOCBAQAogICAgICAgICB1bml4TW9kZSA9IE9fUkRPTkxZOyBicmVhazsKICAgICB9CiAKLSAgICBpZiAoKGhGaWxlUmV0ID0gRklMRV9PcGVuVW5peEZpbGUoIHVuaXhOYW1lLCB1bml4TW9kZSApKSA9PSBIRklMRV9FUlJPUjMyKQotICAgICAgICBnb3RvIG5vdF9mb3VuZDsKKyAgICBoRmlsZVJldCA9IEZJTEVfT3BlblVuaXhGaWxlKCBmdWxsX25hbWUubG9uZ19uYW1lLCB1bml4TW9kZSApOworICAgIGlmIChoRmlsZVJldCA9PSBIRklMRV9FUlJPUjMyKSBnb3RvIG5vdF9mb3VuZDsKICAgICBHZXRGaWxlVGltZSggaEZpbGVSZXQsIE5VTEwsIE5VTEwsICZmaWxldGltZSApOwogICAgIEZpbGVUaW1lVG9Eb3NEYXRlVGltZSggJmZpbGV0aW1lLCAmZmlsZWRhdGV0aW1lWzBdLCAmZmlsZWRhdGV0aW1lWzFdICk7CiAgICAgaWYgKChtb2RlICYgT0ZfVkVSSUZZKSAmJiAobW9kZSAmIE9GX1JFT1BFTikpCkBAIC03MTUsNyArNzE0LDcgQEAKICAqLwogSEZJTEUxNiBfbGNsb3NlMTYoIEhGSUxFMTYgaEZpbGUgKQogewotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2xjbG9zZTogaGFuZGxlICVkXG4iLCBoRmlsZSApOworICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2xjbG9zZTE2OiBoYW5kbGUgJWRcbiIsIGhGaWxlICk7CiAgICAgcmV0dXJuIENsb3NlSGFuZGxlKCBoRmlsZSApID8gMCA6IEhGSUxFX0VSUk9SMTY7CiB9CiAKQEAgLTcyNSw3ICs3MjQsNyBAQAogICovCiBIRklMRTMyIF9sY2xvc2UzMiggSEZJTEUzMiBoRmlsZSApCiB7Ci0gICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfbGNsb3NlOiBoYW5kbGUgJWRcbiIsIGhGaWxlICk7CisgICAgZHByaW50Zl9maWxlKCBzdGRkZWIsICJfbGNsb3NlMzI6IGhhbmRsZSAlZFxuIiwgaEZpbGUgKTsKICAgICByZXR1cm4gQ2xvc2VIYW5kbGUoIGhGaWxlICkgPyAwIDogSEZJTEVfRVJST1IzMjsKIH0KIApAQCAtODE3LDExICs4MTYsNDQgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRGaWxlUG9pbnRlciAgIChLRVJORUwzMi40OTIpCisgKi8KK0RXT1JEIFNldEZpbGVQb2ludGVyKCBIRklMRTMyIGhGaWxlLCBMT05HIGRpc3RhbmNlLCBMT05HICpoaWdod29yZCwKKyAgICAgICAgICAgICAgICAgICAgICBEV09SRCBtZXRob2QgKQoreworICAgIERPU19GSUxFICpmaWxlOworICAgIGludCBvcmlnaW4sIHJlc3VsdDsKKworICAgIGlmIChoaWdod29yZCAmJiAqaGlnaHdvcmQpCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJTZXRGaWxlUG9pbnRlcjogNjQtYml0IG9mZnNldHMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiAweGZmZmZmZmZmOworICAgIH0KKyAgICBkcHJpbnRmX2ZpbGUoIHN0ZGRlYiwgIlNldEZpbGVQb2ludGVyOiBoYW5kbGUgJWQgb2Zmc2V0ICVsZCBvcmlnaW4gJWxkXG4iLAorICAgICAgICAgICAgICAgICAgaEZpbGUsIGRpc3RhbmNlLCBtZXRob2QgKTsKKworICAgIGlmICghKGZpbGUgPSBGSUxFX0dldEZpbGUoIGhGaWxlICkpKSByZXR1cm4gMHhmZmZmZmZmZjsKKyAgICBzd2l0Y2gobWV0aG9kKQorICAgIHsKKyAgICAgICAgY2FzZSAxOiAgb3JpZ2luID0gU0VFS19DVVI7IGJyZWFrOworICAgICAgICBjYXNlIDI6ICBvcmlnaW4gPSBTRUVLX0VORDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG9yaWdpbiA9IFNFRUtfU0VUOyBicmVhazsKKyAgICB9CisKKyAgICBpZiAoKHJlc3VsdCA9IGxzZWVrKCBmaWxlLT51bml4X2hhbmRsZSwgZGlzdGFuY2UsIG9yaWdpbiApKSA9PSAtMSkKKyAgICAgICAgRklMRV9TZXREb3NFcnJvcigpOworICAgIEZJTEVfUmVsZWFzZUZpbGUoIGZpbGUgKTsKKyAgICByZXR1cm4gKERXT1JEKXJlc3VsdDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBfbGxzZWVrMTYgICAoS0VSTkVMLjg0KQogICovCiBMT05HIF9sbHNlZWsxNiggSEZJTEUxNiBoRmlsZSwgTE9ORyBsT2Zmc2V0LCBJTlQxNiBuT3JpZ2luICkKIHsKLSAgICByZXR1cm4gX2xsc2VlazMyKCBoRmlsZSwgbE9mZnNldCwgbk9yaWdpbiApOworICAgIHJldHVybiBTZXRGaWxlUG9pbnRlciggaEZpbGUsIGxPZmZzZXQsIE5VTEwsIG5PcmlnaW4gKTsKIH0KIAogCkBAIC04MzAsMjQgKzg2Miw3IEBACiAgKi8KIExPTkcgX2xsc2VlazMyKCBIRklMRTMyIGhGaWxlLCBMT05HIGxPZmZzZXQsIElOVDMyIG5PcmlnaW4gKQogewotICAgIERPU19GSUxFICpmaWxlOwotICAgIGludCBvcmlnaW4sIHJlc3VsdDsKLQotICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiX2xsc2VlazogaGFuZGxlICVkLCBvZmZzZXQgJWxkLCBvcmlnaW4gJWRcbiIsIAotICAgICAgICAgICAgICAgICAgaEZpbGUsIGxPZmZzZXQsIG5PcmlnaW4pOwotCi0gICAgaWYgKCEoZmlsZSA9IEZJTEVfR2V0RmlsZSggaEZpbGUgKSkpIHJldHVybiBIRklMRV9FUlJPUjMyOwotICAgIHN3aXRjaChuT3JpZ2luKQotICAgIHsKLSAgICAgICAgY2FzZSAxOiAgb3JpZ2luID0gU0VFS19DVVI7IGJyZWFrOwotICAgICAgICBjYXNlIDI6ICBvcmlnaW4gPSBTRUVLX0VORDsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IG9yaWdpbiA9IFNFRUtfU0VUOyBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoKHJlc3VsdCA9IGxzZWVrKCBmaWxlLT51bml4X2hhbmRsZSwgbE9mZnNldCwgb3JpZ2luICkpID09IC0xKQotICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7Ci0gICAgRklMRV9SZWxlYXNlRmlsZSggZmlsZSApOwotICAgIHJldHVybiByZXN1bHQ7CisgICAgcmV0dXJuIFNldEZpbGVQb2ludGVyKCBoRmlsZSwgbE9mZnNldCwgTlVMTCwgbk9yaWdpbiApOwogfQogCiAKQEAgLTk2MSw0NyArOTc2LDI3IEBACiAgICAgSEdMT0JBTDE2IGhQREIgPSBHZXRDdXJyZW50UERCKCk7CiAgICAgUERCICpwZGIgPSAoUERCICopR2xvYmFsTG9jazE2KCBoUERCICk7CiAgICAgQllURSAqZmlsZXMgPSBQVFJfU0VHX1RPX0xJTiggcGRiLT5maWxlSGFuZGxlc1B0ciApOwotICAgIFdPUkQgaTsKIAogICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiU2V0SGFuZGxlQ291bnQoJWQpXG4iLCBjb3VudCApOwogCiAgICAgaWYgKGNvdW50IDwgMjApIGNvdW50ID0gMjA7ICAvKiBObyBwb2ludCBpbiBnb2luZyBiZWxvdyAyMCAqLwogICAgIGVsc2UgaWYgKGNvdW50ID4gMjU0KSBjb3VudCA9IDI1NDsKIAotICAgIC8qIElmIHNocmlua2luZyB0aGUgdGFibGUsIG1ha2Ugc3VyZSBhbGwgZXh0cmEgZmlsZSBoYW5kbGVzIGFyZSBjbG9zZWQgKi8KLSAgICBpZiAoY291bnQgPCBwZGItPm5iRmlsZXMpCi0gICAgewotICAgICAgICBmb3IgKGkgPSBjb3VudDsgaSA8IHBkYi0+bmJGaWxlczsgaSsrKQotICAgICAgICAgICAgaWYgKGZpbGVzW2ldICE9IDB4ZmYpICAvKiBGaWxlIG9wZW4gKi8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBET1NfRVJST1IoIEVSX1Rvb01hbnlPcGVuRmlsZXMsIEVDX1Byb2dyYW1FcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBX0Fib3J0LCBFTF9EaXNrICk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBkYi0+bmJGaWxlczsKLSAgICAgICAgICAgIH0KLSAgICB9Ci0KICAgICBpZiAoY291bnQgPT0gMjApCiAgICAgewogICAgICAgICBpZiAocGRiLT5uYkZpbGVzID4gMjApCiAgICAgICAgIHsKICAgICAgICAgICAgIG1lbWNweSggcGRiLT5maWxlSGFuZGxlcywgZmlsZXMsIDIwICk7Ci0jaWZkZWYgV0lORUxJQgotICAgICAgICAgICAgR2xvYmFsRnJlZTMyKCAoSEdMT0JBTDMyKXBkYi0+ZmlsZUhhbmRsZXNQdHIgKTsKLSAgICAgICAgICAgIHBkYi0+ZmlsZUhhbmRsZXNQdHIgPSAoU0VHUFRSKXBkYi0+ZmlsZUhhbmRsZXM7Ci0jZWxzZQotICAgICAgICAgICAgR2xvYmFsRnJlZTE2KCBHbG9iYWxIYW5kbGUxNiggU0VMRUNUT1JPRihwZGItPmZpbGVIYW5kbGVzUHRyKSApKTsKKyAgICAgICAgICAgIEdsb2JhbEZyZWUxNiggcGRiLT5oRmlsZUhhbmRsZXMgKTsKICAgICAgICAgICAgIHBkYi0+ZmlsZUhhbmRsZXNQdHIgPSAoU0VHUFRSKU1BS0VMT05HKCAweDE4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsSGFuZGxlVG9TZWwoIGhQREIgKSApOwotI2VuZGlmCisgICAgICAgICAgICBwZGItPmhGaWxlSGFuZGxlcyA9IDA7CiAgICAgICAgICAgICBwZGItPm5iRmlsZXMgPSAyMDsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlICAvKiBNb3JlIHRoYW4gMjAsIG5lZWQgYSBuZXcgZmlsZSBoYW5kbGVzIHRhYmxlICovCiAgICAgewogICAgICAgICBCWVRFICpuZXdmaWxlczsKLSNpZmRlZiBXSU5FTElCCi0gICAgICAgIG5ld2ZpbGVzID0gKEJZVEUgKilHbG9iYWxBbGxvYzMyKCBHTUVNX0ZJWEVELCBjb3VudCApOwotI2Vsc2UKICAgICAgICAgSEdMT0JBTDE2IG5ld2hhbmRsZSA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fTU9WRUFCTEUsIGNvdW50ICk7CiAgICAgICAgIGlmICghbmV3aGFuZGxlKQogICAgICAgICB7CkBAIC0xMDA5LDIxICsxMDA0LDE2IEBACiAgICAgICAgICAgICByZXR1cm4gcGRiLT5uYkZpbGVzOwogICAgICAgICB9CiAgICAgICAgIG5ld2ZpbGVzID0gKEJZVEUgKilHbG9iYWxMb2NrMTYoIG5ld2hhbmRsZSApOwotI2VuZGlmICAvKiBXSU5FTElCICovCisKICAgICAgICAgaWYgKGNvdW50ID4gcGRiLT5uYkZpbGVzKQogICAgICAgICB7CiAgICAgICAgICAgICBtZW1jcHkoIG5ld2ZpbGVzLCBmaWxlcywgcGRiLT5uYkZpbGVzICk7CiAgICAgICAgICAgICBtZW1zZXQoIG5ld2ZpbGVzICsgcGRiLT5uYkZpbGVzLCAweGZmLCBjb3VudCAtIHBkYi0+bmJGaWxlcyApOwogICAgICAgICB9CiAgICAgICAgIGVsc2UgbWVtY3B5KCBuZXdmaWxlcywgZmlsZXMsIGNvdW50ICk7Ci0jaWZkZWYgV0lORUxJQgotICAgICAgICBpZiAocGRiLT5uYkZpbGVzID4gMjApIEdsb2JhbEZyZWUzMiggKEhHTE9CQUwzMilwZGItPmZpbGVIYW5kbGVzUHRyICk7Ci0gICAgICAgIHBkYi0+ZmlsZUhhbmRsZXNQdHIgPSAoU0VHUFRSKW5ld2ZpbGVzOwotI2Vsc2UKLSAgICAgICAgaWYgKHBkYi0+bmJGaWxlcyA+IDIwKQotICAgICAgICAgICAgR2xvYmFsRnJlZTE2KCBHbG9iYWxIYW5kbGUxNiggU0VMRUNUT1JPRihwZGItPmZpbGVIYW5kbGVzUHRyKSApKTsKKyAgICAgICAgaWYgKHBkYi0+bmJGaWxlcyA+IDIwKSBHbG9iYWxGcmVlMTYoIHBkYi0+aEZpbGVIYW5kbGVzICk7CiAgICAgICAgIHBkYi0+ZmlsZUhhbmRsZXNQdHIgPSBXSU4xNl9HbG9iYWxMb2NrMTYoIG5ld2hhbmRsZSApOwotI2VuZGlmICAvKiBXSU5FTElCICovCisgICAgICAgIHBkYi0+aEZpbGVIYW5kbGVzICAgPSBuZXdoYW5kbGU7CiAgICAgICAgIHBkYi0+bmJGaWxlcyA9IGNvdW50OwogICAgIH0KICAgICByZXR1cm4gcGRiLT5uYkZpbGVzOwpAQCAtMTA5NSw2ICsxMDg1LDcgQEAKICAqLwogQk9PTDMyIERlbGV0ZUZpbGUzMkEoIExQQ1NUUiBwYXRoICkKIHsKKyAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKICAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKIAogICAgIGRwcmludGZfZmlsZShzdGRkZWIsICJEZWxldGVGaWxlOiAnJXMnXG4iLCBwYXRoICk7CkBAIC0xMTA2LDggKzEwOTcsOCBAQAogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCi0gICAgaWYgKCEodW5peE5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIHBhdGgsIFRSVUUgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAodW5saW5rKCB1bml4TmFtZSApID09IC0xKQorICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIFRSVUUsICZmdWxsX25hbWUgKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICh1bmxpbmsoIGZ1bGxfbmFtZS5sb25nX25hbWUgKSA9PSAtMSkKICAgICB7CiAgICAgICAgIEZJTEVfU2V0RG9zRXJyb3IoKTsKICAgICAgICAgcmV0dXJuIEZBTFNFOwpAQCAtMTE1Myw2ICsxMTQ0LDk5IEBACiB9CiAKIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTW92ZUZpbGUzMkEgICAoS0VSTkVMMzIuMzg3KQorICovCitCT09MMzIgTW92ZUZpbGUzMkEoIExQQ1NUUiBmbjEsIExQQ1NUUiBmbjIgKQoreworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lMSwgZnVsbF9uYW1lMjsKKworICAgIGRwcmludGZfZmlsZSggc3RkZGViLCAiTW92ZUZpbGUzMkEoJXMsJXMpXG4iLCBmbjEsIGZuMiApOworCisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZm4xLCBUUlVFLCAmZnVsbF9uYW1lMSApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZm4yLCBGQUxTRSwgJmZ1bGxfbmFtZTIgKSkgcmV0dXJuIEZBTFNFOworICAgIC8qIEZJWE1FOiBzaG91bGQgbm90IHJlcGxhY2UgYW4gZXhpc3RpbmcgZmlsZSAqLworICAgIC8qIEZJWE1FOiBzaG91bGQgaGFuZGxlIHJlbmFtaW5nIGFjcm9zcyBkZXZpY2VzICovCisgICAgaWYgKHJlbmFtZSggZnVsbF9uYW1lMS5sb25nX25hbWUsIGZ1bGxfbmFtZTIubG9uZ19uYW1lICkgPT0gLTEpCisgICAgeworICAgICAgICBGSUxFX1NldERvc0Vycm9yKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTW92ZUZpbGUzMlcgICAoS0VSTkVMMzIuMzkwKQorICovCitCT09MMzIgTW92ZUZpbGUzMlcoIExQQ1dTVFIgZm4xLCBMUENXU1RSIGZuMiApCit7CisgICAgTFBTVFIgYWZuMSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZm4xICk7CisgICAgTFBTVFIgYWZuMiA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZm4yICk7CisgICAgQk9PTDMyIHJlcyA9IE1vdmVGaWxlMzJBKCBhZm4xLCBhZm4yICk7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGFmbjEgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgYWZuMiApOworICAgIHJldHVybiByZXM7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ29weUZpbGUzMkEgICAoS0VSTkVMMzIuMzYpCisgKi8KK0JPT0wzMiBDb3B5RmlsZTMyQSggTFBDU1RSIHNvdXJjZSwgTFBDU1RSIGRlc3QsIEJPT0wzMiBmYWlsX2lmX2V4aXN0cyApCit7CisgICAgSEZJTEUzMiBoMSwgaDI7CisgICAgQllfSEFORExFX0ZJTEVfSU5GT1JNQVRJT04gaW5mbzsKKyAgICBVSU5UMzIgY291bnQ7CisgICAgQk9PTDMyIHJldCA9IEZBTFNFOworICAgIGludCBtb2RlOworICAgIGNoYXIgYnVmZmVyWzIwNDhdOworCisgICAgaWYgKChoMSA9IF9sb3BlbjMyKCBzb3VyY2UsIE9GX1JFQUQgKSkgPT0gSEZJTEVfRVJST1IzMikgcmV0dXJuIEZBTFNFOworICAgIGlmICghR2V0RmlsZUluZm9ybWF0aW9uQnlIYW5kbGUoIGgxLCAmaW5mbyApKQorICAgIHsKKyAgICAgICAgQ2xvc2VIYW5kbGUoIGgxICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgbW9kZSA9IChpbmZvLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkgPyAwNDQ0IDogMDY2NjsKKyAgICBpZiAoKGgyID0gRklMRV9DcmVhdGUoIGRlc3QsIG1vZGUsIGZhaWxfaWZfZXhpc3RzICkpID09IEhGSUxFX0VSUk9SMzIpCisgICAgeworICAgICAgICBDbG9zZUhhbmRsZSggaDEgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICB3aGlsZSAoKGNvdW50ID0gX2xyZWFkMzIoIGgyLCBidWZmZXIsIHNpemVvZihidWZmZXIpICkpID4gMCkKKyAgICB7CisgICAgICAgIGNoYXIgKnAgPSBidWZmZXI7CisgICAgICAgIHdoaWxlIChjb3VudCA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIElOVDMyIHJlcyA9IF9sd3JpdGUzMiggaDIsIHAsIGNvdW50ICk7CisgICAgICAgICAgICBpZiAocmVzIDw9IDApIGdvdG8gZG9uZTsKKyAgICAgICAgICAgIHAgKz0gcmVzOworICAgICAgICAgICAgY291bnQgLT0gcmVzOworICAgICAgICB9CisgICAgfQorICAgIHJldCA9ICBUUlVFOworZG9uZToKKyAgICBDbG9zZUhhbmRsZSggaDEgKTsKKyAgICBDbG9zZUhhbmRsZSggaDIgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvcHlGaWxlMzJXICAgKEtFUk5FTDMyLjM3KQorICovCitCT09MMzIgQ29weUZpbGUzMlcoIExQQ1dTVFIgc291cmNlLCBMUENXU1RSIGRlc3QsIEJPT0wzMiBmYWlsX2lmX2V4aXN0cyApCit7CisgICAgTFBTVFIgc291cmNlQSA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc291cmNlICk7CisgICAgTFBTVFIgZGVzdEEgICA9IEhFQVBfc3RyZHVwV3RvQSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGVzdCApOworICAgIEJPT0wzMiByZXQgPSBDb3B5RmlsZTMyQSggc291cmNlQSwgZGVzdEEsIGZhaWxfaWZfZXhpc3RzICk7CisgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHNvdXJjZUEgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZGVzdEEgKTsKKyAgICByZXR1cm4gcmV0OworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgICAgIFNldEZpbGVUaW1lICAgKEtFUk5FTDMyLjQ5MykKICAqLwpAQCAtMTE3MiwxMSArMTI1NiwxMSBAQAogCWxwTGFzdFdyaXRlVGltZQogICAgICk7CiAgICAgaWYgKGxwTGFzdEFjY2Vzc1RpbWUpCi0JdXRpbWJ1Zi5hY3RpbWUJPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUobHBMYXN0QWNjZXNzVGltZSk7CisJdXRpbWJ1Zi5hY3RpbWUJPSBET1NGU19GaWxlVGltZVRvVW5peFRpbWUobHBMYXN0QWNjZXNzVGltZSwgTlVMTCk7CiAgICAgZWxzZQogCXV0aW1idWYuYWN0aW1lCT0gMDsgLyogRklYTUUgKi8KICAgICBpZiAobHBMYXN0V3JpdGVUaW1lKQotCXV0aW1idWYubW9kdGltZQk9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZShscExhc3RXcml0ZVRpbWUpOworCXV0aW1idWYubW9kdGltZQk9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZShscExhc3RXcml0ZVRpbWUsIE5VTEwpOwogICAgIGVsc2UKIAl1dGltYnVmLm1vZHRpbWUJPSAwOyAvKiBGSVhNRSAqLwogICAgIGlmICgtMT09dXRpbWUoZmlsZS0+dW5peF9uYW1lLCZ1dGltYnVmKSkKZGlmZiAtLWdpdCBhL2ZpbGVzL3Byb2ZpbGUuYyBiL2ZpbGVzL3Byb2ZpbGUuYwppbmRleCAzOTNmZTQ4Li4wNmI4YjcwIDEwMDY0NAotLS0gYS9maWxlcy9wcm9maWxlLmMKKysrIGIvZmlsZXMvcHJvZmlsZS5jCkBAIC0xMSw3ICsxMSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAiZG9zX2ZzLmgiCisjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCkBAIC0zNiw2ICszNiw4IEBACiAgICAgQk9PTDMyICAgICAgICAgICBjaGFuZ2VkOwogICAgIFBST0ZJTEVTRUNUSU9OICAqc2VjdGlvbjsKICAgICBjaGFyICAgICAgICAgICAgKmRvc19uYW1lOworICAgIGNoYXIgICAgICAgICAgICAqdW5peF9uYW1lOworICAgIGNoYXIgICAgICAgICAgICAqZmlsZW5hbWU7CiB9IFBST0ZJTEU7CiAKIApAQCAtMzMyLDggKzMzNCw3IEBACiAgICAgRklMRSAqZmlsZSA9IE5VTEw7CiAKICAgICBpZiAoIUN1clByb2ZpbGUuY2hhbmdlZCB8fCAhQ3VyUHJvZmlsZS5kb3NfbmFtZSkgcmV0dXJuIFRSVUU7Ci0gICAgaWYgKCEodW5peF9uYW1lID0gRE9TRlNfR2V0VW5peEZpbGVOYW1lKCBDdXJQcm9maWxlLmRvc19uYW1lLCBGQUxTRSApKSB8fAotICAgICAgICAhKGZpbGUgPSBmb3BlbiggdW5peF9uYW1lLCAidyIgKSkpCisgICAgaWYgKCEodW5peF9uYW1lID0gQ3VyUHJvZmlsZS51bml4X25hbWUpIHx8ICEoZmlsZSA9IGZvcGVuKHVuaXhfbmFtZSwgInciKSkpCiAgICAgewogICAgICAgICAvKiBUcnkgdG8gY3JlYXRlIGl0IGluICRIT01FLy53aW5lICovCiAgICAgICAgIC8qIEZJWE1FOiB0aGlzIHdpbGwgbmVlZCBhIG1vcmUgZ2VuZXJhbCBzb2x1dGlvbiAqLwpAQCAtMzQzLDcgKzM0NCw3IEBACiAgICAgICAgICAgICBzdHJjYXQoIGJ1ZmZlciwgIi8ud2luZS8iICk7CiAgICAgICAgICAgICBwID0gYnVmZmVyICsgc3RybGVuKGJ1ZmZlcik7CiAgICAgICAgICAgICBzdHJjcHkoIHAsIHN0cnJjaHIoIEN1clByb2ZpbGUuZG9zX25hbWUsICdcXCcgKSArIDEgKTsKLSAgICAgICAgICAgIEFuc2lMb3dlciggcCApOworICAgICAgICAgICAgQ2hhckxvd2VyMzJBKCBwICk7CiAgICAgICAgICAgICBmaWxlID0gZm9wZW4oIGJ1ZmZlciwgInciICk7CiAgICAgICAgICAgICB1bml4X25hbWUgPSBidWZmZXI7CiAgICAgICAgIH0KQEAgLTM3MiwyNCArMzczLDMyIEBACiAgKi8KIHN0YXRpYyBCT09MMzIgUFJPRklMRV9PcGVuKCBMUENTVFIgZmlsZW5hbWUgKQogeworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIGNoYXIgYnVmZmVyW01BWF9QQVRITkFNRV9MRU5dOwotICAgIGNvbnN0IGNoYXIgKmRvc19uYW1lLCAqdW5peF9uYW1lOwogICAgIGNoYXIgKm5ld2Rvc19uYW1lLCAqcDsKICAgICBGSUxFICpmaWxlID0gTlVMTDsKIAorICAgIGlmIChDdXJQcm9maWxlLmZpbGVuYW1lICYmICFzdHJjbXAoIGZpbGVuYW1lLCBDdXJQcm9maWxlLmZpbGVuYW1lICkpCisgICAgeworICAgICAgICBkcHJpbnRmX3Byb2ZpbGUoIHN0ZGRlYiwgIlBST0ZJTEVfT3Blbiglcyk6IGFscmVhZHkgb3BlbmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lICk7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKwogICAgIGlmIChzdHJjaHIoIGZpbGVuYW1lLCAnLycgKSB8fCBzdHJjaHIoIGZpbGVuYW1lLCAnXFwnICkgfHwgCiAgICAgICAgIHN0cmNociggZmlsZW5hbWUsICc6JyApKQogICAgIHsKLSAgICAgICAgaWYgKCEoZG9zX25hbWUgPSBET1NGU19HZXREb3NUcnVlTmFtZSggZmlsZW5hbWUsIEZBTFNFKSkpIHJldHVybiBGQUxTRTsKKyAgICAgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggZmlsZW5hbWUsIEZBTFNFLCAmZnVsbF9uYW1lICkpIHJldHVybiBGQUxTRTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgR2V0V2luZG93c0RpcmVjdG9yeTMyQSggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSApOwogICAgICAgICBzdHJjYXQoIGJ1ZmZlciwgIlxcIiApOwogICAgICAgICBzdHJjYXQoIGJ1ZmZlciwgZmlsZW5hbWUgKTsKLSAgICAgICAgaWYgKCEoZG9zX25hbWUgPSBET1NGU19HZXREb3NUcnVlTmFtZSggYnVmZmVyLCBGQUxTRSApKSkgcmV0dXJuIEZBTFNFOworICAgICAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBidWZmZXIsIEZBTFNFLCAmZnVsbF9uYW1lICkpIHJldHVybiBGQUxTRTsKICAgICB9Ci0gICAgaWYgKEN1clByb2ZpbGUuZG9zX25hbWUgJiYgIXN0cmNtcCggZG9zX25hbWUsIEN1clByb2ZpbGUuZG9zX25hbWUgKSkKKyAgICBpZiAoQ3VyUHJvZmlsZS5kb3NfbmFtZSAmJgorICAgICAgICAhc3RyY21wKCBmdWxsX25hbWUuc2hvcnRfbmFtZSwgQ3VyUHJvZmlsZS5kb3NfbmFtZSApKQogICAgIHsKICAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJQUk9GSUxFX09wZW4oJXMpOiBhbHJlYWR5IG9wZW5lZFxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSApOwpAQCAtMzk4LDEyICs0MDcsMTUgQEAKIAogICAgIC8qIEZsdXNoIHRoZSBwcmV2aW91cyBwcm9maWxlICovCiAKLSAgICBuZXdkb3NfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgZG9zX25hbWUgKTsKKyAgICBuZXdkb3NfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgZnVsbF9uYW1lLnNob3J0X25hbWUgKTsKICAgICBQUk9GSUxFX0ZsdXNoRmlsZSgpOwogICAgIFBST0ZJTEVfRnJlZSggQ3VyUHJvZmlsZS5zZWN0aW9uICk7CiAgICAgaWYgKEN1clByb2ZpbGUuZG9zX25hbWUpIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBDdXJQcm9maWxlLmRvc19uYW1lICk7CisgICAgaWYgKEN1clByb2ZpbGUudW5peF9uYW1lKSBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgQ3VyUHJvZmlsZS51bml4X25hbWUgKTsKKyAgICBpZiAoQ3VyUHJvZmlsZS5maWxlbmFtZSkgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIEN1clByb2ZpbGUuZmlsZW5hbWUgKTsKICAgICBDdXJQcm9maWxlLnNlY3Rpb24gICA9IE5VTEw7CiAgICAgQ3VyUHJvZmlsZS5kb3NfbmFtZSAgPSBuZXdkb3NfbmFtZTsKKyAgICBDdXJQcm9maWxlLmZpbGVuYW1lICA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwgZmlsZW5hbWUgKTsKIAogICAgIC8qIFRyeSB0byBvcGVuIHRoZSBwcm9maWxlIGZpbGUsIGZpcnN0IGluICRIT01FLy53aW5lICovCiAKQEAgLTQxNCwxNSArNDI2LDIyIEBACiAgICAgICAgIHN0cmNhdCggYnVmZmVyLCAiLy53aW5lLyIgKTsKICAgICAgICAgcCA9IGJ1ZmZlciArIHN0cmxlbihidWZmZXIpOwogICAgICAgICBzdHJjcHkoIHAsIHN0cnJjaHIoIG5ld2Rvc19uYW1lLCAnXFwnICkgKyAxICk7Ci0gICAgICAgIEFuc2lMb3dlciggcCApOworICAgICAgICBDaGFyTG93ZXIzMkEoIHAgKTsKICAgICAgICAgaWYgKChmaWxlID0gZm9wZW4oIGJ1ZmZlciwgInIiICkpKQotICAgICAgICAgICAgZHByaW50Zl9wcm9maWxlKCBzdGRkZWIsICJGb3VuZCBpdCBpbiAlc1xuIiwgYnVmZmVyICk7CisgICAgICAgIHsKKyAgICAgICAgICAgIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAiUFJPRklMRV9PcGVuKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBidWZmZXIgKTsKKyAgICAgICAgICAgIEN1clByb2ZpbGUudW5peF9uYW1lID0gSEVBUF9zdHJkdXBBKCBTeXN0ZW1IZWFwLCAwLCBidWZmZXIgKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghZmlsZSAmJiAoKHVuaXhfbmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggZG9zX25hbWUsIFRSVUUgKSkpKQorICAgIGlmICghZmlsZSkKICAgICB7Ci0gICAgICAgIGlmICgoZmlsZSA9IGZvcGVuKCB1bml4X25hbWUsICJyIiApKSkKLSAgICAgICAgICAgIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAiRm91bmQgaXQgaW4gJXNcbiIsIHVuaXhfbmFtZSApOworICAgICAgICBDdXJQcm9maWxlLnVuaXhfbmFtZSA9IEhFQVBfc3RyZHVwQSggU3lzdGVtSGVhcCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKKyAgICAgICAgaWYgKChmaWxlID0gZm9wZW4oIGZ1bGxfbmFtZS5sb25nX25hbWUsICJyIiApKSkKKyAgICAgICAgICAgIGRwcmludGZfcHJvZmlsZSggc3RkZGViLCAiUFJPRklMRV9PcGVuKCVzKTogZm91bmQgaXQgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBmdWxsX25hbWUubG9uZ19uYW1lICk7CiAgICAgfQogCiAgICAgaWYgKGZpbGUpCkBAIC00MzUsNyArNDU0LDYgQEAKICAgICAgICAgLyogRG9lcyBub3QgZXhpc3QgeWV0LCB3ZSB3aWxsIGNyZWF0ZSBpdCBpbiBQUk9GSUxFX0ZsdXNoRmlsZSAqLwogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBwcm9maWxlIGZpbGUgJXMgbm90IGZvdW5kXG4iLCBuZXdkb3NfbmFtZSApOwogICAgIH0KLSAgICBkcHJpbnRmX3Byb2ZpbGUoIHN0ZGRlYiwgIlBST0ZJTEVfT3Blbiglcyk6IHN1Y2Nlc3NmdWxcbiIsIGZpbGVuYW1lICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2dyYXBoaWNzL21ldGFmaWxlZHJ2L01ha2VmaWxlLmluIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KaW5kZXggMWIwYTE2MS4uNTI0NmE2YyAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvTWFrZWZpbGUuaW4KQEAgLTcsOCArNywxMCBAQAogCiBDX1NSQ1MgPSBcCiAJYml0Ymx0LmMgXAorCWdyYXBoaWNzLmMgXAogCWluaXQuYyBcCi0JbWFwcGluZy5jCisJbWFwcGluZy5jIFwKKwl0ZXh0LmMKIAogYWxsOiAkKE1PRFVMRSkubwogCmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9ncmFwaGljcy5jIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvZ3JhcGhpY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZiYzAyCi0tLSAvZGV2L251bGwKKysrIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvZ3JhcGhpY3MuYwpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIE1ldGFmaWxlIGRyaXZlciBncmFwaGljcyBmdW5jdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5MywgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAiZ3JhcGhpY3MuaCIKKyNpbmNsdWRlICJnZGkuaCIKKyNpbmNsdWRlICJkYy5oIgorI2luY2x1ZGUgIm1ldGFmaWxlLmgiCisjaW5jbHVkZSAicmVnaW9uLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIm1ldGFmaWxlZHJ2LmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBNRkRSVl9Nb3ZlVG9FeAorICovCitCT09MMzIKK01GRFJWX01vdmVUb0V4KERDICpkYyxJTlQzMiB4LElOVDMyIHksTFBQT0lOVDMyIHB0KQoreworICAgIGlmICghTUZfTWV0YVBhcmFtMihkYyxNRVRBX01PVkVUTyx4LHkpKQorICAgIAlyZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocHQpCisgICAgeworCXB0LT54ID0gZGMtPncuQ3Vyc1Bvc1g7CisJcHQtPnkgPSBkYy0+dy5DdXJzUG9zWTsKKyAgICB9CisgICAgZGMtPncuQ3Vyc1Bvc1ggPSB4OworICAgIGRjLT53LkN1cnNQb3NZID0geTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfTGluZVRvCisgKi8KK0JPT0wzMgorTUZEUlZfTGluZVRvKCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHkgKQoreworICAgICByZXR1cm4gTUZfTWV0YVBhcmFtMihkYywgTUVUQV9MSU5FVE8sIHgsIHkpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1GRFJWX0FyYworICovCitCT09MMzIgCitNRkRSVl9BcmMoIERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tLAorICAgICAgICAgICBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwgSU5UMzIgeWVuZCApCit7CisgICAgIHJldHVybiBNRl9NZXRhUGFyYW04KGRjLCBNRVRBX0FSQywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorCQkJICB4c3RhcnQsIHlzdGFydCwgeGVuZCwgeWVuZCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfUGllCisgKi8KK0JPT0wzMgorTUZEUlZfUGllKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwKKyAgICAgICAgICAgSU5UMzIgeHN0YXJ0LCBJTlQzMiB5c3RhcnQsIElOVDMyIHhlbmQsIElOVDMyIHllbmQgKQoreworICAgIHJldHVybiBNRl9NZXRhUGFyYW04KGRjLCBNRVRBX1BJRSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorCQkJIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLCB5ZW5kKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBNRkRSVl9DaG9yZAorICovCitCT09MMzIKK01GRFJWX0Nob3JkKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwKKyAgICAgICAgICAgICBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwgSU5UMzIgeWVuZCApCit7CisgICAgcmV0dXJuIE1GX01ldGFQYXJhbTgoZGMsIE1FVEFfQ0hPUkQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKwkJCSB4c3RhcnQsIHlzdGFydCwgeGVuZCwgeWVuZCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIE1GRFJWX0VsbGlwc2UKKyAqLworQk9PTDMyCitNRkRSVl9FbGxpcHNlKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSApCit7CisgICAgcmV0dXJuIE1GX01ldGFQYXJhbTQoZGMsIE1FVEFfRUxMSVBTRSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfUmVjdGFuZ2xlCisgKi8KK0JPT0wzMgorTUZEUlZfUmVjdGFuZ2xlKERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tKQoreworICAgIHJldHVybiBNRl9NZXRhUGFyYW00KGRjLCBNRVRBX1JFQ1RBTkdMRSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfUm91bmRSZWN0CisgKi8KK0JPT0wzMiAKK01GRFJWX1JvdW5kUmVjdCggREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LAorICAgICAgICAgICAgICAgICBJTlQzMiBib3R0b20sIElOVDMyIGVsbF93aWR0aCwgSU5UMzIgZWxsX2hlaWdodCApCit7CisgICAgcmV0dXJuIE1GX01ldGFQYXJhbTYoZGMsIE1FVEFfUk9VTkRSRUNULCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCisJCQkgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfU2V0UGl4ZWwKKyAqLworQ09MT1JSRUYKK01GRFJWX1NldFBpeGVsKCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIENPTE9SUkVGIGNvbG9yICkKK3sKKyAgICByZXR1cm4gTUZfTWV0YVBhcmFtNChkYywgTUVUQV9TRVRQSVhFTCwgeCwgeSxISVdPUkQoY29sb3IpLExPV09SRChjb2xvcikpOyAKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgTUZEUlZfUG9seWxpbmUKKyAqLworQk9PTDMyCitNRkRSVl9Qb2x5bGluZSggREMgKmRjLCBjb25zdCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBMUFBPSU5UMTYJcHQxNjsKKyAgICBCT09MMTYJcmV0OworCisgICAgcHQxNiA9IChMUFBPSU5UMTYpeG1hbGxvYyhzaXplb2YoUE9JTlQxNikqY291bnQpOworICAgIGZvciAoaT1jb3VudDtpLS07KSBDT05WX1BPSU5UMzJUTzE2KCYocHRbaV0pLCYocHQxNltpXSkpOworICAgIHJldCA9IE1GX01ldGFQb2x5KGRjLCBNRVRBX1BPTFlMSU5FLCBwdDE2LCBjb3VudCk7IAorCisgICAgZnJlZShwdDE2KTsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBNRkRSVl9Qb2x5Z29uCisgKi8KK0JPT0wzMgorTUZEUlZfUG9seWdvbiggREMgKmRjLCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBMUFBPSU5UMTYJcHQxNjsKKyAgICBCT09MMTYJcmV0OworCisgICAgcHQxNiA9IChMUFBPSU5UMTYpeG1hbGxvYyhzaXplb2YoUE9JTlQxNikqY291bnQpOworICAgIGZvciAoaT1jb3VudDtpLS07KSBDT05WX1BPSU5UMzJUTzE2KCYocHRbaV0pLCYocHQxNltpXSkpOworICAgIHJldCA9IE1GX01ldGFQb2x5KGRjLCBNRVRBX1BPTFlHT04sIHB0MTYsIGNvdW50KTsgCisKKyAgICBmcmVlKHB0MTYpOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIFBvbHlQb2x5Z29uCisgKi8KK0JPT0wzMiAKK01GRFJWX1BvbHlQb2x5Z29uKCBEQyAqZGMsIExQUE9JTlQzMiBwdCwgTFBJTlQzMiBjb3VudHMsIFVJTlQzMiBwb2x5Z29ucykKK3sKKyAgICBpbnQJCWksajsKKyAgICBMUFBPSU5UMTYJcHQxNjsKKyAgICBMUFBPSU5UMzIJY3VycHQ9cHQ7CisgICAgQk9PTDMyCXJldDsKKworICAgIGZvciAoaT0wO2k8cG9seWdvbnM7aSsrKSB7CisgICAgCXB0MTY9KExQUE9JTlQxNil4bWFsbG9jKHNpemVvZihQT0lOVDE2KSpjb3VudHNbaV0pOworCWZvciAoaj1jb3VudHNbaV07ai0tOykgQ09OVl9QT0lOVDMyVE8xNigmKGN1cnB0W2pdKSwmKHB0MTZbal0pKTsKKwlyZXQgPSBNRl9NZXRhUG9seShkYywgTUVUQV9QT0xZR09OLCBwdDE2LCBjb3VudHNbaV0pOworCWZyZWUocHQxNik7CisJaWYgKCFyZXQpCisJICAgIHJldHVybiBGQUxTRTsKKwljdXJwdCs9Y291bnRzW2ldOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgTUZEUlZfRXh0Rmxvb2RGaWxsCisgKi8KK0JPT0wzMiAKK01GRFJWX0V4dEZsb29kRmlsbCggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LCBDT0xPUlJFRiBjb2xvciwgVUlOVDMyIGZpbGxUeXBlICkKK3sKKyAgICByZXR1cm4gTUZfTWV0YVBhcmFtNChkYyxNRVRBX0ZMT09ERklMTCx4LHksSElXT1JEKGNvbG9yKSxMT1dPUkQoY29sb3IpKTsgCit9CmRpZmYgLS1naXQgYS9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMgYi9ncmFwaGljcy9tZXRhZmlsZWRydi9pbml0LmMKaW5kZXggOTNkMzhjYS4uNjU0NWM5ZSAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvaW5pdC5jCisrKyBiL2dyYXBoaWNzL21ldGFmaWxlZHJ2L2luaXQuYwpAQCAtMTYsNDEgKzE2LDM4IEBACiAKIHN0YXRpYyBjb25zdCBEQ19GVU5DVElPTlMgTUZEUlZfRnVuY3MgPQogewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBBcmMgKi8KKyAgICBNRkRSVl9BcmMsICAgICAgICAgICAgICAgICAgICAgICAvKiBwQXJjICovCiAgICAgTUZEUlZfQml0Qmx0LCAgICAgICAgICAgICAgICAgICAgLyogcEJpdEJsdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBDaG9yZCAqLworICAgIE1GRFJWX0Nob3JkLCAgICAgICAgICAgICAgICAgICAgIC8qIHBDaG9yZCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBDcmVhdGVEQyAqLwogICAgIE1GRFJWX0RlbGV0ZURDLCAgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVEQyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVPYmplY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRWxsaXBzZSAqLworICAgIE1GRFJWX0VsbGlwc2UsICAgICAgICAgICAgICAgICAgIC8qIHBFbGxpcHNlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEVzY2FwZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFeGNsdWRlQ2xpcFJlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZVZpc1JlY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRmlsbFJnbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBGbG9vZEZpbGwgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRnJhbWVSZ24gKi8KKyAgICBNRkRSVl9FeHRGbG9vZEZpbGwsICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCisgICAgTUZEUlZfRXh0VGV4dE91dCwgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KKyAgICBOVUxMIC8qIG5vIGltcGxlbWVudGF0aW9uICovLCAgICAvKiBwR2V0UGl4ZWwgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwR2V0VGV4dEV4dGVudFBvaW50ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldFRleHRNZXRyaWNzICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdENsaXBSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdFZpc1JlY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwSW52ZXJ0UmduICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcExpbmVUbyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBNb3ZlVG9FeCAqLworICAgIE1GRFJWX0xpbmVUbywgICAgICAgICAgICAgICAgICAgIC8qIHBMaW5lVG8gKi8KKyAgICBNRkRSVl9Nb3ZlVG9FeCwgICAgICAgICAgICAgICAgICAvKiBwTW92ZVRvRXggKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwT2Zmc2V0Q2xpcFJnbiAqLwogICAgIE1GRFJWX09mZnNldFZpZXdwb3J0T3JnLCAgICAgICAgIC8qIHBPZmZzZXRWaWV3cG9ydE9yZyAqLwogICAgIE1GRFJWX09mZnNldFdpbmRvd09yZywgICAgICAgICAgIC8qIHBPZmZzZXRXaW5kb3dPcmcgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUGFpbnRSZ24gKi8KICAgICBNRkRSVl9QYXRCbHQsICAgICAgICAgICAgICAgICAgICAvKiBwUGF0Qmx0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBpZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5UG9seWdvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5Z29uICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBvbHlsaW5lICovCisgICAgTUZEUlZfUGllLCAgICAgICAgICAgICAgICAgICAgICAgLyogcFBpZSAqLworICAgIE1GRFJWX1BvbHlQb2x5Z29uLCAgICAgICAgICAgICAgIC8qIHBQb2x5UG9seWdvbiAqLworICAgIE1GRFJWX1BvbHlnb24sICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5Z29uICovCisgICAgTUZEUlZfUG9seWxpbmUsICAgICAgICAgICAgICAgICAgLyogcFBvbHlsaW5lICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJlYWxpemVQYWxldHRlICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJlY3RhbmdsZSAqLworICAgIE1GRFJWX1JlY3RhbmdsZSwgICAgICAgICAgICAgICAgIC8qIHBSZWN0YW5nbGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUmVzdG9yZURDICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJvdW5kUmVjdCAqLworICAgIE1GRFJWX1JvdW5kUmVjdCwgICAgICAgICAgICAgICAgIC8qIHBSb3VuZFJlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2F2ZURDICovCiAgICAgTUZEUlZfU2NhbGVWaWV3cG9ydEV4dCwgICAgICAgICAgLyogcFNjYWxlVmlld3BvcnRFeHQgKi8KICAgICBNRkRSVl9TY2FsZVdpbmRvd0V4dCwgICAgICAgICAgICAvKiBwU2NhbGVXaW5kb3dFeHQgKi8KQEAgLTYzLDcgKzYwLDcgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0RElCaXRzVG9EZXZpY2UgKi8KICAgICBNRkRSVl9TZXRNYXBNb2RlLCAgICAgICAgICAgICAgICAvKiBwU2V0TWFwTW9kZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRNYXBwZXJGbGFncyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRQaXhlbCAqLworICAgIE1GRFJWX1NldFBpeGVsLCAgICAgICAgICAgICAgICAgIC8qIHBTZXRQaXhlbCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRQb2x5RmlsbE1vZGUgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0Uk9QMiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRSZWxBYnMgKi8KQEAgLTc3LDggKzc0LDcgQEAKICAgICBNRkRSVl9TZXRXaW5kb3dFeHQsICAgICAgICAgICAgICAvKiBwU2V0V2luZG93RXh0ICovCiAgICAgTUZEUlZfU2V0V2luZG93T3JnLCAgICAgICAgICAgICAgLyogcFNldFdpbmRvd09yZyAqLwogICAgIE1GRFJWX1N0cmV0Y2hCbHQsICAgICAgICAgICAgICAgIC8qIHBTdHJldGNoQmx0ICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hESUJpdHMgKi8KLSAgICBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwVGV4dE91dCAqLworICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTdHJldGNoRElCaXRzICovCiB9OwogCiAKQEAgLTIzNyw0ICsyMzMsMyBAQAogewogICAgIHJldHVybiAhR2xvYmFsRnJlZTE2KCBobWYgKTsKIH0KLQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvdGV4dC5jIGIvZ3JhcGhpY3MvbWV0YWZpbGVkcnYvdGV4dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2FmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy9tZXRhZmlsZWRydi90ZXh0LmMKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIG1ldGFmaWxlIGRyaXZlciB0ZXh0IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAxOTkzLCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImRjLmgiCisjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAibWV0YWZpbGUuaCIKKyNpbmNsdWRlICJtZXRhZmlsZWRydi5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgTUZEUlZfRXh0VGV4dE91dAorICovCitCT09MMzIKK01GRFJWX0V4dFRleHRPdXQoIERDICpkYywgSU5UMzIgeCwgSU5UMzIgeSwgVUlOVDMyIGZsYWdzLAorICAgICAgICAgICAgICAgICAgY29uc3QgUkVDVDMyICpscHJlY3QsIExQQ1NUUiBzdHIsIFVJTlQzMiBjb3VudCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscER4ICkKK3sKKyAgICBSRUNUMTYJcmVjdDE2OworICAgIExQSU5UMTYJbHBkeDE2ID0gbHBEeD8oTFBJTlQxNil4bWFsbG9jKHNpemVvZihJTlQxNikqY291bnQpOk5VTEw7CisgICAgQk9PTDMyCXJldDsKKyAgICBpbnQJCWk7CisKKyAgICBpZiAobHByZWN0KQlDT05WX1JFQ1QzMlRPMTYobHByZWN0LCZyZWN0MTYpOworICAgIGlmIChscGR4MTYpCWZvciAoaT1jb3VudDtpLS07KSBscGR4MTZbaV09bHBEeFtpXTsKKyAgICByZXQ9TUZfRXh0VGV4dE91dChkYyx4LHksZmxhZ3MsbHByZWN0PyZyZWN0MTY6TlVMTCxzdHIsY291bnQsbHBkeDE2KTsKKyAgICBpZiAobHBkeDE2KQlmcmVlKGxwZHgxNik7CisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3dpbjE2ZHJ2L2luaXQuYwppbmRleCA4ZDA1Y2RhLi4wZjAzOTlhIDEwMDY0NAotLS0gYS9ncmFwaGljcy93aW4xNmRydi9pbml0LmMKKysrIGIvZ3JhcGhpY3Mvd2luMTZkcnYvaW5pdC5jCkBAIC01MCwxNCArNTAsMTEgQEAKICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZVZpc1JlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRmlsbFJnbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBGbG9vZEZpbGwgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRnJhbWVSZ24gKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwR2V0UGl4ZWwgKi8KICAgICBXSU4xNkRSVl9HZXRUZXh0RXh0ZW50UG9pbnQsICAgICAvKiBwR2V0VGV4dEV4dGVudFBvaW50ICovCiAgICAgV0lOMTZEUlZfR2V0VGV4dE1ldHJpY3MsICAgICAgICAgLyogcEdldFRleHRNZXRyaWNzICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdENsaXBSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdFZpc1JlY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwSW52ZXJ0UmduICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcExpbmVUbyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBNb3ZlVG9FeCAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBPZmZzZXRDbGlwUmduICovCkBAIC05OSw4ICs5Niw3IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd0V4dCAob3B0aW9uYWwpICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd09yZyAob3B0aW9uYWwpICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hCbHQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU3RyZXRjaERJQml0cyAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBUZXh0T3V0ICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hESUJpdHMgKi8KIH07CiAKIApkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluIGIvZ3JhcGhpY3MveDExZHJ2L01ha2VmaWxlLmluCmluZGV4IDc3ODgzYTIuLjFmZDM2ZGIgMTAwNjQ0Ci0tLSBhL2dyYXBoaWNzL3gxMWRydi9NYWtlZmlsZS5pbgorKysgYi9ncmFwaGljcy94MTFkcnYvTWFrZWZpbGUuaW4KQEAgLTksNyArOSw5IEBACiAJYml0Ymx0LmMgXAogCWNsaXBwaW5nLmMgXAogCWZvbnQuYyBcCi0JaW5pdC5jCisJZ3JhcGhpY3MuYyBcCisJaW5pdC5jIFwKKwl0ZXh0LmMKIAogYWxsOiAkKE1PRFVMRSkubwogCmRpZmYgLS1naXQgYS9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYyBiL2dyYXBoaWNzL3gxMWRydi9ncmFwaGljcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDM4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9ncmFwaGljcy94MTFkcnYvZ3JhcGhpY3MuYwpAQCAtMCwwICsxLDY3OCBAQAorLyoKKyAqIFgxMSBncmFwaGljcyBkcml2ZXIgZ3JhcGhpY3MgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMsMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPFgxMS9YbGliLmg+CisjaW5jbHVkZSA8WDExL1h1dGlsLmg+CisjaW5jbHVkZSA8WDExL0ludHJpbnNpYy5oPgorI2lmbmRlZiBQSQorI2RlZmluZSBQSSBNX1BJCisjZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgIngxMWRydi5oIgorI2luY2x1ZGUgImJpdG1hcC5oIgorI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImdyYXBoaWNzLmgiCisjaW5jbHVkZSAiZGMuaCIKKyNpbmNsdWRlICJiaXRtYXAuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgIm1ldGFmaWxlLmgiCisjaW5jbHVkZSAic3lzY29sb3IuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgInBhbGV0dGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorI2luY2x1ZGUgInJlZ2lvbi5oIgorI2luY2x1ZGUgInN0cnVjdDMyLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlICJ4bWFsbG9jLmgiCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgWDExRFJWX01vdmVUb0V4CisgKi8KK0JPT0wzMgorWDExRFJWX01vdmVUb0V4KERDICpkYyxJTlQzMiB4LElOVDMyIHksTFBQT0lOVDMyIHB0KSB7CisgICAgaWYgKHB0KQorICAgIHsKKwlwdC0+eCA9IGRjLT53LkN1cnNQb3NYOworCXB0LT55ID0gZGMtPncuQ3Vyc1Bvc1k7CisgICAgfQorICAgIGRjLT53LkN1cnNQb3NYID0geDsKKyAgICBkYy0+dy5DdXJzUG9zWSA9IHk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9MaW5lVG8KKyAqLworQk9PTDMyCitYMTFEUlZfTGluZVRvKCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHkgKQoreworICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQorCVhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKwkJICBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgZGMtPncuQ3Vyc1Bvc1ggKSwKKwkJICBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgZGMtPncuQ3Vyc1Bvc1kgKSwKKwkJICBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgeCApLAorCQkgIGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICkgKTsKKyAgICBkYy0+dy5DdXJzUG9zWCA9IHg7CisgICAgZGMtPncuQ3Vyc1Bvc1kgPSB5OworICAgIHJldHVybiBUUlVFOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR1JBUEhfRHJhd0FyYworICoKKyAqIEhlbHBlciBmdW5jdGlvbnMgZm9yIEFyYygpLCBDaG9yZCgpIGFuZCBQaWUoKS4KKyAqICdsaW5lcycgaXMgdGhlIG51bWJlciBvZiBsaW5lcyB0byBkcmF3OiAwIGZvciBBcmMsIDEgZm9yIENob3JkLCAyIGZvciBQaWUuCisgKi8KK3N0YXRpYyBCT09MMzIKK1gxMURSVl9EcmF3QXJjKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsCisgICAgICAgICAgICAgICAgSU5UMzIgYm90dG9tLCBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwKKyAgICAgICAgICAgICAgICBJTlQzMiB4ZW5kLCBJTlQzMiB5ZW5kLCBJTlQzMiBsaW5lcyApCit7CisgICAgSU5UMzIgeGNlbnRlciwgeWNlbnRlciwgaXN0YXJ0X2FuZ2xlLCBpZGlmZl9hbmdsZSwgdG1wOworICAgIGRvdWJsZSBzdGFydF9hbmdsZSwgZW5kX2FuZ2xlOworICAgIFhQb2ludCBwb2ludHNbM107CisKKyAgICBsZWZ0ICAgPSBYTFBUT0RQKCBkYywgbGVmdCApOworICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKKyAgICByaWdodCAgPSBYTFBUT0RQKCBkYywgcmlnaHQgKTsKKyAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7CisgICAgeHN0YXJ0ID0gWExQVE9EUCggZGMsIHhzdGFydCApOworICAgIHlzdGFydCA9IFlMUFRPRFAoIGRjLCB5c3RhcnQgKTsKKyAgICB4ZW5kICAgPSBYTFBUT0RQKCBkYywgeGVuZCApOworICAgIHllbmQgICA9IFlMUFRPRFAoIGRjLCB5ZW5kICk7CisgICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpIHJldHVybiBGQUxTRTsKKworICAgIHhjZW50ZXIgPSAocmlnaHQgKyBsZWZ0KSAvIDI7CisgICAgeWNlbnRlciA9IChib3R0b20gKyB0b3ApIC8gMjsKKyAgICBzdGFydF9hbmdsZSA9IGF0YW4yKCAoZG91YmxlKSh5Y2VudGVyLXlzdGFydCkqKHJpZ2h0LWxlZnQpLAorCQkJIChkb3VibGUpKHhzdGFydC14Y2VudGVyKSooYm90dG9tLXRvcCkgKTsKKyAgICBlbmRfYW5nbGUgICA9IGF0YW4yKCAoZG91YmxlKSh5Y2VudGVyLXllbmQpKihyaWdodC1sZWZ0KSwKKwkJCSAoZG91YmxlKSh4ZW5kLXhjZW50ZXIpKihib3R0b20tdG9wKSApOworICAgIGlzdGFydF9hbmdsZSA9IChJTlQzMikoc3RhcnRfYW5nbGUgKiAxODAgKiA2NCAvIFBJKTsKKyAgICBpZGlmZl9hbmdsZSAgPSAoSU5UMzIpKChlbmRfYW5nbGUgLSBzdGFydF9hbmdsZSkgKiAxODAgKiA2NCAvIFBJICk7CisgICAgaWYgKGlkaWZmX2FuZ2xlIDw9IDApIGlkaWZmX2FuZ2xlICs9IDM2MCAqIDY0OworICAgIGlmIChsZWZ0ID4gcmlnaHQpIHsgdG1wPWxlZnQ7IGxlZnQ9cmlnaHQ7IHJpZ2h0PXRtcDsgfQorICAgIGlmICh0b3AgPiBib3R0b20pIHsgdG1wPXRvcDsgdG9wPWJvdHRvbTsgYm90dG9tPXRtcDsgfQorCisgICAgICAvKiBGaWxsIGFyYyB3aXRoIGJydXNoIGlmIENob3JkKCkgb3IgUGllKCkgKi8KKworICAgIGlmICgobGluZXMgPiAwKSAmJiBEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCisgICAgeworICAgICAgICBYU2V0QXJjTW9kZSggZGlzcGxheSwgZGMtPnUueC5nYywgKGxpbmVzPT0xKSA/IEFyY0Nob3JkIDogQXJjUGllU2xpY2UpOworICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSwgaXN0YXJ0X2FuZ2xlLCBpZGlmZl9hbmdsZSApOworICAgIH0KKworICAgICAgLyogRHJhdyBhcmMgYW5kIGxpbmVzICovCisKKyAgICBpZiAoIURDX1NldHVwR0NGb3JQZW4oIGRjICkpIHJldHVybiBUUlVFOworICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCSAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKwkgICAgICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSwgaXN0YXJ0X2FuZ2xlLCBpZGlmZl9hbmdsZSApOworICAgIGlmICghbGluZXMpIHJldHVybiBUUlVFOworCisgICAgcG9pbnRzWzBdLnggPSBkYy0+dy5EQ09yZ1ggKyB4Y2VudGVyICsgKGludCkoY29zKHN0YXJ0X2FuZ2xlKSAqIChyaWdodC1sZWZ0KSAvIDIpOworICAgIHBvaW50c1swXS55ID0gZGMtPncuRENPcmdZICsgeWNlbnRlciAtIChpbnQpKHNpbihzdGFydF9hbmdsZSkgKiAoYm90dG9tLXRvcCkgLyAyKTsKKyAgICBwb2ludHNbMV0ueCA9IGRjLT53LkRDT3JnWCArIHhjZW50ZXIgKyAoaW50KShjb3MoZW5kX2FuZ2xlKSAqIChyaWdodC1sZWZ0KSAvIDIpOworICAgIHBvaW50c1sxXS55ID0gZGMtPncuRENPcmdZICsgeWNlbnRlciAtIChpbnQpKHNpbihlbmRfYW5nbGUpICogKGJvdHRvbS10b3ApIC8gMik7CisgICAgaWYgKGxpbmVzID09IDIpCisgICAgeworCXBvaW50c1syXSA9IHBvaW50c1sxXTsKKwlwb2ludHNbMV0ueCA9IGRjLT53LkRDT3JnWCArIHhjZW50ZXI7CisJcG9pbnRzWzFdLnkgPSBkYy0+dy5EQ09yZ1kgKyB5Y2VudGVyOworICAgIH0KKyAgICBYRHJhd0xpbmVzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCSAgICAgICAgcG9pbnRzLCBsaW5lcysxLCBDb29yZE1vZGVPcmlnaW4gKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfQXJjCisgKi8KK0JPT0wzMgorWDExRFJWX0FyYyggREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20sCisgICAgICAgICAgICBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwgSU5UMzIgeWVuZCApCit7CisgICAgcmV0dXJuIFgxMURSVl9EcmF3QXJjKCBkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorCQkJICAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDAgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfUGllCisgKi8KK0JPT0wzMgorWDExRFJWX1BpZSggREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20sCisgICAgICAgICAgICBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwgSU5UMzIgeWVuZCApCit7CisgICAgcmV0dXJuIFgxMURSVl9EcmF3QXJjKCBkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAorCQkJICAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDIgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWDExRFJWX0Nob3JkCisgKi8KK0JPT0wzMgorWDExRFJWX0Nob3JkKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwKKyAgICAgICAgICAgICAgSU5UMzIgeHN0YXJ0LCBJTlQzMiB5c3RhcnQsIElOVDMyIHhlbmQsIElOVDMyIHllbmQgKQoreworICAgIHJldHVybiBYMTFEUlZfRHJhd0FyYyggZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKKwkJICAJICAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDEgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfRWxsaXBzZQorICovCitCT09MMzIKK1gxMURSVl9FbGxpcHNlKCBEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSApCit7CisgICAgbGVmdCAgID0gWExQVE9EUCggZGMsIGxlZnQgKTsKKyAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7CisgICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJpZ2h0ICk7CisgICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOworICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKSByZXR1cm4gRkFMU0U7CisKKyAgICBpZiAocmlnaHQgPCBsZWZ0KSB7IElOVDMyIHRtcCA9IHJpZ2h0OyByaWdodCA9IGxlZnQ7IGxlZnQgPSB0bXA7IH0KKyAgICBpZiAoYm90dG9tIDwgdG9wKSB7IElOVDMyIHRtcCA9IGJvdHRvbTsgYm90dG9tID0gdG9wOyB0b3AgPSB0bXA7IH0KKyAgICAKKyAgICBpZiAoKGRjLT51LngucGVuLnN0eWxlID09IFBTX0lOU0lERUZSQU1FKSAmJgorICAgICAgICAoZGMtPnUueC5wZW4ud2lkdGggPCByaWdodC1sZWZ0LTEpICYmCisgICAgICAgIChkYy0+dS54LnBlbi53aWR0aCA8IGJvdHRvbS10b3AtMSkpCisgICAgeworICAgICAgICBsZWZ0ICAgKz0gZGMtPnUueC5wZW4ud2lkdGggLyAyOworICAgICAgICByaWdodCAgLT0gKGRjLT51LngucGVuLndpZHRoICsgMSkgLyAyOworICAgICAgICB0b3AgICAgKz0gZGMtPnUueC5wZW4ud2lkdGggLyAyOworICAgICAgICBib3R0b20gLT0gKGRjLT51LngucGVuLndpZHRoICsgMSkgLyAyOworICAgIH0KKworICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCisJWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAorCQkgIHJpZ2h0LWxlZnQtMSwgYm90dG9tLXRvcC0xLCAwLCAzNjAqNjQgKTsKKyAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKKwlYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwkJICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCisJCSAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIDAsIDM2MCo2NCApOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9SZWN0YW5nbGUKKyAqLworQk9PTDMyCitYMTFEUlZfUmVjdGFuZ2xlKERDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tKQoreworICAgIElOVDMyIHdpZHRoOworICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCBsZWZ0ICk7CisgICAgdG9wICAgID0gWUxQVE9EUCggZGMsIHRvcCApOworICAgIHJpZ2h0ICA9IFhMUFRPRFAoIGRjLCByaWdodCApOworICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCBib3R0b20gKTsKKworICAgIGlmIChyaWdodCA8IGxlZnQpIHsgSU5UMzIgdG1wID0gcmlnaHQ7IHJpZ2h0ID0gbGVmdDsgbGVmdCA9IHRtcDsgfQorICAgIGlmIChib3R0b20gPCB0b3ApIHsgSU5UMzIgdG1wID0gYm90dG9tOyBib3R0b20gPSB0b3A7IHRvcCA9IHRtcDsgfQorCisgICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpCisgICAgeworCWlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQorCSAgICBYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisJCSAgZGMtPncuRENPcmdYICsgbGVmdCwKKwkJICBkYy0+dy5EQ09yZ1kgKyB0b3AsCisJCSAgZGMtPncuRENPcmdYICsgcmlnaHQsCisJCSAgZGMtPncuRENPcmdZICsgYm90dG9tKTsKKwlyZXR1cm4gVFJVRTsKKyAgICB9CisgICAgd2lkdGggPSBkYy0+dS54LnBlbi53aWR0aDsKKyAgICBpZiAoIXdpZHRoKSB3aWR0aCA9IDE7CisgICAgaWYoZGMtPnUueC5wZW4uc3R5bGUgPT0gUFNfTlVMTCkgd2lkdGggPSAwOworCisgICAgaWYgKChkYy0+dS54LnBlbi5zdHlsZSA9PSBQU19JTlNJREVGUkFNRSkgJiYKKyAgICAgICAgKHdpZHRoIDwgcmlnaHQtbGVmdCkgJiYgKHdpZHRoIDwgYm90dG9tLXRvcCkpCisgICAgeworICAgICAgICBsZWZ0ICAgKz0gd2lkdGggLyAyOworICAgICAgICByaWdodCAgLT0gKHdpZHRoICsgMSkgLyAyOworICAgICAgICB0b3AgICAgKz0gd2lkdGggLyAyOworICAgICAgICBib3R0b20gLT0gKHdpZHRoICsgMSkgLyAyOworICAgIH0KKworICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCisJWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArICh3aWR0aCArIDEpIC8gMiwKKwkJICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyAod2lkdGggKyAxKSAvIDIsCisJCSAgICAgICAgcmlnaHQtbGVmdC13aWR0aC0xLCBib3R0b20tdG9wLXdpZHRoLTEpOworICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQorCVhEcmF3UmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKwkJICAgICAgICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSApOworICAgIHJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfUm91bmRSZWN0CisgKi8KK0JPT0wzMgorWDExRFJWX1JvdW5kUmVjdCggREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgSU5UMzIgYm90dG9tLCBJTlQzMiBlbGxfd2lkdGgsIElOVDMyIGVsbF9oZWlnaHQgKQoreworICAgIGRwcmludGZfZ3JhcGhpY3Moc3RkZGViLCAiWDExRFJWX1JvdW5kUmVjdCglZCAlZCAlZCAlZCAgJWQgJWRcbiIsIAorICAgIAlsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIGVsbF93aWR0aCwgZWxsX2hlaWdodCk7CisKKyAgICBsZWZ0ICAgPSBYTFBUT0RQKCBkYywgbGVmdCApOworICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKKyAgICByaWdodCAgPSBYTFBUT0RQKCBkYywgcmlnaHQgKTsKKyAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7CisgICAgZWxsX3dpZHRoICA9IGFicyggZWxsX3dpZHRoICogZGMtPnZwb3J0RXh0WCAvIGRjLT53bmRFeHRYICk7CisgICAgZWxsX2hlaWdodCA9IGFicyggZWxsX2hlaWdodCAqIGRjLT52cG9ydEV4dFkgLyBkYy0+d25kRXh0WSApOworCisgICAgLyogRml4IHRoZSBjb29yZGluYXRlcyAqLworCisgICAgaWYgKHJpZ2h0IDwgbGVmdCkgeyBJTlQzMiB0bXAgPSByaWdodDsgcmlnaHQgPSBsZWZ0OyBsZWZ0ID0gdG1wOyB9CisgICAgaWYgKGJvdHRvbSA8IHRvcCkgeyBJTlQzMiB0bXAgPSBib3R0b207IGJvdHRvbSA9IHRvcDsgdG9wID0gdG1wOyB9CisgICAgaWYgKGVsbF93aWR0aCA+IHJpZ2h0IC0gbGVmdCkgZWxsX3dpZHRoID0gcmlnaHQgLSBsZWZ0OworICAgIGlmIChlbGxfaGVpZ2h0ID4gYm90dG9tIC0gdG9wKSBlbGxfaGVpZ2h0ID0gYm90dG9tIC0gdG9wOworCisgICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKKyAgICB7CisgICAgICAgIGlmIChlbGxfd2lkdGggJiYgZWxsX2hlaWdodCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgOTAgKiA2NCwgOTAgKiA2NCApOworICAgICAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDE4MCAqIDY0LCA5MCAqIDY0ICk7CisgICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgIFhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLCBkYy0+dy5EQ09yZ1kgKyB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAwLCA5MCAqIDY0ICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsbF93aWR0aCA8IHJpZ2h0IC0gbGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIGVsbF93aWR0aCwgZWxsX2hlaWdodCAvIDIgKTsKKyAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIChlbGxfaGVpZ2h0KzEpIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQgLSBlbGxfd2lkdGgsIChlbGxfaGVpZ2h0KzEpIC8gMiApOworICAgICAgICB9CisgICAgICAgIGlmICAoZWxsX2hlaWdodCA8IGJvdHRvbSAtIHRvcCkKKyAgICAgICAgeworICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCAtIGxlZnQsIGJvdHRvbSAtIHRvcCAtIGVsbF9oZWlnaHQgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbihkYykpCisgICAgeworICAgICAgICBpZiAoZWxsX3dpZHRoICYmIGVsbF9oZWlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDkwICogNjQsIDkwICogNjQgKTsKKyAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAxODAgKiA2NCwgOTAgKiA2NCApOworICAgICAgICAgICAgWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDI3MCAqIDY0LCA5MCAqIDY0ICk7CisgICAgICAgICAgICBYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKyAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwgZGMtPncuRENPcmdZICsgdG9wLAorICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMCwgOTAgKiA2NCApOworCX0KKyAgICAgICAgaWYgKGVsbF93aWR0aCA8IHJpZ2h0IC0gbGVmdCkKKyAgICAgICAgeworICAgICAgICAgICAgWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKTsKKyAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQgKyBlbGxfd2lkdGggLyAyLAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20sCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVsbF9oZWlnaHQgPCBib3R0b20gLSB0b3ApCisgICAgICAgIHsKKyAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQgLyAyICk7CisgICAgICAgICAgICBYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AgKyBlbGxfaGVpZ2h0IC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAvIDIgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfU2V0UGl4ZWwKKyAqLworQ09MT1JSRUYKK1gxMURSVl9TZXRQaXhlbCggREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LCBDT0xPUlJFRiBjb2xvciApCit7CisgICAgUGl4ZWwgcGl4ZWw7CisgICAgCisgICAgeCA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCB4ICk7CisgICAgeSA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICk7CisgICAgcGl4ZWwgPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgY29sb3IgKTsKKyAgICAKKyAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgcGl4ZWwgKTsKKyAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOworICAgIFhEcmF3UG9pbnQoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHgsIHkgKTsKKworICAgIC8qIGluZWZmaWNpZW50IGJ1dCBzaW1wbGUuLi4gKi8KKworICAgIHJldHVybiBDT0xPUl9Ub0xvZ2ljYWwocGl4ZWwpOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFgxMURSVl9HZXRQaXhlbAorICovCitDT0xPUlJFRgorWDExRFJWX0dldFBpeGVsKCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHkgKQoreworICAgIHN0YXRpYyBQaXhtYXAgcGl4bWFwID0gMDsKKyAgICBYSW1hZ2UgKiBpbWFnZTsKKyAgICBpbnQgcGl4ZWw7CisKKyAgICB4ID0gZGMtPncuRENPcmdYICsgWExQVE9EUCggZGMsIHggKTsKKyAgICB5ID0gZGMtPncuRENPcmdZICsgWUxQVE9EUCggZGMsIHkgKTsKKyAgICBpZiAoZGMtPncuZmxhZ3MgJiBEQ19NRU1PUlkpCisgICAgeworICAgICAgICBpbWFnZSA9IFhHZXRJbWFnZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgeCwgeSwgMSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFBsYW5lcywgWlBpeG1hcCApOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBJZiB3ZSBhcmUgcmVhZGluZyBmcm9tIHRoZSBzY3JlZW4sIHVzZSBhIHRlbXBvcmFyeSBjb3B5ICovCisgICAgICAgIC8qIHRvIGF2b2lkIGEgQmFkTWF0Y2ggZXJyb3IgKi8KKyAgICAgICAgaWYgKCFwaXhtYXApIHBpeG1hcCA9IFhDcmVhdGVQaXhtYXAoIGRpc3BsYXksIHJvb3RXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBkYy0+dy5iaXRzUGVyUGl4ZWwgKTsKKyAgICAgICAgWENvcHlBcmVhKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBwaXhtYXAsIEJJVE1BUF9jb2xvckdDLAorICAgICAgICAgICAgICAgICAgIHgsIHksIDEsIDEsIDAsIDAgKTsKKyAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIHBpeG1hcCwgMCwgMCwgMSwgMSwgQWxsUGxhbmVzLCBaUGl4bWFwICk7CisgICAgfQorICAgIHBpeGVsID0gWEdldFBpeGVsKCBpbWFnZSwgMCwgMCApOworICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgCisgICAgcmV0dXJuIENPTE9SX1RvTG9naWNhbChwaXhlbCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgWDExRFJWX1BhaW50UmduCisgKi8KK0JPT0wzMgorWDExRFJWX1BhaW50UmduKCBEQyAqZGMsIEhSR04zMiBocmduICkKK3sKKyAgICBSRUNUMzIgYm94OworICAgIEhSR04zMiB0bXBWaXNSZ24sIHByZXZWaXNSZ247CisgICAgSERDMzIgIGhkYyA9IGRjLT5oU2VsZjsgLyogRklYTUU6IHNob3VsZCBub3QgbWl4IGRjL2hkYyB0aGlzIHdheSAqLworCisgICAgICAvKiBNb2RpZnkgdmlzaWJsZSByZWdpb24gKi8KKworICAgIGlmICghKHByZXZWaXNSZ24gPSBTYXZlVmlzUmduKCBoZGMgKSkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoISh0bXBWaXNSZ24gPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIDAsIDAgKSkpCisgICAgeworICAgICAgICBSZXN0b3JlVmlzUmduKCBoZGMgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICBDb21iaW5lUmduMzIoIHRtcFZpc1JnbiwgcHJldlZpc1JnbiwgaHJnbiwgUkdOX0FORCApOworICAgIFNlbGVjdFZpc1JnbiggaGRjLCB0bXBWaXNSZ24gKTsKKyAgICBEZWxldGVPYmplY3QzMiggdG1wVmlzUmduICk7CisKKyAgICAgIC8qIEZpbGwgdGhlIHJlZ2lvbiAqLworCisgICAgR2V0UmduQm94MzIoIGRjLT53LmhHQ0NsaXBSZ24sICZib3ggKTsKKyAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQorCVhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkgICAgICAgIGRjLT53LkRDT3JnWCArIGJveC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3gudG9wLAorCQkgICAgICAgIGJveC5yaWdodC1ib3gubGVmdCwgYm94LmJvdHRvbS1ib3gudG9wICk7CisKKyAgICAgIC8qIFJlc3RvcmUgdGhlIHZpc2libGUgcmVnaW9uICovCisKKyAgICBSZXN0b3JlVmlzUmduKCBoZGMgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIFgxMURSVl9Qb2x5bGluZQorICovCitCT09MMzIKK1gxMURSVl9Qb2x5bGluZSggREMgKmRjLCBjb25zdCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKworICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQorCWZvciAoaSA9IDA7IGkgPCBjb3VudC0xOyBpICsrKQorCSAgICBYRHJhd0xpbmUgKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsICAKKwkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpXS54KSwKKwkJICAgICAgIGRjLT53LkRDT3JnWSArIFlMUFRPRFAoZGMsIHB0IFtpXS55KSwKKwkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpKzFdLngpLAorCQkgICAgICAgZGMtPncuRENPcmdZICsgWUxQVE9EUChkYywgcHQgW2krMV0ueSkpOworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBYMTFEUlZfUG9seWdvbgorICovCitCT09MMzIKK1gxMURSVl9Qb2x5Z29uKCBEQyAqZGMsIExQUE9JTlQzMiBwdCwgSU5UMzIgY291bnQgKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIFhQb2ludCAqcG9pbnRzOworCisgICAgcG9pbnRzID0gKFhQb2ludCAqKSB4bWFsbG9jIChzaXplb2YgKFhQb2ludCkgKiAoY291bnQrMSkpOworICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQorICAgIHsKKwlwb2ludHNbaV0ueCA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCBwdFtpXS54ICk7CisJcG9pbnRzW2ldLnkgPSBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgcHRbaV0ueSApOworICAgIH0KKyAgICBwb2ludHNbY291bnRdID0gcG9pbnRzWzBdOworCisgICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKKwlYRmlsbFBvbHlnb24oIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgcG9pbnRzLCBjb3VudCsxLCBDb21wbGV4LCBDb29yZE1vZGVPcmlnaW4pOworCisgICAgaWYgKERDX1NldHVwR0NGb3JQZW4gKCBkYyApKQorCVhEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgIHBvaW50cywgY291bnQrMSwgQ29vcmRNb2RlT3JpZ2luICk7CisKKyAgICBmcmVlKCBwb2ludHMgKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgWDExRFJWX1BvbHlQb2x5Z29uCisgKi8KK0JPT0wzMiAKK1gxMURSVl9Qb2x5UG9seWdvbiggREMgKmRjLCBMUFBPSU5UMzIgcHQsIExQSU5UMzIgY291bnRzLCBVSU5UMzIgcG9seWdvbnMpCit7CisgICAgSFJHTjMyIGhyZ247CisKKyAgICAgIC8qIEZJWE1FOiBUaGUgcG9pbnRzIHNob3VsZCBiZSBjb252ZXJ0ZWQgdG8gZGV2aWNlIGNvb3JkcyBiZWZvcmUgKi8KKyAgICAgIC8qIGNyZWF0aW5nIHRoZSByZWdpb24uIEJ1dCBhcyBDcmVhdGVQb2x5UG9seWdvblJnbiBpcyBub3QgKi8KKyAgICAgIC8qIHJlYWxseSBjb3JyZWN0IGVpdGhlciwgaXQgZG9lc24ndCBtYXR0ZXIgbXVjaC4uLiAqLworICAgICAgLyogQXQgbGVhc3QgdGhlIG91dGxpbmUgd2lsbCBiZSBjb3JyZWN0IDotKSAqLworICAgIGhyZ24gPSBDcmVhdGVQb2x5UG9seWdvblJnbjMyKCBwdCwgY291bnRzLCBwb2x5Z29ucywgZGMtPncucG9seUZpbGxNb2RlICk7CisgICAgWDExRFJWX1BhaW50UmduKCBkYywgaHJnbiApOworICAgIERlbGV0ZU9iamVjdDMyKCBocmduICk7CisKKyAgICAgIC8qIERyYXcgdGhlIG91dGxpbmUgb2YgdGhlIHBvbHlnb25zICovCisKKyAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiAoIGRjICkpCisgICAgeworCWludCBpLCBqLCBtYXggPSAwOworCVhQb2ludCAqcG9pbnRzOworCisJZm9yIChpID0gMDsgaSA8IHBvbHlnb25zOyBpKyspIGlmIChjb3VudHNbaV0gPiBtYXgpIG1heCA9IGNvdW50c1tpXTsKKwlwb2ludHMgPSAoWFBvaW50ICopIHhtYWxsb2MoIHNpemVvZihYUG9pbnQpICogKG1heCsxKSApOworCisJZm9yIChpID0gMDsgaSA8IHBvbHlnb25zOyBpKyspCisJeworCSAgICBmb3IgKGogPSAwOyBqIDwgY291bnRzW2ldOyBqKyspCisJICAgIHsKKwkJcG9pbnRzW2pdLnggPSBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgcHQtPnggKTsKKwkJcG9pbnRzW2pdLnkgPSBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgcHQtPnkgKTsKKwkJcHQrKzsKKwkgICAgfQorCSAgICBwb2ludHNbal0gPSBwb2ludHNbMF07CisJICAgIFhEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisJCSAgICAgICAgcG9pbnRzLCBqICsgMSwgQ29vcmRNb2RlT3JpZ2luICk7CisJfQorCWZyZWUoIHBvaW50cyApOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgWDExRFJWX0ludGVybmFsRmxvb2RGaWxsCisgKgorICogSW50ZXJuYWwgaGVscGVyIGZ1bmN0aW9uIGZvciBmbG9vZCBmaWxsLgorICogKHhvcmcseW9yZykgaXMgdGhlIG9yaWdpbiBvZiB0aGUgWCBpbWFnZSByZWxhdGl2ZSB0byB0aGUgZHJhd2FibGUuCisgKiAoeCx5KSBpcyByZWxhdGl2ZSB0byB0aGUgb3JpZ2luIG9mIHRoZSBYIGltYWdlLgorICovCitzdGF0aWMgdm9pZCBYMTFEUlZfSW50ZXJuYWxGbG9vZEZpbGwoWEltYWdlICppbWFnZSwgREMgKmRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LCBpbnQgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeE9yZywgaW50IHlPcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGl4ZWwgcGl4ZWwsIFdPUkQgZmlsbFR5cGUgKQoreworICAgIGludCBsZWZ0LCByaWdodDsKKworI2RlZmluZSBUT19GTE9PRCh4LHkpICAoKGZpbGxUeXBlID09IEZMT09ERklMTEJPUkRFUikgPyBcCisgICAgICAgICAgICAgICAgICAgICAgICAoWEdldFBpeGVsKGltYWdlLHgseSkgIT0gcGl4ZWwpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgKFhHZXRQaXhlbChpbWFnZSx4LHkpID09IHBpeGVsKSkKKworICAgIGlmICghVE9fRkxPT0QoeCx5KSkgcmV0dXJuOworCisgICAgICAvKiBGaW5kIGxlZnQgYW5kIHJpZ2h0IGJvdW5kYXJpZXMgKi8KKworICAgIGxlZnQgPSByaWdodCA9IHg7CisgICAgd2hpbGUgKChsZWZ0ID4gMCkgJiYgVE9fRkxPT0QoIGxlZnQtMSwgeSApKSBsZWZ0LS07CisgICAgd2hpbGUgKChyaWdodCA8IGltYWdlLT53aWR0aCkgJiYgVE9fRkxPT0QoIHJpZ2h0LCB5ICkpIHJpZ2h0Kys7CisgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCisgICAgICAgICAgICAgICAgICAgIHhPcmcgKyBsZWZ0LCB5T3JnICsgeSwgcmlnaHQtbGVmdCwgMSApOworCisgICAgICAvKiBTZXQgdGhlIHBpeGVscyBvZiB0aGlzIGxpbmUgc28gd2UgZG9uJ3QgZmlsbCBpdCBhZ2FpbiAqLworCisgICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspCisgICAgeworICAgICAgICBpZiAoZmlsbFR5cGUgPT0gRkxPT0RGSUxMQk9SREVSKSBYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LCBwaXhlbCApOworICAgICAgICBlbHNlIFhQdXRQaXhlbCggaW1hZ2UsIHgsIHksIH5waXhlbCApOworICAgIH0KKworICAgICAgLyogRmlsbCB0aGUgbGluZSBhYm92ZSAqLworCisgICAgaWYgKC0teSA+PSAwKQorICAgIHsKKyAgICAgICAgeCA9IGxlZnQ7CisgICAgICAgIHdoaWxlICh4IDwgcmlnaHQpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdoaWxlICgoeCA8IHJpZ2h0KSAmJiAhVE9fRkxPT0QoeCx5KSkgeCsrOworICAgICAgICAgICAgaWYgKHggPj0gcmlnaHQpIGJyZWFrOworICAgICAgICAgICAgd2hpbGUgKCh4IDwgcmlnaHQpICYmIFRPX0ZMT09EKHgseSkpIHgrKzsKKyAgICAgICAgICAgIFgxMURSVl9JbnRlcm5hbEZsb29kRmlsbChpbWFnZSwgZGMsIHgtMSwgeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4T3JnLCB5T3JnLCBwaXhlbCwgZmlsbFR5cGUgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgICAgLyogRmlsbCB0aGUgbGluZSBiZWxvdyAqLworCisgICAgaWYgKCh5ICs9IDIpIDwgaW1hZ2UtPmhlaWdodCkKKyAgICB7CisgICAgICAgIHggPSBsZWZ0OworICAgICAgICB3aGlsZSAoeCA8IHJpZ2h0KQorICAgICAgICB7CisgICAgICAgICAgICB3aGlsZSAoKHggPCByaWdodCkgJiYgIVRPX0ZMT09EKHgseSkpIHgrKzsKKyAgICAgICAgICAgIGlmICh4ID49IHJpZ2h0KSBicmVhazsKKyAgICAgICAgICAgIHdoaWxlICgoeCA8IHJpZ2h0KSAmJiBUT19GTE9PRCh4LHkpKSB4Kys7CisgICAgICAgICAgICBYMTFEUlZfSW50ZXJuYWxGbG9vZEZpbGwoaW1hZ2UsIGRjLCB4LTEsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeE9yZywgeU9yZywgcGl4ZWwsIGZpbGxUeXBlICk7CisgICAgICAgIH0KKyAgICB9CisjdW5kZWYgVE9fRkxPT0QgICAgCit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIFgxMURSVl9Eb0Zsb29kRmlsbAorICoKKyAqIE1haW4gZmxvb2QtZmlsbCByb3V0aW5lLgorICovCitzdGF0aWMgQk9PTDMyIFgxMURSVl9Eb0Zsb29kRmlsbCggREMgKmRjLCBSRUNUMzIgKnJlY3QsIElOVDMyIHgsIElOVDMyIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUlJFRiBjb2xvciwgVUlOVDMyIGZpbGxUeXBlICkKK3sKKyAgICBYSW1hZ2UgKmltYWdlOworCisgICAgaWYgKCEoaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+cmlnaHQgLSByZWN0LT5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LT5ib3R0b20gLSByZWN0LT50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbFBsYW5lcywgWlBpeG1hcCApKSkgcmV0dXJuIEZBTFNFOworCisgICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKKyAgICB7CisgICAgICAgICAgLyogUk9QIG1vZGUgaXMgYWx3YXlzIEdYY29weSBmb3IgZmxvb2QtZmlsbCAqLworICAgICAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOworICAgICAgICBYMTFEUlZfSW50ZXJuYWxGbG9vZEZpbGwoaW1hZ2UsIGRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWExQVE9EUChkYyx4KSAtIHJlY3QtPmxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZTFBUT0RQKGRjLHkpIC0gcmVjdC0+dG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmVjdC0+bGVmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHJlY3QtPnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1RvUGh5c2ljYWwoIGRjLCBjb2xvciApLCBmaWxsVHlwZSApOworICAgIH0KKworICAgIFhEZXN0cm95SW1hZ2UoIGltYWdlICk7CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIFgxMURSVl9FeHRGbG9vZEZpbGwKKyAqLworQk9PTDMyCitYMTFEUlZfRXh0Rmxvb2RGaWxsKCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIENPTE9SUkVGIGNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZpbGxUeXBlICkKK3sKKyAgICBSRUNUMzIgcmVjdDsKKyAgICBIREMzMgloZGMgPSBkYy0+aFNlbGY7IC8qIEZJWE1FICovCisKKyAgICBkcHJpbnRmX2dyYXBoaWNzKCBzdGRkZWIsICJYMTFEUlZfRXh0Rmxvb2RGaWxsICVkLCVkICUwNmx4ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOworCisgICAgaWYgKCFQdFZpc2libGUzMiggaGRjLCB4LCB5ICkpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoR2V0UmduQm94MzIoIGRjLT53LmhHQ0NsaXBSZ24sICZyZWN0ICkgPT0gRVJST1IpIHJldHVybiBGQUxTRTsKKworICAgIHJldHVybiBDYWxsVG8zMl9MYXJnZVN0YWNrKCAoaW50KCopKCkpWDExRFJWX0RvRmxvb2RGaWxsLCA2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYywgJnJlY3QsIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOworfQpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYyBiL2dyYXBoaWNzL3gxMWRydi9pbml0LmMKaW5kZXggNWNlYjczNi4uNzk5ZGVjOCAxMDA2NDQKLS0tIGEvZ3JhcGhpY3MveDExZHJ2L2luaXQuYworKysgYi9ncmFwaGljcy94MTFkcnYvaW5pdC5jCkBAIC0xNiw0MSArMTYsMzggQEAKIAogc3RhdGljIGNvbnN0IERDX0ZVTkNUSU9OUyBYMTFEUlZfRnVuY3MgPQogewotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBBcmMgKi8KKyAgICBYMTFEUlZfQXJjLCAgICAgICAgICAgICAgICAgICAgICAvKiBwQXJjICovCiAgICAgWDExRFJWX0JpdEJsdCwgICAgICAgICAgICAgICAgICAgLyogcEJpdEJsdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBDaG9yZCAqLworICAgIFgxMURSVl9DaG9yZCwgICAgICAgICAgICAgICAgICAgIC8qIHBDaG9yZCAqLwogICAgIFgxMURSVl9DcmVhdGVEQywgICAgICAgICAgICAgICAgIC8qIHBDcmVhdGVEQyAqLwogICAgIFgxMURSVl9EZWxldGVEQywgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVEQyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBEZWxldGVPYmplY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRWxsaXBzZSAqLworICAgIFgxMURSVl9FbGxpcHNlLCAgICAgICAgICAgICAgICAgIC8qIHBFbGxpcHNlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEVzY2FwZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBFeGNsdWRlQ2xpcFJlY3QgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXhjbHVkZVZpc1JlY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRmlsbFJnbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBGbG9vZEZpbGwgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwRnJhbWVSZ24gKi8KKyAgICBYMTFEUlZfRXh0Rmxvb2RGaWxsLCAgICAgICAgICAgICAvKiBwRXh0Rmxvb2RGaWxsICovCisgICAgWDExRFJWX0V4dFRleHRPdXQsICAgICAgICAgICAgICAgLyogcEV4dFRleHRPdXQgKi8KKyAgICBYMTFEUlZfR2V0UGl4ZWwsICAgICAgICAgICAgICAgICAvKiBwR2V0UGl4ZWwgKi8KICAgICBYMTFEUlZfR2V0VGV4dEV4dGVudFBvaW50LCAgICAgICAvKiBwR2V0VGV4dEV4dGVudFBvaW50ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEdldFRleHRNZXRyaWNzICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdENsaXBSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcEludGVyc2VjdFZpc1JlY3QgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwSW52ZXJ0UmduICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcExpbmVUbyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBNb3ZlVG9FeCAqLworICAgIFgxMURSVl9MaW5lVG8sICAgICAgICAgICAgICAgICAgIC8qIHBMaW5lVG8gKi8KKyAgICBYMTFEUlZfTW92ZVRvRXgsICAgICAgICAgICAgICAgICAvKiBwTW92ZVRvRXggKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwT2Zmc2V0Q2xpcFJnbiAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBPZmZzZXRWaWV3cG9ydE9yZyAob3B0aW9uYWwpICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcE9mZnNldFdpbmRvd09yZyAob3B0aW9uYWwpICovCi0gICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFBhaW50UmduICovCisgICAgWDExRFJWX1BhaW50UmduLCAgICAgICAgICAgICAgICAgLyogcFBhaW50UmduICovCiAgICAgWDExRFJWX1BhdEJsdCwgICAgICAgICAgICAgICAgICAgLyogcFBhdEJsdCAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQaWUgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUG9seVBvbHlnb24gKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwUG9seWdvbiAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBQb2x5bGluZSAqLworICAgIFgxMURSVl9QaWUsICAgICAgICAgICAgICAgICAgICAgIC8qIHBQaWUgKi8KKyAgICBYMTFEUlZfUG9seVBvbHlnb24sICAgICAgICAgICAgICAvKiBwUG9seVBvbHlnb24gKi8KKyAgICBYMTFEUlZfUG9seWdvbiwgICAgICAgICAgICAgICAgICAvKiBwUG9seWdvbiAqLworICAgIFgxMURSVl9Qb2x5bGluZSwgICAgICAgICAgICAgICAgIC8qIHBQb2x5bGluZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBSZWFsaXplUGFsZXR0ZSAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBSZWN0YW5nbGUgKi8KKyAgICBYMTFEUlZfUmVjdGFuZ2xlLCAgICAgICAgICAgICAgICAvKiBwUmVjdGFuZ2xlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFJlc3RvcmVEQyAqLwotICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBSb3VuZFJlY3QgKi8KKyAgICBYMTFEUlZfUm91bmRSZWN0LCAgICAgICAgICAgICAgICAvKiBwUm91bmRSZWN0ICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNhdmVEQyAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTY2FsZVZpZXdwb3J0RXh0IChvcHRpb25hbCkgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2NhbGVXaW5kb3dFeHQgKG9wdGlvbmFsKSAqLwpAQCAtNjMsNyArNjAsNyBAQAogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRESUJpdHNUb0RldmljZSAqLwogICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBTZXRNYXBNb2RlIChvcHRpb25hbCkgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0TWFwcGVyRmxhZ3MgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0UGl4ZWwgKi8KKyAgICBYMTFEUlZfU2V0UGl4ZWwsICAgICAgICAgICAgICAgICAvKiBwU2V0UGl4ZWwgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0UG9seUZpbGxNb2RlICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFJPUDIgKi8KICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU2V0UmVsQWJzICovCkBAIC03Nyw4ICs3NCw3IEBACiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd0V4dCAob3B0aW9uYWwpICovCiAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFNldFdpbmRvd09yZyAob3B0aW9uYWwpICovCiAgICAgWDExRFJWX1N0cmV0Y2hCbHQsICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hCbHQgKi8KLSAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwU3RyZXRjaERJQml0cyAqLwotICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBUZXh0T3V0ICovCisgICAgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcFN0cmV0Y2hESUJpdHMgKi8KIH07CiAKIHN0YXRpYyBEZXZpY2VDYXBzIFgxMURSVl9EZXZDYXBzOwpkaWZmIC0tZ2l0IGEvZ3JhcGhpY3MveDExZHJ2L3RleHQuYyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMjU4NwotLS0gL2Rldi9udWxsCisrKyBiL2dyYXBoaWNzL3gxMWRydi90ZXh0LmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBYMTEgZ3JhcGhpY3MgZHJpdmVyIHRleHQgZnVuY3Rpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTMsMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8WDExL1hsaWIuaD4KKyNpbmNsdWRlIDxYMTEvWGF0b20uaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZGMuaCIKKyNpbmNsdWRlICJnZGkuaCIKKy8qI2luY2x1ZGUgImNhbGxiYWNrLmgiKi8KKyNpbmNsdWRlICJoZWFwLmgiCisjaW5jbHVkZSAieDExZHJ2LmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKy8qICNkZWZpbmUgREVCVUdfVEVYVCAqLworI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorCisjZGVmaW5lIFNXQVBfSU5UKGEsYikgIHsgaW50IHQgPSBhOyBhID0gYjsgYiA9IHQ7IH0KKworCitleHRlcm4gaW50IENMSVBQSU5HX0ludGVyc2VjdENsaXBSZWN0KCBEQyAqIGRjLCBzaG9ydCBsZWZ0LCBzaG9ydCB0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tLCBVSU5UMTYgZmxhZ3MpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBYMTFEUlZfRXh0VGV4dE91dAorICovCitCT09MMzIKK1gxMURSVl9FeHRUZXh0T3V0KCBEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIFVJTlQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUMzIgKmxwcmVjdCwgTFBDU1RSIHN0ciwgVUlOVDMyIGNvdW50LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscER4ICkKK3sKKyAgICBIUkdOMzIJaFJnbkNsaXAgPSAwOworICAgIGludCAJZGlyLCBhc2NlbnQsIGRlc2NlbnQsIGk7CisgICAgWENoYXJTdHJ1Y3QgaW5mbzsKKyAgICBYRm9udFN0cnVjdCAqZm9udDsKKyAgICBSRUNUMzIgCXJlY3Q7CisKKyAgICBpZiAoIURDX1NldHVwR0NGb3JUZXh0KCBkYyApKSByZXR1cm4gVFJVRTsKKyAgICBmb250ID0gZGMtPnUueC5mb250LmZzdHJ1Y3Q7CisKKyAgICBkcHJpbnRmX3RleHQoc3RkZGViLCJFeHRUZXh0T3V0OiBoZGM9JTA0eCAlZCwlZCAnJSouKnMnLCAlZCAgZmxhZ3M9JWRcbiIsCisgICAgICAgICAgICAgICAgIGRjLT5oU2VsZiwgeCwgeSwgY291bnQsIGNvdW50LCBzdHIsIGNvdW50LCBmbGFncyk7CisgICAgaWYgKGxwcmVjdCAhPSBOVUxMKSBkcHJpbnRmX3RleHQoc3RkZGViLCAiXHRyZWN0PSglZCwlZC0gJWQsJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+bGVmdCwgbHByZWN0LT50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHByZWN0LT5yaWdodCwgbHByZWN0LT5ib3R0b20gKTsKKworICAgICAgLyogU2V0dXAgY29vcmRpbmF0ZXMgKi8KKworICAgIGlmIChkYy0+dy50ZXh0QWxpZ24gJiBUQV9VUERBVEVDUCkKKyAgICB7CisJeCA9IGRjLT53LkN1cnNQb3NYOworCXkgPSBkYy0+dy5DdXJzUG9zWTsKKyAgICB9CisKKyAgICBpZiAoZmxhZ3MgJiAoRVRPX09QQVFVRSB8IEVUT19DTElQUEVEKSkgIC8qIHRoZXJlJ3MgYSByZWN0YW5nbGUgKi8KKyAgICB7CisgICAgICAgIGlmICghbHByZWN0KSAgLyogbm90IGFsd2F5cyAqLworICAgICAgICB7CisgICAgICAgICAgICBTSVpFMzIgc3o7CisgICAgICAgICAgICBpZiAoZmxhZ3MgJiBFVE9fQ0xJUFBFRCkgIC8qIENhbid0IGNsaXAgd2l0aCBubyByZWN0YW5nbGUgKi8KKwkgICAgICByZXR1cm4gRkFMU0U7CisJICAgIGlmICghWDExRFJWX0dldFRleHRFeHRlbnRQb2ludCggZGMsIHN0ciwgY291bnQsICZzeiApKQorCSAgICAgIHJldHVybiBGQUxTRTsKKwkgICAgcmVjdC5sZWZ0ICAgPSBYTFBUT0RQKCBkYywgeCApOworCSAgICByZWN0LnJpZ2h0ICA9IFhMUFRPRFAoIGRjLCB4K3N6LmN4ICk7CisJICAgIHJlY3QudG9wICAgID0gWUxQVE9EUCggZGMsIHkgKTsKKwkgICAgcmVjdC5ib3R0b20gPSBZTFBUT0RQKCBkYywgeStzei5jeSApOworCX0KKwllbHNlCisJeworCSAgICByZWN0LmxlZnQgICA9IFhMUFRPRFAoIGRjLCBscHJlY3QtPmxlZnQgKTsKKwkgICAgcmVjdC5yaWdodCAgPSBYTFBUT0RQKCBkYywgbHByZWN0LT5yaWdodCApOworCSAgICByZWN0LnRvcCAgICA9IFlMUFRPRFAoIGRjLCBscHJlY3QtPnRvcCApOworCSAgICByZWN0LmJvdHRvbSA9IFlMUFRPRFAoIGRjLCBscHJlY3QtPmJvdHRvbSApOworCX0KKwlpZiAocmVjdC5yaWdodCA8IHJlY3QubGVmdCkgU1dBUF9JTlQoIHJlY3QubGVmdCwgcmVjdC5yaWdodCApOworCWlmIChyZWN0LmJvdHRvbSA8IHJlY3QudG9wKSBTV0FQX0lOVCggcmVjdC50b3AsIHJlY3QuYm90dG9tICk7CisgICAgfQorCisgICAgeCA9IFhMUFRPRFAoIGRjLCB4ICk7CisgICAgeSA9IFlMUFRPRFAoIGRjLCB5ICk7CisKKyAgICBkcHJpbnRmX3RleHQoc3RkZGViLCJcdHJlYWwgY29vcmQ6IHg9JWksIHk9JWksIHJlY3Q9KCVkLCVkLSVkLCVkKVxuIiwKKwkJCSAgeCwgeSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOworCisgICAgICAvKiBEcmF3IHRoZSByZWN0YW5nbGUgKi8KKworICAgIGlmIChmbGFncyAmIEVUT19PUEFRVUUpCisgICAgeworICAgICAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuYmFja2dyb3VuZFBpeGVsICk7CisgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmVjdC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyByZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LCByZWN0LmJvdHRvbS1yZWN0LnRvcCApOworICAgIH0KKyAgICBpZiAoIWNvdW50KSByZXR1cm4gVFJVRTsgIC8qIE5vdGhpbmcgbW9yZSB0byBkbyAqLworCisgICAgICAvKiBDb21wdXRlIHRleHQgc3RhcnRpbmcgcG9zaXRpb24gKi8KKworICAgIFhUZXh0RXh0ZW50cyggZm9udCwgc3RyLCBjb3VudCwgJmRpciwgJmFzY2VudCwgJmRlc2NlbnQsICZpbmZvICk7CisKKyAgICBpZiAobHBEeCkgLyogaGF2ZSBleHBsaWNpdCBjaGFyYWN0ZXIgY2VsbCB4IG9mZnNldHMgKi8KKyAgICB7CisJLyogc3VtIGxwRHggYXJyYXkgYW5kIGFkZCB0aGUgd2lkdGggb2YgbGFzdCBjaGFyYWN0ZXIgKi8KKworICAgICAgICBpbmZvLndpZHRoID0gWFRleHRXaWR0aCggZm9udCwgc3RyICsgY291bnQgLSAxLCAxKSArIGRjLT53LmNoYXJFeHRyYTsKKyAgICAgICAgaWYgKHN0cltjb3VudC0xXSA9PSAoY2hhcilkYy0+dS54LmZvbnQubWV0cmljcy50bUJyZWFrQ2hhcikKKyAgICAgICAgICAgIGluZm8ud2lkdGggKz0gZGMtPncuYnJlYWtFeHRyYTsKKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaW5mby53aWR0aCArPSBscER4W2ldOworICAgIH0KKyAgICBlbHNlCisgICAgICAgaW5mby53aWR0aCArPSBjb3VudCpkYy0+dy5jaGFyRXh0cmEgKyBkYy0+dy5icmVha0V4dHJhKmRjLT53LmJyZWFrQ291bnQ7CisKKyAgICBzd2l0Y2goIGRjLT53LnRleHRBbGlnbiAmIChUQV9MRUZUIHwgVEFfUklHSFQgfCBUQV9DRU5URVIpICkKKyAgICB7CisgICAgICBjYXNlIFRBX0xFRlQ6CisgCSAgaWYgKGRjLT53LnRleHRBbGlnbiAmIFRBX1VQREFURUNQKQorCSAgICAgIGRjLT53LkN1cnNQb3NYID0gWERQVE9MUCggZGMsIHggKyBpbmZvLndpZHRoICk7CisJICBicmVhazsKKyAgICAgIGNhc2UgVEFfUklHSFQ6CisJICB4IC09IGluZm8ud2lkdGg7CisJICBpZiAoZGMtPncudGV4dEFsaWduICYgVEFfVVBEQVRFQ1ApIGRjLT53LkN1cnNQb3NYID0gWERQVE9MUCggZGMsIHggKTsKKwkgIGJyZWFrOworICAgICAgY2FzZSBUQV9DRU5URVI6CisJICB4IC09IGluZm8ud2lkdGggLyAyOworCSAgYnJlYWs7CisgICAgfQorCisgICAgc3dpdGNoKCBkYy0+dy50ZXh0QWxpZ24gJiAoVEFfVE9QIHwgVEFfQk9UVE9NIHwgVEFfQkFTRUxJTkUpICkKKyAgICB7CisgICAgICBjYXNlIFRBX1RPUDoKKwkgIHkgKz0gZm9udC0+YXNjZW50OworCSAgYnJlYWs7CisgICAgICBjYXNlIFRBX0JPVFRPTToKKwkgIHkgLT0gZm9udC0+ZGVzY2VudDsKKwkgIGJyZWFrOworICAgICAgY2FzZSBUQV9CQVNFTElORToKKwkgIGJyZWFrOworICAgIH0KKworICAgICAgLyogU2V0IHRoZSBjbGlwIHJlZ2lvbiAqLworCisgICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpCisgICAgeworICAgICAgICBoUmduQ2xpcCA9IGRjLT53LmhDbGlwUmduOworICAgICAgICBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSwgQ0xJUF9JTlRFUlNFQ1R8Q0xJUF9LRUVQUkdOICk7CisgICAgfQorCisgICAgICAvKiBEcmF3IHRoZSB0ZXh0IGJhY2tncm91bmQgaWYgbmVjZXNzYXJ5ICovCisKKyAgICBpZiAoZGMtPncuYmFja2dyb3VuZE1vZGUgIT0gVFJBTlNQQVJFTlQpCisgICAgeworICAgICAgICAgIC8qIElmIHJlY3RhbmdsZSBpcyBvcGFxdWUgYW5kIGNsaXBwZWQsIGRvIG5vdGhpbmcgKi8KKyAgICAgICAgaWYgKCEoZmxhZ3MgJiBFVE9fQ0xJUFBFRCkgfHwgIShmbGFncyAmIEVUT19PUEFRVUUpKQorICAgICAgICB7CisgICAgICAgICAgICAgIC8qIE9ubHkgZHJhdyBpZiByZWN0YW5nbGUgaXMgbm90IG9wYXF1ZSBvciBpZiBzb21lICovCisgICAgICAgICAgICAgIC8qIHRleHQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlICovCisgICAgICAgICAgICBpZiAoIShmbGFncyAmIEVUT19PUEFRVUUpIHx8CisgICAgICAgICAgICAgICAgKHggPCByZWN0LmxlZnQpIHx8CisgICAgICAgICAgICAgICAgKHggKyBpbmZvLndpZHRoID49IHJlY3QucmlnaHQpIHx8CisgICAgICAgICAgICAgICAgKHktZm9udC0+YXNjZW50IDwgcmVjdC50b3ApIHx8CisgICAgICAgICAgICAgICAgKHkrZm9udC0+ZGVzY2VudCA+PSByZWN0LmJvdHRvbSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOworICAgICAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB5IC0gZm9udC0+YXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5hc2NlbnQgKyBmb250LT5kZXNjZW50ICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgCisgICAgLyogRHJhdyB0aGUgdGV4dCAoY291bnQgPiAwIHZlcmlmaWVkKSAqLworCisgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOworICAgIGlmICghZGMtPncuY2hhckV4dHJhICYmICFkYy0+dy5icmVha0V4dHJhICYmICFscER4KQorICAgIHsKKyAgICAgICAgWERyYXdTdHJpbmcoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAorICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSwgc3RyLCBjb3VudCApOworICAgIH0KKyAgICBlbHNlICAvKiBOb3cgdGhlIGZ1biBiZWdpbnMuLi4gKi8KKyAgICB7CisgICAgICAgIFhUZXh0SXRlbSAqaXRlbXMsICpwaXRlbTsKKwlpbnQgZGVsdGE7CisKKwkvKiBhbGxvY2F0ZSBtYXggaXRlbXMgKi8KKworICAgICAgICBwaXRlbSA9IGl0ZW1zID0geG1hbGxvYyggY291bnQgKiBzaXplb2YoWFRleHRJdGVtKSApOworICAgICAgICBkZWx0YSA9IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGNvdW50KQorICAgICAgICB7CisJICAgIC8qIGluaXRpYWxpemUgdGV4dCBpdGVtIHdpdGggYWNjdW11bGF0ZWQgZGVsdGEgKi8KKworICAgICAgICAgICAgcGl0ZW0tPmNoYXJzICA9IChjaGFyICopc3RyICsgaTsKKwkgICAgcGl0ZW0tPmRlbHRhICA9IGRlbHRhOyAKKyAgICAgICAgICAgIHBpdGVtLT5uY2hhcnMgPSAwOworICAgICAgICAgICAgcGl0ZW0tPmZvbnQgICA9IE5vbmU7CisgICAgICAgICAgICBkZWx0YSA9IDA7CisKKwkgICAgLyogc3R1ZmYgY2hhcmFjdGVycyBpbnRvIHRoZSBzYW1lIFhUZXh0SXRlbSB1bnRpbCBuZXcgZGVsdGEgCisJICAgICAqIGJlY29tZXMgIG5vbi16ZXJvICovCisKKwkgICAgZG8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAobHBEeCkgZGVsdGEgKz0gbHBEeFtpXSAtIFhUZXh0V2lkdGgoIGZvbnQsIHN0ciArIGksIDEpOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IGRjLT53LmNoYXJFeHRyYTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PSAoY2hhcilkYy0+dS54LmZvbnQubWV0cmljcy50bUJyZWFrQ2hhcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IGRjLT53LmJyZWFrRXh0cmE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBpdGVtLT5uY2hhcnMrKzsKKyAgICAgICAgICAgIH0gCisJICAgIHdoaWxlICgoKytpIDwgY291bnQpICYmICFkZWx0YSk7CisgICAgICAgICAgICBwaXRlbSsrOworICAgICAgICB9CisKKyAgICAgICAgWERyYXdUZXh0KCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHgsIGRjLT53LkRDT3JnWSArIHksIGl0ZW1zLCBwaXRlbSAtIGl0ZW1zICk7CisgICAgICAgIGZyZWUoIGl0ZW1zICk7CisgICAgfQorCisgICAgICAvKiBEcmF3IHVuZGVybGluZSBhbmQgc3RyaWtlLW91dCBpZiBuZWVkZWQgKi8KKworICAgIGlmIChkYy0+dS54LmZvbnQubWV0cmljcy50bVVuZGVybGluZWQpCisgICAgeworCWxvbmcgbGluZVBvcywgbGluZVdpZHRoOyAgICAgICAKKwlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9QT1NJVElPTiwgJmxpbmVQb3MgKSkKKwkgICAgbGluZVBvcyA9IGZvbnQtPmRlc2NlbnQtMTsKKwlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9USElDS05FU1MsICZsaW5lV2lkdGggKSkKKwkgICAgbGluZVdpZHRoID0gMDsKKwllbHNlIGlmIChsaW5lV2lkdGggPT0gMSkgbGluZVdpZHRoID0gMDsKKwlYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVXaWR0aCwKKwkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCisgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKKwkJICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSArIGxpbmVQb3MsCisJCSAgIGRjLT53LkRDT3JnWCArIHggKyBpbmZvLndpZHRoLCBkYy0+dy5EQ09yZ1kgKyB5ICsgbGluZVBvcyApOworICAgIH0KKyAgICBpZiAoZGMtPnUueC5mb250Lm1ldHJpY3MudG1TdHJ1Y2tPdXQpCisgICAgeworCWxvbmcgbGluZUFzY2VudCwgbGluZURlc2NlbnQ7CisJaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfQVNDRU5ULCAmbGluZUFzY2VudCApKQorCSAgICBsaW5lQXNjZW50ID0gZm9udC0+YXNjZW50IC8gMzsKKwlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1NUUklLRU9VVF9ERVNDRU5ULCAmbGluZURlc2NlbnQgKSkKKwkgICAgbGluZURlc2NlbnQgPSAtbGluZUFzY2VudDsKKwlYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVBc2NlbnQgKyBsaW5lRGVzY2VudCwKKwkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCisJWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAorCQkgICBkYy0+dy5EQ09yZ1ggKyB4LCBkYy0+dy5EQ09yZ1kgKyB5IC0gbGluZUFzY2VudCwKKwkJICAgZGMtPncuRENPcmdYICsgeCArIGluZm8ud2lkdGgsIGRjLT53LkRDT3JnWSArIHkgLSBsaW5lQXNjZW50ICk7CisgICAgfQorCisgICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpIFNlbGVjdENsaXBSZ24zMiggZGMtPmhTZWxmLCBoUmduQ2xpcCApOworICAgIHJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IDExMjIyZTAuLmU1ZGUyMzEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTgxLDkgKzgxLDYgQEAKIAogJChTUEVDX0ZJTEVTKTogJChCVUlMRCkKIAotJChCVUlMRCkgY2hlY2tidWlsZDoKLQljZCAkKFRPUE9CSkRJUikvdG9vbHM7ICQoU1VCTUFLRSkgYnVpbGQKLQogY2FsbGZyb20xNi5zOiAkKFNQRUNfRklMRVMpCiAJJChCVUlMRCkgLW8gJEAgLWNhbGxmcm9tMTYgYGNhdCAkKFNQRUNfRklMRVMpIHwgZ3JlcCBDYWxsRnJvbTE2XyB8IHNlZCAncy8uKkNhbGxGcm9tMTZfXCguKlwpL1wxLycgfCBzb3J0IHwgdW5pcWAKIApkaWZmIC0tZ2l0IGEvaWYxNjMyL2FkdmFwaTMyLnNwZWMgYi9pZjE2MzIvYWR2YXBpMzIuc3BlYwppbmRleCA5Y2UyZjA4Li4xYjVjYzdkIDEwMDY0NAotLS0gYS9pZjE2MzIvYWR2YXBpMzIuc3BlYworKysgYi9pZjE2MzIvYWR2YXBpMzIuc3BlYwpAQCAtMTk4LDcgKzE5OCw3IEBACiAwMTkzIHN0dWIgU2V0VGhyZWFkVG9rZW4KIDAxOTQgc3R1YiBTZXRUb2tlbkluZm9ybWF0aW9uCiAwMTk1IHN0dWIgU3RhcnRTZXJ2aWNlQQotMDE5NiBzdHViIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQQotMDE5NyBzdHViIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyVworMDE5NiBzdGRjYWxsIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyQShwdHIpIFN0YXJ0U2VydmljZUN0cmxEaXNwYXRjaGVyMzJBCiswMTk3IHN0ZGNhbGwgU3RhcnRTZXJ2aWNlQ3RybERpc3BhdGNoZXJXKHB0cikgU3RhcnRTZXJ2aWNlQ3RybERpc3BhdGNoZXIzMlcKIDAxOTggc3R1YiBTdGFydFNlcnZpY2VXCiAwMTk5IHN0dWIgVW5sb2NrU2VydmljZURhdGFiYXNlCmRpZmYgLS1naXQgYS9pZjE2MzIvY3J0ZGxsLnNwZWMgYi9pZjE2MzIvY3J0ZGxsLnNwZWMKaW5kZXggNzI4ZWE0MS4uYTdjNmY4OCAxMDA2NDQKLS0tIGEvaWYxNjMyL2NydGRsbC5zcGVjCisrKyBiL2lmMTYzMi9jcnRkbGwuc3BlYwpAQCAtMyw5ICszLDkgQEAKIHR5cGUJd2luMzIKIGJhc2UJMQogCi0wMDEgY2RlY2wgPz8yQFlBUEFYSUBaKGxvbmcpIENSVERMTF9tYWxsb2MKLTAwMiBjZGVjbCA/PzNAWUFYUEFYQFoobG9uZykgQ1JURExMX2ZyZWUKLTAwMyBzdHViID9fc2V0X25ld19oYW5kbGVyQEBZQVA2QUhJQFpQNkFISUBaQFoKKzAwMSBjZGVjbCA/PzJAWUFQQVhJQFoobG9uZykgQ1JURExMX25ldworMDAyIGNkZWNsID8/M0BZQVhQQVhAWihsb25nKSBDUlRETExfZGVsZXRlCiswMDMgY2RlY2wgP19zZXRfbmV3X2hhbmRsZXJAQFlBUDZBSElAWlA2QUhJQFpAWihwdHIpIENSVERMTF9zZXRfbmV3X2hhbmRsZXIKIDAwNCBzdHViIF9DSWFjb3MKIDAwNSBzdHViIF9DSWFzaW4KIDAwNiBzdHViIF9DSWF0YW4KZGlmZiAtLWdpdCBhL2lmMTYzMi9nZGkzMi5zcGVjIGIvaWYxNjMyL2dkaTMyLnNwZWMKaW5kZXggMDhmOTBlNi4uY2M4ZjI1ZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2dkaTMyLnNwZWMKKysrIGIvaWYxNjMyL2dkaTMyLnNwZWMKQEAgLTYxLDggKzYxLDggQEAKIDAwNTQgc3RkY2FsbCBDcmVhdGVQYXR0ZXJuQnJ1c2gobG9uZykgQ3JlYXRlUGF0dGVybkJydXNoMzIKIDAwNTUgc3RkY2FsbCBDcmVhdGVQZW4obG9uZyBsb25nIGxvbmcpIENyZWF0ZVBlbjMyCiAwMDU2IHN0ZGNhbGwgQ3JlYXRlUGVuSW5kaXJlY3QocHRyKSBDcmVhdGVQZW5JbmRpcmVjdDMyCi0wMDU3IHN0dWIgQ3JlYXRlUG9seVBvbHlnb25SZ24KLTAwNTggc3R1YiBDcmVhdGVQb2x5Z29uUmduCiswMDU3IHN0ZGNhbGwgQ3JlYXRlUG9seVBvbHlnb25SZ24ocHRyIHB0ciBsb25nIGxvbmcpIENyZWF0ZVBvbHlQb2x5Z29uUmduMzIKKzAwNTggc3RkY2FsbCBDcmVhdGVQb2x5Z29uUmduKHB0ciBsb25nIGxvbmcpIENyZWF0ZVBvbHlnb25SZ24zMgogMDA1OSBzdGRjYWxsIENyZWF0ZVJlY3RSZ24obG9uZyBsb25nIGxvbmcgbG9uZykgQ3JlYXRlUmVjdFJnbjMyCiAwMDYwIHN0ZGNhbGwgQ3JlYXRlUmVjdFJnbkluZGlyZWN0KHB0cikgQ3JlYXRlUmVjdFJnbkluZGlyZWN0MzIKIDAwNjEgc3RkY2FsbCBDcmVhdGVSb3VuZFJlY3RSZ24obG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcpCkBAIC0yNzYsNyArMjc2LDcgQEAKIDAyNjggc3R1YiBQb2x5QmV6aWVyCiAwMjY5IHN0dWIgUG9seUJlemllclRvCiAwMjcwIHN0dWIgUG9seURyYXcKLTAyNzEgc3R1YiBQb2x5UG9seWdvbgorMDI3MSBzdGRjYWxsIFBvbHlQb2x5Z29uKGxvbmcgcHRyIHB0ciBsb25nKSBQb2x5UG9seWdvbjMyCiAwMjcyIHN0dWIgUG9seVBvbHlsaW5lCiAwMjczIHN0dWIgUG9seVRleHRPdXRBCiAwMjc0IHN0dWIgUG9seVRleHRPdXRXCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggODg0NTZmZC4uZjM4YjE5MCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMjA0LDcgKzIwNCw3IEBACiAyMDQgc3R1YiBTd2FwUmVjb3JkaW5nCiAyMDUgc3R1YiBDVldCcmVhawogMjA2IHBhc2NhbDE2IEFsbG9jU2VsZWN0b3JBcnJheSh3b3JkKSBBbGxvY1NlbGVjdG9yQXJyYXkKLTIwNyByZXR1cm4gSXNEQkNTTGVhZEJ5dGUgMiAwCisyMDcgcGFzY2FsMTYgSXNEQkNTTGVhZEJ5dGUod29yZCkgSXNEQkNTTGVhZEJ5dGUxNgogMjE2IHBhc2NhbCAgIFJlZ0VudW1LZXkobG9uZyBsb25nIHB0ciBsb25nKSBSZWdFbnVtS2V5MTYKIDIxNyBwYXNjYWwgICBSZWdPcGVuS2V5KGxvbmcgcHRyIHB0cikgUmVnT3BlbktleTE2CiAyMTggcGFzY2FsICAgUmVnQ3JlYXRlS2V5KGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5MTYKZGlmZiAtLWdpdCBhL2lmMTYzMi9rZXJuZWwzMi5zcGVjIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKaW5kZXggOWZiZDM2Ny4uYTlkY2JhNCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMKKysrIGIvaWYxNjMyL2tlcm5lbDMyLnNwZWMKQEAgLTM5LDcgKzM5LDcgQEAKIDAwMzQgc3R1YiBDb250aW51ZURlYnVnRXZlbnQKIDAwMzUgc3R1YiBDb252ZXJ0RGVmYXVsdExvY2FsZQogMDAzNiBzdGRjYWxsIENvcHlGaWxlQShwdHIgcHRyIGxvbmcpIENvcHlGaWxlMzJBCi0wMDM3IHN0dWIgQ29weUZpbGVXCiswMDM3IHN0ZGNhbGwgQ29weUZpbGVXKHB0ciBwdHIgbG9uZykgQ29weUZpbGUzMlcKIDAwMzggc3R1YiBDcmVhdGVDb25zb2xlU2NyZWVuQnVmZmVyCiAwMDM5IHN0ZGNhbGwgQ3JlYXRlRGlyZWN0b3J5QShwdHIgcHRyKSBDcmVhdGVEaXJlY3RvcnkzMkEKIDAwNDAgc3RkY2FsbCBDcmVhdGVEaXJlY3RvcnlFeEEocHRyIHB0ciBwdHIpIENyZWF0ZURpcmVjdG9yeUV4MzJBCkBAIC0xNDMsOCArMTQzLDggQEAKIDAxMzggc3RkY2FsbCBGb3JtYXRNZXNzYWdlQSgpIFdJTjMyX0Zvcm1hdE1lc3NhZ2UzMkEKIDAxMzkgc3RkY2FsbCBGb3JtYXRNZXNzYWdlVygpIFdJTjMyX0Zvcm1hdE1lc3NhZ2UzMlcKIDAxNDAgc3R1YiBGcmVlQ29uc29sZQotMDE0MSBzdGRjYWxsIEZyZWVFbnZpcm9ubWVudFN0cmluZ3NBKHB0cikJRnJlZUVudmlyb25tZW50U3RyaW5nc0EKLTAxNDIgc3RkY2FsbCBGcmVlRW52aXJvbm1lbnRTdHJpbmdzVyhwdHIpCUZyZWVFbnZpcm9ubWVudFN0cmluZ3NXCiswMTQxIHN0ZGNhbGwgRnJlZUVudmlyb25tZW50U3RyaW5nc0EocHRyKSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJBCiswMTQyIHN0ZGNhbGwgRnJlZUVudmlyb25tZW50U3RyaW5nc1cocHRyKSBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXCiAwMTQzIHN0ZGNhbGwgRnJlZUxpYnJhcnkobG9uZykgRnJlZUxpYnJhcnkzMgogMDE0NCBzdHViIEZyZWVMaWJyYXJ5QW5kRXhpdFRocmVhZAogMDE0NSBzdGRjYWxsIEZyZWVSZXNvdXJjZShsb25nKSBGcmVlUmVzb3VyY2UzMgpAQCAtMjEyLDkgKzIxMiw5IEBACiAwMjA3IAlzdGRjYWxsIEdldERpc2tGcmVlU3BhY2VXKHB0ciBwdHIgcHRyIHB0ciBwdHIpIEdldERpc2tGcmVlU3BhY2UzMlcKIDAyMDggc3RkY2FsbCBHZXREcml2ZVR5cGVBKHB0cikgR2V0RHJpdmVUeXBlMzJBCiAwMjA5IHN0ZGNhbGwgR2V0RHJpdmVUeXBlVyhwdHIpIEdldERyaXZlVHlwZTMyVwotMDIxMAlzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5ncygpCUdldEVudmlyb25tZW50U3RyaW5ncwotMDIxMSBzdHViIEdldEVudmlyb25tZW50U3RyaW5nc0EKLTAyMTIgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFN0cmluZ3NXKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzVworMDIxMCBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5ncygpIEdldEVudmlyb25tZW50U3RyaW5nczMyQQorMDIxMSBzdGRjYWxsIEdldEVudmlyb25tZW50U3RyaW5nc0EoKSBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMkEKKzAyMTIgc3RkY2FsbCBHZXRFbnZpcm9ubWVudFN0cmluZ3NXKCkgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXCiAwMjEzIHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRWYXJpYWJsZUEocHRyIHB0ciBsb25nKSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBCiAwMjE0IHN0ZGNhbGwgR2V0RW52aXJvbm1lbnRWYXJpYWJsZVcocHRyIHB0ciBsb25nKSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXCiAwMjE1IHN0dWIgR2V0RXhpdENvZGVQcm9jZXNzCkBAIC0yNTIsNyArMjUyLDcgQEAKIDAyNDcgc3R1YiBHZXROdW1iZXJPZkNvbnNvbGVNb3VzZUJ1dHRvbnMKIDAyNDggICAgc3RkY2FsbCBHZXRPRU1DUCgpIEdldE9FTUNQCiAwMjQ5IHN0dWIgR2V0T3ZlcmxhcHBlZFJlc3VsdAotMDI1MCBzdHViIEdldFByaW9yaXR5Q2xhc3MKKzAyNTAgc3RkY2FsbCBHZXRQcmlvcml0eUNsYXNzKGxvbmcpIEdldFByaW9yaXR5Q2xhc3MKIDAyNTEgc3RkY2FsbCBHZXRQcml2YXRlUHJvZmlsZUludEEocHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVJbnQzMkEKIDAyNTIgc3RkY2FsbCBHZXRQcml2YXRlUHJvZmlsZUludFcocHRyIHB0ciBsb25nIHB0cikgR2V0UHJpdmF0ZVByb2ZpbGVJbnQzMlcKIDAyNTMgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BCkBAIC0yOTYsOSArMjk2LDkgQEAKIDAyOTEgc3RkY2FsbCBHZXRUZW1wRmlsZU5hbWVXKHB0ciBwdHIgbG9uZyBwdHIpIEdldFRlbXBGaWxlTmFtZTMyVwogMDI5MiBzdGRjYWxsIEdldFRlbXBQYXRoQShsb25nIHB0cikgR2V0VGVtcFBhdGgzMkEKIDAyOTMgc3RkY2FsbCBHZXRUZW1wUGF0aFcobG9uZyBwdHIpIEdldFRlbXBQYXRoMzJXCi0wMjk0CXN0ZGNhbGwgR2V0VGhyZWFkQ29udGV4dChsb25nIHB0cikJR2V0VGhyZWFkQ29udGV4dAotMDI5NSBzdHViIEdldFRocmVhZExvY2FsZQotMDI5NiBzdHViIEdldFRocmVhZFByaW9yaXR5CiswMjk0IHN0ZGNhbGwgR2V0VGhyZWFkQ29udGV4dChsb25nIHB0cikgR2V0VGhyZWFkQ29udGV4dAorMDI5NSBzdGRjYWxsIEdldFRocmVhZExvY2FsZSgpIEdldFRocmVhZExvY2FsZQorMDI5NiBzdGRjYWxsIEdldFRocmVhZFByaW9yaXR5KGxvbmcpIEdldFRocmVhZFByaW9yaXR5CiAwMjk3IHN0dWIgR2V0VGhyZWFkU2VsZWN0b3JFbnRyeQogMDI5OCBzdHViIEdldFRocmVhZFRpbWVzCiAwMjk5IHN0ZGNhbGwgR2V0VGlja0NvdW50KCkgR2V0VGlja0NvdW50CkBAIC0zNjAsOCArMzYwLDggQEAKIDAzNTUgc3R1YiBJc0JhZFN0cmluZ1B0ckEKIDAzNTYgc3R1YiBJc0JhZFN0cmluZ1B0clcKIDAzNTcgc3RkY2FsbCBJc0JhZFdyaXRlUHRyKHB0ciBsb25nKQlXSU4zMl9Jc0JhZFdyaXRlUHRyCi0wMzU4IHJldHVybiBJc0RCQ1NMZWFkQnl0ZSA0IDAKLTAzNTkgc3R1YiBJc0RCQ1NMZWFkQnl0ZUV4CiswMzU4IHN0ZGNhbGwgSXNEQkNTTGVhZEJ5dGUobG9uZykgSXNEQkNTTGVhZEJ5dGUzMgorMDM1OSBzdGRjYWxsIElzREJDU0xlYWRCeXRlRXgobG9uZyBsb25nKSBJc0RCQ1NMZWFkQnl0ZUV4CiAwMzYwIHN0dWIgSXNWYWxpZENvZGVQYWdlCiAwMzYxIHN0ZGNhbGwgSXNWYWxpZExvY2FsZShsb25nIGxvbmcpIElzVmFsaWRMb2NhbGUKIDAzNjIgc3R1YiBMQ01hcFN0cmluZ0EKQEAgLTQxNSw4ICs0MTUsOCBAQAogMDQxMCBzdHViIFByZXBhcmVUYXBlCiAwNDExIHN0dWIgUHVsc2VFdmVudAogMDQxMiBzdHViIFB1cmdlQ29tbQotMDQxMyBzdHViIFF1ZXJ5RG9zRGV2aWNlQQotMDQxNCBzdHViIFF1ZXJ5RG9zRGV2aWNlVworMDQxMyBzdGRjYWxsIFF1ZXJ5RG9zRGV2aWNlQShwdHIgcHRyIGxvbmcpIFF1ZXJ5RG9zRGV2aWNlMzJBCiswNDE0IHN0ZGNhbGwgUXVlcnlEb3NEZXZpY2VXKHB0ciBwdHIgbG9uZykgUXVlcnlEb3NEZXZpY2UzMlcKIDA0MTUgc3RkY2FsbCBRdWVyeVBlcmZvcm1hbmNlQ291bnRlcihwdHIpIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyCiAwNDE2IHN0dWIgUXVlcnlQZXJmb3JtYW5jZUZyZXF1ZW5jeQogMDQxNyBzdHViIFF1ZXJ5V2luMzFJbmlGaWxlc01hcHBlZFRvUmVnaXN0cnkKQEAgLTUwNSwyMCArNTA1LDIwIEBACiAwNTAwIHN0dWIgU2V0TG9jYWxlSW5mb1cKIDA1MDEgc3R1YiBTZXRNYWlsc2xvdEluZm8KIDA1MDIgc3R1YiBTZXROYW1lZFBpcGVIYW5kbGVTdGF0ZQotMDUwMyBzdHViIFNldFByaW9yaXR5Q2xhc3MKKzA1MDMgc3RkY2FsbCBTZXRQcmlvcml0eUNsYXNzKGxvbmcgbG9uZykgU2V0UHJpb3JpdHlDbGFzcwogMDUwNCBzdHViIFNldFByb2Nlc3NTaHV0ZG93blBhcmFtZXRlcnMKIDA1MDUgc3R1YiBTZXRQcm9jZXNzV29ya2luZ1NldFNpemUKLTA1MDYgc3R1YiBTZXRTdGRIYW5kbGUKLTA1MDcgICAgc3RkY2FsbCBTZXRTeXN0ZW1UaW1lKHB0cikgU2V0U3lzdGVtVGltZQorMDUwNiBzdGRjYWxsIFNldFN0ZEhhbmRsZShsb25nIGxvbmcpIFNldFN0ZEhhbmRsZQorMDUwNyBzdGRjYWxsIFNldFN5c3RlbVRpbWUocHRyKSBTZXRTeXN0ZW1UaW1lCiAwNTA4IHN0dWIgU2V0U3lzdGVtVGltZUFkanVzdG1lbnQKIDA1MDkgc3R1YiBTZXRUYXBlUGFyYW1ldGVycwogMDUxMCBzdHViIFNldFRhcGVQb3NpdGlvbgogMDUxMSBzdGRjYWxsIFNldFRocmVhZEFmZmluaXR5TWFzayhsb25nIGxvbmcpCVNldFRocmVhZEFmZmluaXR5TWFzawogMDUxMiBzdHViIFNldFRocmVhZENvbnRleHQKIDA1MTMgc3R1YiBTZXRUaHJlYWRMb2NhbGUKLTA1MTQgc3R1YiBTZXRUaHJlYWRQcmlvcml0eQotMDUxNSAgICBzdGRjYWxsIFNldFRpbWVab25lSW5mb3JtYXRpb24ocHRyKSBTZXRUaW1lWm9uZUluZm9ybWF0aW9uCi0wNTE2ICAgIHN0ZGNhbGwgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiswNTE0IHN0ZGNhbGwgU2V0VGhyZWFkUHJpb3JpdHkobG9uZyBsb25nKSBTZXRUaHJlYWRQcmlvcml0eQorMDUxNSBzdGRjYWxsIFNldFRpbWVab25lSW5mb3JtYXRpb24ocHRyKSBTZXRUaW1lWm9uZUluZm9ybWF0aW9uCiswNTE2IHN0ZGNhbGwgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyKHB0cikgU2V0VW5oYW5kbGVkRXhjZXB0aW9uRmlsdGVyCiAwNTE3IHN0dWIgU2V0VkRNQ3VycmVudERpcmVjdG9yaWVzCiAwNTE4IHN0dWIgU2V0Vm9sdW1lTGFiZWxBCiAwNTE5IHN0dWIgU2V0Vm9sdW1lTGFiZWxXCmRpZmYgLS1naXQgYS9pZjE2MzIvbnRkbGwuc3BlYyBiL2lmMTYzMi9udGRsbC5zcGVjCmluZGV4IDZmYzM0ODIuLjQ3ZDRkMzcgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9udGRsbC5zcGVjCisrKyBiL2lmMTYzMi9udGRsbC5zcGVjCkBAIC0yNjcsNyArMjY3LDcgQEAKIDI2MyBzdHViIFJ0bEFkZEF1ZGl0QWNjZXNzQWNlCiAyNjQgc3R1YiBSdGxBZGp1c3RQcml2aWxlZ2UKIDI2NSBzdHViIFJ0bEFsbG9jYXRlQW5kSW5pdGlhbGl6ZVNpZAotMjY2IHN0dWIgUnRsQWxsb2NhdGVIZWFwCisyNjYgc3RkY2FsbCBSdGxBbGxvY2F0ZUhlYXAobG9uZyBsb25nIGxvbmcpIEhlYXBBbGxvYwogMjY3IHN0dWIgUnRsQW5zaUNoYXJUb1VuaWNvZGVDaGFyCiAyNjggc3R1YiBSdGxBbnNpU3RyaW5nVG9Vbmljb2RlU2l6ZQogMjY5IHN0dWIgUnRsQW5zaVN0cmluZ1RvVW5pY29kZVN0cmluZwpAQCAtMzEwLDcgKzMxMCw3IEBACiAzMDYgc3R1YiBSdGxDcmVhdGVBY2wKIDMwNyBzdHViIFJ0bENyZWF0ZUFuZFNldFNECiAzMDggc3R1YiBSdGxDcmVhdGVFbnZpcm9ubWVudAotMzA5IHN0dWIgUnRsQ3JlYXRlSGVhcAorMzA5IHN0ZGNhbGwgUnRsQ3JlYXRlSGVhcChsb25nIGxvbmcgbG9uZykgSGVhcENyZWF0ZQogMzEwIHN0dWIgUnRsQ3JlYXRlUHJvY2Vzc1BhcmFtZXRlcnMKIDMxMSBzdHViIFJ0bENyZWF0ZVF1ZXJ5RGVidWdCdWZmZXIKIDMxMiBzdHViIFJ0bENyZWF0ZVJlZ2lzdHJ5S2V5CkBAIC0zNzUsNyArMzc1LDcgQEAKIDM3MSBzdHViIFJ0bEZvcm1hdEN1cnJlbnRVc2VyS2V5UGF0aAogMzcyIHN0dWIgUnRsRm9ybWF0TWVzc2FnZQogMzczIHN0dWIgUnRsRnJlZUFuc2lTdHJpbmcKLTM3NCBzdHViIFJ0bEZyZWVIZWFwCiszNzQgc3RkY2FsbCBSdGxGcmVlSGVhcChsb25nIGxvbmcgbG9uZykgSGVhcEZyZWUKIDM3NSBzdHViIFJ0bEZyZWVPZW1TdHJpbmcKIDM3NiBzdHViIFJ0bEZyZWVTaWQKIDM3NyBzdHViIFJ0bEZyZWVVbmljb2RlU3RyaW5nCkBAIC00OTQsNyArNDk0LDcgQEAKIDQ5MCBzdHViIFJ0bFNldFRpbWVab25lSW5mb3JtYXRpb24KIDQ5MSBzdHViIFJ0bFNldFVzZXJGbGFnc0hlYXAKIDQ5MiBzdHViIFJ0bFNldFVzZXJWYWx1ZUhlYXAKLTQ5MyBzdHViIFJ0bFNpemVIZWFwCis0OTMgc3RkY2FsbCBSdGxTaXplSGVhcChsb25nIGxvbmcgbG9uZykgSGVhcFNpemUKIDQ5NCBzdHViIFJ0bFNwbGF5CiA0OTUgc3R1YiBSdGxTdGFydFJYYWN0CiA0OTYgc3RkY2FsbCBSdGxTdWJBdXRob3JpdHlDb3VudFNpZChwdHIpIFJ0bFN1YkF1dGhvcml0eUNvdW50U2lkCkBAIC04ODAsNyArODgwLDcgQEAKIDg3NiBzdHViIF9zdHJ1cHIKIDg3NyBzdHViIF91bHRvYQogODc4IHN0dWIgX3ZzbnByaW50ZgotODc5IHN0dWIgX3djc2ljbXAKKzg3OSBzdGRjYWxsIF93Y3NpY21wKHB0ciBwdHIpIGxzdHJjbXBpMzJXCiA4ODAgc3R1YiBfd2NzbHdyCiA4ODEgc3R1YiBfd2NzbmljbXAKIDg4MiBzdHViIF93Y3N1cHIKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheS5jIGIvaWYxNjMyL3JlbGF5LmMKaW5kZXggY2M5YjgzOS4uNzEyMDQ2ZSAxMDA2NDQKLS0tIGEvaWYxNjMyL3JlbGF5LmMKKysrIGIvaWYxNjMyL3JlbGF5LmMKQEAgLTE4Niw5ICsxODYsOCBAQAogICogJ3N0YWNrJyBwb2ludHMgdG8gdGhlIGNhbGxlZCBmdW5jdGlvbiBhZGRyZXNzIG9uIHRoZSAzMi1iaXQgc3RhY2suCiAgKiBTdGFjayBsYXlvdXQ6CiAgKiAgLi4uICAgICAgICAuLi4KLSAqIChzdGFjaysxMikgIGFyZzIKLSAqIChzdGFjays4KSAgIGFyZzEKLSAqIChzdGFjays0KSAgIDE2LWJpdCBkcworICogKHN0YWNrKzgpICAgYXJnMgorICogKHN0YWNrKzQpICAgYXJnMQogICogKHN0YWNrKSAgICAgZnVuYyB0byBjYWxsCiAgKi8KIHZvaWQgUkVMQVlfRGVidWdDYWxsVG8xNiggaW50KiBzdGFjaywgaW50IG5iYXJncyApCkBAIC0xOTYsOCArMTk1LDggQEAKICAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOwogCiAgICAgcHJpbnRmKCAiQ2FsbFRvMTYoZnVuYz0lMDR4OiUwNHgsZHM9JTA0eCIsCi0gICAgICAgICAgICBISVdPUkQoc3RhY2tbMF0pLCBMT1dPUkQoc3RhY2tbMF0pLCBMT1dPUkQoc3RhY2tbMV0pICk7Ci0gICAgc3RhY2sgKz0gMjsKKyAgICAgICAgICAgIEhJV09SRChzdGFja1swXSksIExPV09SRChzdGFja1swXSksIENVUlJFTlRfRFMgKTsKKyAgICBzdGFjaysrOwogICAgIHdoaWxlIChuYmFyZ3MtLSkgcHJpbnRmKCAiLDB4JTA0eCIsICpzdGFjaysrICk7CiAgICAgcHJpbnRmKCAiKVxuIiApOwogfQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3VzZXIuc3BlYyBiL2lmMTYzMi91c2VyLnNwZWMKaW5kZXggZGVlNzNiNS4uYzg3ODcyNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3VzZXIuc3BlYworKysgYi9pZjE2MzIvdXNlci5zcGVjCkBAIC0xNDgsMjAgKzE0OCwyMCBAQAogMTQ2IHBhc2NhbDE2IEdldENsaXBib2FyZEZvcm1hdE5hbWUod29yZCBwdHIgc193b3JkKSBHZXRDbGlwYm9hcmRGb3JtYXROYW1lCiAxNDcgcGFzY2FsMTYgU2V0Q2xpcGJvYXJkVmlld2VyKHdvcmQpIFNldENsaXBib2FyZFZpZXdlcgogMTQ4IHBhc2NhbDE2IEdldENsaXBib2FyZFZpZXdlcigpIEdldENsaXBib2FyZFZpZXdlcgotMTQ5IHBhc2NhbDE2IENoYW5nZUNsaXBib2FyZENoYWluKHdvcmQgcHRyKSBDaGFuZ2VDbGlwYm9hcmRDaGFpbgorMTQ5IHBhc2NhbDE2IENoYW5nZUNsaXBib2FyZENoYWluKHdvcmQgcHRyKSBDaGFuZ2VDbGlwYm9hcmRDaGFpbjE2CiAxNTAgcGFzY2FsMTYgTG9hZE1lbnUod29yZCBzZWdwdHIpIExvYWRNZW51MTYKLTE1MSBwYXNjYWwxNiBDcmVhdGVNZW51KCkgQ3JlYXRlTWVudQotMTUyIHBhc2NhbDE2IERlc3Ryb3lNZW51KHdvcmQpIERlc3Ryb3lNZW51CisxNTEgcGFzY2FsMTYgQ3JlYXRlTWVudSgpIENyZWF0ZU1lbnUxNgorMTUyIHBhc2NhbDE2IERlc3Ryb3lNZW51KHdvcmQpIERlc3Ryb3lNZW51MTYKIDE1MyBwYXNjYWwxNiBDaGFuZ2VNZW51KHdvcmQgd29yZCBzZWdwdHIgd29yZCB3b3JkKSBDaGFuZ2VNZW51MTYKLTE1NCBwYXNjYWwxNiBDaGVja01lbnVJdGVtKHdvcmQgd29yZCB3b3JkKSBDaGVja01lbnVJdGVtCi0xNTUgcGFzY2FsMTYgRW5hYmxlTWVudUl0ZW0od29yZCB3b3JkIHdvcmQpIEVuYWJsZU1lbnVJdGVtCi0xNTYgcGFzY2FsMTYgR2V0U3lzdGVtTWVudSh3b3JkIHdvcmQpIEdldFN5c3RlbU1lbnUKLTE1NyBwYXNjYWwxNiBHZXRNZW51KHdvcmQpIEdldE1lbnUKLTE1OCBwYXNjYWwxNiBTZXRNZW51KHdvcmQgd29yZCkgU2V0TWVudQotMTU5IHBhc2NhbDE2IEdldFN1Yk1lbnUod29yZCB3b3JkKSBHZXRTdWJNZW51Ci0xNjAgcGFzY2FsMTYgRHJhd01lbnVCYXIod29yZCkgRHJhd01lbnVCYXIKLTE2MSBwYXNjYWwxNiBHZXRNZW51U3RyaW5nKHdvcmQgd29yZCBwdHIgc193b3JkIHdvcmQpIEdldE1lbnVTdHJpbmcKLTE2MiBwYXNjYWwxNiBIaWxpdGVNZW51SXRlbSh3b3JkIHdvcmQgd29yZCB3b3JkKSBIaWxpdGVNZW51SXRlbQorMTU0IHBhc2NhbDE2IENoZWNrTWVudUl0ZW0od29yZCB3b3JkIHdvcmQpIENoZWNrTWVudUl0ZW0xNgorMTU1IHBhc2NhbDE2IEVuYWJsZU1lbnVJdGVtKHdvcmQgd29yZCB3b3JkKSBFbmFibGVNZW51SXRlbTE2CisxNTYgcGFzY2FsMTYgR2V0U3lzdGVtTWVudSh3b3JkIHdvcmQpIEdldFN5c3RlbU1lbnUxNgorMTU3IHBhc2NhbDE2IEdldE1lbnUod29yZCkgR2V0TWVudTE2CisxNTggcGFzY2FsMTYgU2V0TWVudSh3b3JkIHdvcmQpIFNldE1lbnUxNgorMTU5IHBhc2NhbDE2IEdldFN1Yk1lbnUod29yZCB3b3JkKSBHZXRTdWJNZW51MTYKKzE2MCBwYXNjYWwxNiBEcmF3TWVudUJhcih3b3JkKSBEcmF3TWVudUJhcjE2CisxNjEgcGFzY2FsMTYgR2V0TWVudVN0cmluZyh3b3JkIHdvcmQgcHRyIHNfd29yZCB3b3JkKSBHZXRNZW51U3RyaW5nMTYKKzE2MiBwYXNjYWwxNiBIaWxpdGVNZW51SXRlbSh3b3JkIHdvcmQgd29yZCB3b3JkKSBIaWxpdGVNZW51SXRlbTE2CiAxNjMgcGFzY2FsMTYgQ3JlYXRlQ2FyZXQod29yZCB3b3JkIHdvcmQgd29yZCkgQ3JlYXRlQ2FyZXQKIDE2NCBwYXNjYWwxNiBEZXN0cm95Q2FyZXQoKSBEZXN0cm95Q2FyZXQKIDE2NSBwYXNjYWwxNiBTZXRDYXJldFBvcyh3b3JkIHdvcmQpIFNldENhcmV0UG9zCkBAIC0yNTIsNyArMjUyLDcgQEAKIDI0NyBwYXNjYWwxNiBHZXRDdXJzb3IoKSBHZXRDdXJzb3IKIDI0OCBwYXNjYWwxNiBHZXRPcGVuQ2xpcGJvYXJkV2luZG93KCkgR2V0T3BlbkNsaXBib2FyZFdpbmRvdwogMjQ5IHBhc2NhbDE2IEdldEFzeW5jS2V5U3RhdGUod29yZCkgR2V0QXN5bmNLZXlTdGF0ZQotMjUwIHBhc2NhbDE2IEdldE1lbnVTdGF0ZSh3b3JkIHdvcmQgd29yZCkgR2V0TWVudVN0YXRlCisyNTAgcGFzY2FsMTYgR2V0TWVudVN0YXRlKHdvcmQgd29yZCB3b3JkKSBHZXRNZW51U3RhdGUxNgogMjUxIHBhc2NhbCAgIFNlbmREcml2ZXJNZXNzYWdlKHdvcmQgd29yZCBsb25nIGxvbmcpIFNlbmREcml2ZXJNZXNzYWdlCiAyNTIgcGFzY2FsMTYgT3BlbkRyaXZlcihwdHIgcHRyIGxvbmcpIE9wZW5Ecml2ZXIKIDI1MyBwYXNjYWwgICBDbG9zZURyaXZlcih3b3JkIGxvbmcgbG9uZykgQ2xvc2VEcml2ZXIKQEAgLTI2Niw4ICsyNjYsOCBAQAogICAgICAgICAgICAgIERlZmVyV2luZG93UG9zCiAyNjEgcGFzY2FsMTYgRW5kRGVmZXJXaW5kb3dQb3Mod29yZCkgRW5kRGVmZXJXaW5kb3dQb3MKIDI2MiBwYXNjYWwxNiBHZXRXaW5kb3cod29yZCB3b3JkKSBHZXRXaW5kb3cKLTI2MyBwYXNjYWwxNiBHZXRNZW51SXRlbUNvdW50KHdvcmQpIEdldE1lbnVJdGVtQ291bnQKLTI2NCBwYXNjYWwxNiBHZXRNZW51SXRlbUlEKHdvcmQgd29yZCkgR2V0TWVudUl0ZW1JRAorMjYzIHBhc2NhbDE2IEdldE1lbnVJdGVtQ291bnQod29yZCkgR2V0TWVudUl0ZW1Db3VudDE2CisyNjQgcGFzY2FsMTYgR2V0TWVudUl0ZW1JRCh3b3JkIHdvcmQpIEdldE1lbnVJdGVtSUQxNgogMjY1IHBhc2NhbDE2IFNob3dPd25lZFBvcHVwcyh3b3JkIHdvcmQpIFNob3dPd25lZFBvcHVwcwogMjY2IHBhc2NhbDE2IFNldE1lc3NhZ2VRdWV1ZSh3b3JkKSBTZXRNZXNzYWdlUXVldWUKIDI2NyBwYXNjYWwxNiBTaG93U2Nyb2xsQmFyKHdvcmQgd29yZCB3b3JkKSBTaG93U2Nyb2xsQmFyMTYKQEAgLTI4Myw3ICsyODMsNyBAQAogMjc3IHBhc2NhbDE2IEdldERsZ0N0cmxJRCh3b3JkKSBHZXREbGdDdHJsSUQKIDI3OCBwYXNjYWwxNiBHZXREZXNrdG9wSHduZCgpIEdldERlc2t0b3BId25kCiAyNzkgc3R1YiBPbGRTZXREZXNrUGF0dGVybgotMjgwIHN0dWIgU2V0U3lzdGVtTWVudQorMjgwIHBhc2NhbDE2IFNldFN5c3RlbU1lbnUod29yZCB3b3JkKSBTZXRTeXN0ZW1NZW51MTYKIDI4MSBwYXNjYWwxNiBHZXRTeXNDb2xvckJydXNoKHdvcmQpIEdldFN5c0NvbG9yQnJ1c2gxNgogMjgyIHBhc2NhbDE2IFNlbGVjdFBhbGV0dGUod29yZCB3b3JkIHdvcmQpIFNlbGVjdFBhbGV0dGUKIDI4MyBwYXNjYWwxNiBSZWFsaXplUGFsZXR0ZSh3b3JkKSBSZWFsaXplUGFsZXR0ZQpAQCAtMzI0LDcgKzMyNCw3IEBACiAzNDMgc3R1YiBHZXRGaWxlUG9ydE5hbWUKIDM1NiBzdHViIExvYWRESUJDdXJzb3JIYW5kbGVyCiAzNTcgc3R1YiBMb2FkRElCSWNvbkhhbmRsZXIKLTM1OCBwYXNjYWwxNiBJc01lbnUod29yZCkgSXNNZW51CiszNTggcGFzY2FsMTYgSXNNZW51KHdvcmQpIElzTWVudTE2CiAzNTkgcGFzY2FsMTYgR2V0RENFeCh3b3JkIHdvcmQgbG9uZykgR2V0RENFeDE2CiAzNjIgcGFzY2FsMTYgRENIb29rKHdvcmQgd29yZCBsb25nIGxvbmcpIERDSG9vawogMzY0IHN0dWIgTG9va3VwSWNvbklERnJvbURpcmVjdG9yeUV4CkBAIC0zNjQsMTMgKzM2NCwxMyBAQAogNDA5IHN0dWIgSW5pdFRocmVhZElucHV0CiA0MTAgcGFzY2FsMTYgSW5zZXJ0TWVudSh3b3JkIHdvcmQgd29yZCB3b3JkIHNlZ3B0cikgSW5zZXJ0TWVudTE2CiA0MTEgcGFzY2FsMTYgQXBwZW5kTWVudSh3b3JkIHdvcmQgd29yZCBzZWdwdHIpIEFwcGVuZE1lbnUxNgotNDEyIHBhc2NhbDE2IFJlbW92ZU1lbnUod29yZCB3b3JkIHdvcmQpIFJlbW92ZU1lbnUKLTQxMyBwYXNjYWwxNiBEZWxldGVNZW51KHdvcmQgd29yZCB3b3JkKSBEZWxldGVNZW51Cis0MTIgcGFzY2FsMTYgUmVtb3ZlTWVudSh3b3JkIHdvcmQgd29yZCkgUmVtb3ZlTWVudTE2Cis0MTMgcGFzY2FsMTYgRGVsZXRlTWVudSh3b3JkIHdvcmQgd29yZCkgRGVsZXRlTWVudTE2CiA0MTQgcGFzY2FsMTYgTW9kaWZ5TWVudSh3b3JkIHdvcmQgd29yZCB3b3JkIHNlZ3B0cikgTW9kaWZ5TWVudTE2Ci00MTUgcGFzY2FsMTYgQ3JlYXRlUG9wdXBNZW51KCkgQ3JlYXRlUG9wdXBNZW51Cis0MTUgcGFzY2FsMTYgQ3JlYXRlUG9wdXBNZW51KCkgQ3JlYXRlUG9wdXBNZW51MTYKIDQxNiBwYXNjYWwxNiBUcmFja1BvcHVwTWVudSh3b3JkIHdvcmQgc193b3JkIHNfd29yZCBzX3dvcmQgd29yZCBwdHIpIFRyYWNrUG9wdXBNZW51MTYKIDQxNyBwYXNjYWwgICBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucygpIEdldE1lbnVDaGVja01hcmtEaW1lbnNpb25zCi00MTggcGFzY2FsMTYgU2V0TWVudUl0ZW1CaXRtYXBzKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgU2V0TWVudUl0ZW1CaXRtYXBzCis0MTggcGFzY2FsMTYgU2V0TWVudUl0ZW1CaXRtYXBzKHdvcmQgd29yZCB3b3JkIHdvcmQgd29yZCkgU2V0TWVudUl0ZW1CaXRtYXBzMTYKIDQyMCBwYXNjYWwxNiB3c3ByaW50ZigpIFdJTjE2X3dzcHJpbnRmMTYKIDQyMSBwYXNjYWwxNiB3dnNwcmludGYocHRyIHB0ciBwdHIpIHd2c3ByaW50ZjE2CiA0MjIgcGFzY2FsMTYgRGxnRGlyU2VsZWN0RXgod29yZCBwdHIgd29yZCB3b3JkKSBEbGdEaXJTZWxlY3RFeDE2CkBAIC0zNzksMTQgKzM3OSwxNCBAQAogNDI4IHN0dWIgVGlsZVdpbmRvd3MKIDQyOSBzdHViIENhc2NhZGVXaW5kb3dzCiA0MzAgcGFzY2FsMTYgbHN0cmNtcChwdHIgcHRyKSBsc3RyY21wMTYKLTQzMSBwYXNjYWwgICBBbnNpVXBwZXIoc2VncHRyKSBXSU4xNl9BbnNpVXBwZXIKLTQzMiBwYXNjYWwgICBBbnNpTG93ZXIoc2VncHRyKSBXSU4xNl9BbnNpTG93ZXIKKzQzMSBwYXNjYWwgICBBbnNpVXBwZXIoc2VncHRyKSBBbnNpVXBwZXIxNgorNDMyIHBhc2NhbCAgIEFuc2lMb3dlcihzZWdwdHIpIEFuc2lMb3dlcjE2CiA0MzMgcGFzY2FsMTYgSXNDaGFyQWxwaGEoYnl0ZSkgSXNDaGFyQWxwaGExNgogNDM0IHBhc2NhbDE2IElzQ2hhckFscGhhbnVtZXJpYyhieXRlKSBJc0NoYXJBbHBoYW51bWVyaWMxNgogNDM1IHBhc2NhbDE2IElzQ2hhclVwcGVyKGJ5dGUpIElzQ2hhclVwcGVyMTYKIDQzNiBwYXNjYWwxNiBJc0NoYXJMb3dlcihieXRlKSBJc0NoYXJMb3dlcjE2Ci00MzcgcGFzY2FsMTYgQW5zaVVwcGVyQnVmZihwdHIgd29yZCkgQW5zaVVwcGVyQnVmZgotNDM4IHBhc2NhbDE2IEFuc2lMb3dlckJ1ZmYocHRyIHdvcmQpIEFuc2lMb3dlckJ1ZmYKKzQzNyBwYXNjYWwxNiBBbnNpVXBwZXJCdWZmKHB0ciB3b3JkKSBBbnNpVXBwZXJCdWZmMTYKKzQzOCBwYXNjYWwxNiBBbnNpTG93ZXJCdWZmKHB0ciB3b3JkKSBBbnNpTG93ZXJCdWZmMTYKIDQ0MSBzdHViIEluc2VydE1lbnVJdGVtCiA0NDMgc3R1YiBHZXRNZW51SXRlbUluZm8KIDQ0NSBwYXNjYWwgICBEZWZGcmFtZVByb2Mod29yZCB3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZGcmFtZVByb2MxNgpAQCAtNDEzLDggKzQxMyw4IEBACiA0NjYgcGFzY2FsMTYgRHJhd0ZvY3VzUmVjdCh3b3JkIHB0cikgRHJhd0ZvY3VzUmVjdDE2CiA0NzAgc3R1YiBTdHJpbmdGdW5jCiA0NzEgcGFzY2FsMTYgbHN0cmNtcGkocHRyIHB0cikgbHN0cmNtcGkxNgotNDcyIHBhc2NhbCAgIEFuc2lOZXh0KHNlZ3B0cikgQW5zaU5leHQKLTQ3MyBwYXNjYWwgICBBbnNpUHJldihzZWdwdHIgc2VncHRyKSBBbnNpUHJldgorNDcyIHBhc2NhbCAgIEFuc2lOZXh0KHNlZ3B0cikgQW5zaU5leHQxNgorNDczIHBhc2NhbCAgIEFuc2lQcmV2KHNlZ3B0ciBzZWdwdHIpIEFuc2lQcmV2MTYKIDQ3NSBwYXNjYWwxNiBTZXRTY3JvbGxJbmZvKHdvcmQgc193b3JkIHB0ciB3b3JkKSBTZXRTY3JvbGxJbmZvMTYKIDQ3NiBwYXNjYWwxNiBHZXRTY3JvbGxJbmZvKHdvcmQgc193b3JkIHB0cikgR2V0U2Nyb2xsSW5mbzE2CiA0Nzcgc3R1YiBHZXRLZXlib2FyZExheW91dE5hbWUKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCAzZjVmOWU4Li40MWJjNTIyIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC0yMyw3ICsyMyw3IEBACiAwMDE4IHN0ZGNhbGwgQ2FsbFdpbmRvd1Byb2NXKHB0ciBsb25nIGxvbmcgbG9uZyBsb25nKSBDYWxsV2luZG93UHJvYzMyVwogMDAxOSBzdHViIENhc2NhZGVDaGlsZFdpbmRvd3MKIDAwMjAgc3R1YiBDYXNjYWRlV2luZG93cwotMDAyMSBzdHViIENoYW5nZUNsaXBib2FyZENoYWluCiswMDIxIHN0ZGNhbGwgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4obG9uZyBsb25nKSBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyCiAwMDIyIHN0ZGNhbGwgQ2hhbmdlTWVudUEobG9uZyBsb25nIHB0ciBsb25nIGxvbmcpIENoYW5nZU1lbnUzMkEKIDAwMjMgc3RkY2FsbCBDaGFuZ2VNZW51Vyhsb25nIGxvbmcgcHRyIGxvbmcgbG9uZykgQ2hhbmdlTWVudTMyVwogMDAyNCBzdGRjYWxsIENoYXJMb3dlckEocHRyKSBDaGFyTG93ZXIzMkEKQEAgLTQ3LDcgKzQ3LDcgQEAKIDAwNDIgc3RkY2FsbCBDaGFyVXBwZXJCdWZmVyhwdHIgbG9uZykgQ2hhclVwcGVyQnVmZjMyVwogMDA0MyBzdGRjYWxsIENoYXJVcHBlclcocHRyKSBDaGFyVXBwZXIzMlcKIDAwNDQgc3RkY2FsbCBDaGVja0RsZ0J1dHRvbihsb25nIGxvbmcgbG9uZykgQ2hlY2tEbGdCdXR0b24KLTAwNDUgc3RkY2FsbCBDaGVja01lbnVJdGVtKGxvbmcgbG9uZyBsb25nKSBDaGVja01lbnVJdGVtCiswMDQ1IHN0ZGNhbGwgQ2hlY2tNZW51SXRlbShsb25nIGxvbmcgbG9uZykgQ2hlY2tNZW51SXRlbTMyCiAwMDQ2IHN0dWIgQ2hlY2tNZW51UmFkaW9JdGVtCiAwMDQ3IHN0ZGNhbGwgQ2hlY2tSYWRpb0J1dHRvbihsb25nIGxvbmcgbG9uZyBsb25nKSBDaGVja1JhZGlvQnV0dG9uCiAwMDQ4IHN0ZGNhbGwgQ2hpbGRXaW5kb3dGcm9tUG9pbnQobG9uZyBsb25nIGxvbmcpIENoaWxkV2luZG93RnJvbVBvaW50MzIKQEAgLTgyLDggKzgyLDggQEAKIDAwNzcgc3R1YiBDcmVhdGVJY29uSW5kaXJlY3QKIDAwNzggc3R1YiBDcmVhdGVNRElXaW5kb3dBCiAwMDc5IHN0dWIgQ3JlYXRlTURJV2luZG93VwotMDA4MCBzdGRjYWxsIENyZWF0ZU1lbnUoKSBDcmVhdGVNZW51Ci0wMDgxIHN0ZGNhbGwgQ3JlYXRlUG9wdXBNZW51KCkgQ3JlYXRlUG9wdXBNZW51CiswMDgwIHN0ZGNhbGwgQ3JlYXRlTWVudSgpIENyZWF0ZU1lbnUzMgorMDA4MSBzdGRjYWxsIENyZWF0ZVBvcHVwTWVudSgpIENyZWF0ZVBvcHVwTWVudTMyCiAwMDgyIHN0ZGNhbGwgQ3JlYXRlV2luZG93RXhBKGxvbmcgcHRyIHB0ciBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgCiAJCQkJbG9uZyBsb25nIGxvbmcgcHRyKSBDcmVhdGVXaW5kb3dFeDMyQQogMDA4MyBzdGRjYWxsIENyZWF0ZVdpbmRvd0V4Vyhsb25nIHB0ciBwdHIgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIApAQCAtMTMyLDEyICsxMzIsMTIgQEAKIDAxMjUgc3RkY2FsbCBEZWZXaW5kb3dQcm9jQShsb25nIGxvbmcgbG9uZyBsb25nKSBEZWZXaW5kb3dQcm9jMzJBCiAwMTI2IHN0ZGNhbGwgRGVmV2luZG93UHJvY1cobG9uZyBsb25nIGxvbmcgbG9uZykgRGVmV2luZG93UHJvYzMyVwogMDEyNyBzdGRjYWxsIERlZmVyV2luZG93UG9zKGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZykgRGVmZXJXaW5kb3dQb3MKLTAxMjggc3RkY2FsbCBEZWxldGVNZW51KGxvbmcgbG9uZyBsb25nKSBEZWxldGVNZW51CiswMTI4IHN0ZGNhbGwgRGVsZXRlTWVudShsb25nIGxvbmcgbG9uZykgRGVsZXRlTWVudTMyCiAwMTI5IHN0dWIgRGVzdHJveUFjY2VsZXJhdG9yVGFibGUKIDAxMzAgc3RkY2FsbCBEZXN0cm95Q2FyZXQoKSBEZXN0cm95Q2FyZXQKIDAxMzEgc3R1YiBEZXN0cm95Q3Vyc29yCiAwMTMyIHN0dWIgRGVzdHJveUljb24KLTAxMzMgc3RkY2FsbCBEZXN0cm95TWVudShsb25nKSBEZXN0cm95TWVudQorMDEzMyBzdGRjYWxsIERlc3Ryb3lNZW51KGxvbmcpIERlc3Ryb3lNZW51MzIKIDAxMzQgc3RkY2FsbCBEZXN0cm95V2luZG93KGxvbmcpIERlc3Ryb3lXaW5kb3cKIDAxMzUgc3RkY2FsbCBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtQShsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEaWFsb2dCb3hJbmRpcmVjdFBhcmFtMzJBCiAwMTM2IHN0dWIgRGlhbG9nQm94SW5kaXJlY3RQYXJhbUFvclcKQEAgLTE2NCw3ICsxNjQsNyBAQAogMDE1NyBzdGRjYWxsIERyYXdGcmFtZUNvbnRyb2wobG9uZyBwdHIgbG9uZyBsb25nKSBEcmF3RnJhbWVDb250cm9sMzIKIDAxNTggc3RkY2FsbCBEcmF3SWNvbihsb25nIGxvbmcgbG9uZyBsb25nKSBEcmF3SWNvbgogMDE1OSBzdHViIERyYXdJY29uRXgKLTAxNjAgc3RkY2FsbCBEcmF3TWVudUJhcihsb25nKSBEcmF3TWVudUJhcgorMDE2MCBzdGRjYWxsIERyYXdNZW51QmFyKGxvbmcpIERyYXdNZW51QmFyMzIKIDAxNjEgc3R1YiBEcmF3U3RhdGVBCiAwMTYyIHN0dWIgRHJhd1N0YXRlVwogMDE2MyBzdGRjYWxsIERyYXdUZXh0QShsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEcmF3VGV4dDMyQQpAQCAtMTcyLDEzICsxNzIsMTMgQEAKIDAxNjUgc3R1YiBEcmF3VGV4dEV4VwogMDE2NiBzdGRjYWxsIERyYXdUZXh0Vyhsb25nIHB0ciBsb25nIHB0ciBsb25nKSBEcmF3VGV4dDMyVwogMDE2NyBzdHViIEVkaXRXbmRQcm9jCi0wMTY4IHN0ZGNhbGwgRW1wdHlDbGlwYm9hcmQoKQkJCQlFbXB0eUNsaXBib2FyZAotMDE2OSBzdGRjYWxsIEVuYWJsZU1lbnVJdGVtKGxvbmcgbG9uZyBsb25nKSBFbmFibGVNZW51SXRlbQorMDE2OCBzdGRjYWxsIEVtcHR5Q2xpcGJvYXJkKCkgRW1wdHlDbGlwYm9hcmQKKzAxNjkgc3RkY2FsbCBFbmFibGVNZW51SXRlbShsb25nIGxvbmcgbG9uZykgRW5hYmxlTWVudUl0ZW0zMgogMDE3MCBzdGRjYWxsIEVuYWJsZVNjcm9sbEJhcihsb25nIGxvbmcgbG9uZykgRW5hYmxlU2Nyb2xsQmFyMzIKIDAxNzEgc3RkY2FsbCBFbmFibGVXaW5kb3cobG9uZyBsb25nKSBFbmFibGVXaW5kb3cKIDAxNzIgc3RkY2FsbCBFbmREZWZlcldpbmRvd1Bvcyhsb25nKSBFbmREZWZlcldpbmRvd1BvcwogMDE3MyBzdGRjYWxsIEVuZERpYWxvZyhsb25nIGxvbmcpIEVuZERpYWxvZwotMDE3NCBzdHViIEVuZE1lbnUKKzAxNzQgc3RkY2FsbCBFbmRNZW51KCkgRW5kTWVudQogMDE3NSBzdGRjYWxsIEVuZFBhaW50KGxvbmcgcHRyKSBFbmRQYWludDMyCiAwMTc2IHN0dWIgRW5kVGFzawogMDE3NyBzdGRjYWxsIEVudW1DaGlsZFdpbmRvd3MobG9uZyBwdHIgbG9uZykgVEhVTktfRW51bUNoaWxkV2luZG93czMyCkBAIC0yNjAsMTkgKzI2MCwxOSBAQAogMDI1MyBzdHViIEdldEtleWJvYXJkU3RhdGUKIDAyNTQgc3R1YiBHZXRLZXlib2FyZFR5cGUKIDAyNTUgc3R1YiBHZXRMYXN0QWN0aXZlUG9wdXAKLTAyNTYgc3RkY2FsbCBHZXRNZW51KGxvbmcpIEdldE1lbnUKLTAyNTcgc3R1YiBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucworMDI1NiBzdGRjYWxsIEdldE1lbnUobG9uZykgR2V0TWVudTMyCiswMjU3IHN0ZGNhbGwgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnMoKSBHZXRNZW51Q2hlY2tNYXJrRGltZW5zaW9ucwogMDI1OCBzdHViIEdldE1lbnVDb250ZXh0SGVscElkCiAwMjU5IHN0dWIgR2V0TWVudURlZmF1bHRJdGVtCiAwMjYwIHN0dWIgR2V0TWVudUluZGV4Ci0wMjYxIHN0ZGNhbGwgR2V0TWVudUl0ZW1Db3VudChsb25nKSBHZXRNZW51SXRlbUNvdW50Ci0wMjYyIHN0ZGNhbGwgR2V0TWVudUl0ZW1JRChsb25nIGxvbmcpIEdldE1lbnVJdGVtSUQKKzAyNjEgc3RkY2FsbCBHZXRNZW51SXRlbUNvdW50KGxvbmcpIEdldE1lbnVJdGVtQ291bnQzMgorMDI2MiBzdGRjYWxsIEdldE1lbnVJdGVtSUQobG9uZyBsb25nKSBHZXRNZW51SXRlbUlEMzIKIDAyNjMgc3R1YiBHZXRNZW51SXRlbUluZm9BCiAwMjY0IHN0dWIgR2V0TWVudUl0ZW1JbmZvVwogMDI2NSBzdHViIEdldE1lbnVJdGVtUmVjdAotMDI2NiBzdGRjYWxsIEdldE1lbnVTdGF0ZShsb25nIGxvbmcgbG9uZykgR2V0TWVudVN0YXRlCi0wMjY3IHN0ZGNhbGwgR2V0TWVudVN0cmluZ0EobG9uZyBsb25nIHB0ciBsb25nIGxvbmcpIEdldE1lbnVTdHJpbmcKLTAyNjggc3R1YiBHZXRNZW51U3RyaW5nVworMDI2NiBzdGRjYWxsIEdldE1lbnVTdGF0ZShsb25nIGxvbmcgbG9uZykgR2V0TWVudVN0YXRlMzIKKzAyNjcgc3RkY2FsbCBHZXRNZW51U3RyaW5nQShsb25nIGxvbmcgcHRyIGxvbmcgbG9uZykgR2V0TWVudVN0cmluZzMyQQorMDI2OCBzdGRjYWxsIEdldE1lbnVTdHJpbmdXKGxvbmcgbG9uZyBwdHIgbG9uZyBsb25nKSBHZXRNZW51U3RyaW5nMzJXCiAwMjY5IHN0ZGNhbGwgR2V0TWVzc2FnZUEocHRyIGxvbmcgbG9uZyBsb25nKSBVU0VSMzJfR2V0TWVzc2FnZUEKIDAyNzAgc3R1YiBHZXRNZXNzYWdlRXh0cmFJbmZvCiAwMjcxIHN0dWIgR2V0TWVzc2FnZVBvcwpAQCAtMjkxLDEwICsyOTEsMTAgQEAKIDAyODQgc3RkY2FsbCBHZXRTY3JvbGxQb3MobG9uZyBsb25nKSBHZXRTY3JvbGxQb3MzMgogMDI4NSBzdGRjYWxsIEdldFNjcm9sbFJhbmdlKGxvbmcgbG9uZyBwdHIgcHRyKSBHZXRTY3JvbGxSYW5nZTMyCiAwMjg2IHJldHVybiBHZXRTaGVsbFdpbmRvdyAwIDAKLTAyODcgc3RkY2FsbCBHZXRTdWJNZW51KGxvbmcgbG9uZykgR2V0U3ViTWVudQorMDI4NyBzdGRjYWxsIEdldFN1Yk1lbnUobG9uZyBsb25nKSBHZXRTdWJNZW51MzIKIDAyODggc3RkY2FsbCBHZXRTeXNDb2xvcihsb25nKSBHZXRTeXNDb2xvcgogMDI4OSBzdGRjYWxsIEdldFN5c0NvbG9yQnJ1c2gobG9uZykgR2V0U3lzQ29sb3JCcnVzaDMyCi0wMjkwIHN0ZGNhbGwgR2V0U3lzdGVtTWVudShsb25nIGxvbmcpIEdldFN5c3RlbU1lbnUKKzAyOTAgc3RkY2FsbCBHZXRTeXN0ZW1NZW51KGxvbmcgbG9uZykgR2V0U3lzdGVtTWVudTMyCiAwMjkxIHN0ZGNhbGwgR2V0U3lzdGVtTWV0cmljcyhsb25nKSBHZXRTeXN0ZW1NZXRyaWNzCiAwMjkyIHN0ZGNhbGwgR2V0VGFiYmVkVGV4dEV4dGVudEEobG9uZyBwdHIgbG9uZyBsb25nIHB0cikgR2V0VGFiYmVkVGV4dEV4dGVudAogMDI5MyBzdHViIEdldFRhYmJlZFRleHRFeHRlbnRXCkBAIC0zMjEsNyArMzIxLDcgQEAKIDAzMTQgc3R1YiBHcmF5U3RyaW5nQQogMDMxNSBzdHViIEdyYXlTdHJpbmdXCiAwMzE2IHN0ZGNhbGwgSGlkZUNhcmV0KGxvbmcpIEhpZGVDYXJldAotMDMxNyBzdHViIEhpbGl0ZU1lbnVJdGVtCiswMzE3IHN0ZGNhbGwgSGlsaXRlTWVudUl0ZW0obG9uZyBsb25nIGxvbmcgbG9uZykgSGlsaXRlTWVudUl0ZW0zMgogMDMxOCBzdHViIEltcGVyc29uYXRlRGRlQ2xpZW50V2luZG93CiAwMzE5IHN0dWIgSW5TZW5kTWVzc2FnZQogMDMyMCBzdGRjYWxsIEluZmxhdGVSZWN0KHB0ciBsb25nIGxvbmcpIEluZmxhdGVSZWN0MzIKQEAgLTM0OSw3ICszNDksNyBAQAogMDM0MiBzdHViIElzRGlhbG9nTWVzc2FnZVcKIDAzNDMgc3RkY2FsbCBJc0RsZ0J1dHRvbkNoZWNrZWQobG9uZyBsb25nKSBJc0RsZ0J1dHRvbkNoZWNrZWQKIDAzNDQgc3RkY2FsbCBJc0ljb25pYyhsb25nKSBJc0ljb25pYwotMDM0NSBzdGRjYWxsIElzTWVudShsb25nKSBJc01lbnUKKzAzNDUgc3RkY2FsbCBJc01lbnUobG9uZykgSXNNZW51MzIKIDAzNDYgc3RkY2FsbCBJc1JlY3RFbXB0eShwdHIpIElzUmVjdEVtcHR5MzIKIDAzNDcgc3RkY2FsbCBJc1dpbmRvdyhsb25nKSBJc1dpbmRvdwogMDM0OCBzdGRjYWxsIElzV2luZG93RW5hYmxlZChsb25nKSBJc1dpbmRvd0VuYWJsZWQKQEAgLTQ0NCw3ICs0NDQsNyBAQAogMDQzNyBzdGRjYWxsIFJlZ2lzdGVyV2luZG93TWVzc2FnZVcocHRyKSBSZWdpc3RlcldpbmRvd01lc3NhZ2UzMlcKIDA0Mzggc3RkY2FsbCBSZWxlYXNlQ2FwdHVyZSgpIFJlbGVhc2VDYXB0dXJlCiAwNDM5IHN0ZGNhbGwgUmVsZWFzZURDKGxvbmcgbG9uZykgUmVsZWFzZURDMzIKLTA0NDAgc3RkY2FsbCBSZW1vdmVNZW51KGxvbmcgbG9uZyBsb25nKSBSZW1vdmVNZW51CiswNDQwIHN0ZGNhbGwgUmVtb3ZlTWVudShsb25nIGxvbmcgbG9uZykgUmVtb3ZlTWVudTMyCiAwNDQxIHN0ZGNhbGwgUmVtb3ZlUHJvcEEobG9uZyBwdHIpIFJlbW92ZVByb3AzMkEKIDA0NDIgc3RkY2FsbCBSZW1vdmVQcm9wVyhsb25nIHB0cikgUmVtb3ZlUHJvcDMyVwogMDQ0MyBzdHViIFJlcGx5TWVzc2FnZQpAQCAtNDkwLDEwICs0OTAsMTAgQEAKIDA0ODMgc3R1YiBTZXRLZXlib2FyZFN0YXRlCiAwNDg0IHN0ZGNhbGwgU2V0TGFzdEVycm9yRXgobG9uZyBsb25nKSBTZXRMYXN0RXJyb3JFeAogMDQ4NSBzdHViIFNldExvZ29uTm90aWZ5V2luZG93Ci0wNDg2IHN0ZGNhbGwgU2V0TWVudShsb25nIGxvbmcpIFNldE1lbnUKKzA0ODYgc3RkY2FsbCBTZXRNZW51KGxvbmcgbG9uZykgU2V0TWVudTMyCiAwNDg3IHN0dWIgU2V0TWVudUNvbnRleHRIZWxwSWQKIDA0ODggc3R1YiBTZXRNZW51RGVmYXVsdEl0ZW0KLTA0ODkgc3R1YiBTZXRNZW51SXRlbUJpdG1hcHMKKzA0ODkgc3RkY2FsbCBTZXRNZW51SXRlbUJpdG1hcHMobG9uZyBsb25nIGxvbmcgbG9uZyBsb25nKSBTZXRNZW51SXRlbUJpdG1hcHMzMgogMDQ5MCBzdHViIFNldE1lbnVJdGVtSW5mb0EKIDA0OTEgc3R1YiBTZXRNZW51SXRlbUluZm9XCiAwNDkyIHN0dWIgU2V0TWVzc2FnZUV4dHJhSW5mbwpAQCAtNTExLDcgKzUxMSw3IEBACiAwNTA0IHN0dWIgU2V0U3lzQ29sb3JzCiAwNTA1IHN0dWIgU2V0U3lzQ29sb3JzVGVtcAogMDUwNiBzdHViIFNldFN5c3RlbUN1cnNvcgotMDUwNyBzdHViIFNldFN5c3RlbU1lbnUKKzA1MDcgc3RkY2FsbCBTZXRTeXN0ZW1NZW51KGxvbmcgbG9uZykgU2V0U3lzdGVtTWVudTMyCiAwNTA4IHN0ZGNhbGwgU2V0U3lzdGVtVGltZXIobG9uZyBsb25nIGxvbmcgcHRyKSBTZXRTeXN0ZW1UaW1lcjMyCiAwNTA5IHN0dWIgU2V0VGhyZWFkRGVza3RvcAogMDUxMCBzdGRjYWxsIFNldFRpbWVyKGxvbmcgbG9uZyBsb25nIHB0cikgU2V0VGltZXIzMgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3dwcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCmluZGV4IDcwOTcwZDAuLjBkZWU5NGMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi93cHJvY3Muc3BlYworKysgYi9pZjE2MzIvd3Byb2NzLnNwZWMKQEAgLTUsOSArNSw2IEBACiAyICBwYXNjYWwgU3RhdGljV25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBTdGF0aWNXbmRQcm9jCiAzICBwYXNjYWwgU2Nyb2xsQmFyV25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBTY3JvbGxCYXJXbmRQcm9jCiA1ICBwYXNjYWwgQ29tYm9Cb3hXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIENvbWJvQm94V25kUHJvYwotNiAgcGFzY2FsIEVkaXRXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEVkaXRXbmRQcm9jCi03ICBwYXNjYWwgUG9wdXBNZW51V25kUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBQb3B1cE1lbnVXbmRQcm9jCi05ICBwYXNjYWwgRGVmRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZEbGdQcm9jMTYKIDEwIHBhc2NhbCBNRElDbGllbnRXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIE1ESUNsaWVudFduZFByb2MKIDE0IHBhc2NhbCBGaWxlT3BlbkRsZ1Byb2Mod29yZCB3b3JkIHdvcmQgbG9uZykgRmlsZU9wZW5EbGdQcm9jCiAxNSBwYXNjYWwgRmlsZVNhdmVEbGdQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEZpbGVTYXZlRGxnUHJvYwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY2NlbC5oIGIvaW5jbHVkZS9hY2NlbC5oCmluZGV4IGI4ZTU2OTAuLjdjM2FkOTUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNjZWwuaAorKysgYi9pbmNsdWRlL2FjY2VsLmgKQEAgLTUsNiArNSw5IEBACiAgKgogICovCiAKKyNpZm5kZWYgX19XSU5FX0FDQ0VMX0gKKyNkZWZpbmUgX19XSU5FX0FDQ0VMX0gKKwogI2luY2x1ZGUgIndpbmRvd3MuaCIKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtMjMsMyArMjYsNSBAQAogI2RlZmluZSBDT05UUk9MX0FDQ0VMCTB4MDgKICNkZWZpbmUgQUxUX0FDQ0VMICAgICAgIDB4MTAKICNkZWZpbmUgU1lTVEVNX0FDQ0VMCTB4ODAKKworI2VuZGlmICAvKiBfX1dJTkVfQUNDRUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hdG9tLmggYi9pbmNsdWRlL2F0b20uaAppbmRleCAzYzZmMDU3Li4zZmNjNzU3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2F0b20uaAorKysgYi9pbmNsdWRlL2F0b20uaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgQVRPTV9ICi0jZGVmaW5lIEFUT01fSAorI2lmbmRlZiBfX1dJTkVfQVRPTV9ICisjZGVmaW5lIF9fV0lORV9BVE9NX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIApAQCAtMjUsNCArMjUsNCBAQAogICAgIEhBTkRMRTE2ICAgIGVudHJpZXNbMV07CiB9IEFUT01UQUJMRTsKIAotI2VuZGlmICAvKiBBVE9NX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX0FUT01fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idXR0b24uaCBiL2luY2x1ZGUvYnV0dG9uLmgKaW5kZXggYWUxYjZmZS4uYjBjN2ExZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9idXR0b24uaAorKysgYi9pbmNsdWRlL2J1dHRvbi5oCkBAIC00LDggKzQsOCBAQAogICogQ29weXJpZ2h0IDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBCVVRUT05fSAotI2RlZmluZSBCVVRUT05fSAorI2lmbmRlZiBfX1dJTkVfQlVUVE9OX0gKKyNkZWZpbmUgX19XSU5FX0JVVFRPTl9ICiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKQEAgLTMxLDQgKzMxLDQgQEAKIGV4dGVybiBMUkVTVUxUIEJ1dHRvblduZFByb2MoIEhXTkQzMiBoV25kLCBVSU5UMzIgdU1zZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTMyIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOwogCi0jZW5kaWYgIC8qIEJVVFRPTl9IICovCisjZW5kaWYgIC8qIF9fV0lORV9CVVRUT05fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jbGFzcy5oIGIvaW5jbHVkZS9jbGFzcy5oCmluZGV4IGUwMmJlYzcuLmZhYTk0YzcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvY2xhc3MuaAorKysgYi9pbmNsdWRlL2NsYXNzLmgKQEAgLTQsOCArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaWZuZGVmIENMQVNTX0gKLSNkZWZpbmUgQ0xBU1NfSAorI2lmbmRlZiBfX1dJTkVfQ0xBU1NfSAorI2RlZmluZSBfX1dJTkVfQ0xBU1NfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKQEAgLTQwLDQgKzQwLDQgQEAKIGV4dGVybiB2b2lkIENMQVNTX0ZyZWVNb2R1bGVDbGFzc2VzKCBITU9EVUxFMTYgaE1vZHVsZSApOwogZXh0ZXJuIENMQVNTICpDTEFTU19GaW5kQ2xhc3NCeUF0b20oIEFUT00gYXRvbSwgSElOU1RBTkNFMTYgaGluc3RhbmNlICk7CiAKLSNlbmRpZiAgLyogQ0xBU1NfSCAqLworI2VuZGlmICAvKiBfX1dJTkVfQ0xBU1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tLmggYi9pbmNsdWRlL2NvbW0uaAppbmRleCAwZDNkZjQ0Li41ZjJiMGFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2NvbW0uaAorKysgYi9pbmNsdWRlL2NvbW0uaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgQ09NTV9ICi0jZGVmaW5lIENPTU1fSAorI2lmbmRlZiBfX1dJTkVfQ09NTV9ICisjZGVmaW5lIF9fV0lORV9DT01NX0gKIAogI2RlZmluZSBNQVhfUE9SVFMgICAxNgogCkBAIC0xNCw0ICsxNCw0IEBACiAKIGV4dGVybiB2b2lkIENPTU1fSW5pdCh2b2lkKTsKIAotI2VuZGlmICAvKiBDT01NX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX0NPTU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jcnRkbGwuaCBiL2luY2x1ZGUvY3J0ZGxsLmgKaW5kZXggYmViODdjYy4uOTE2ZTliNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9jcnRkbGwuaAorKysgYi9pbmNsdWRlL2NydGRsbC5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfV0lORV9DUlRETExfSAotI2RlZmluZSBfV0lORV9DUlRETExfSAorI2lmbmRlZiBfX1dJTkVfQ1JURExMX0gKKyNkZWZpbmUgX19XSU5FX0NSVERMTF9ICiAKICNkZWZpbmUgQ1JURExMX0xDX0FMTAkJMAogI2RlZmluZSBDUlRETExfTENfQ09MTEFURQkxCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RjZS5oIGIvaW5jbHVkZS9kY2UuaAppbmRleCBiMjFlYzJhLi4zNjgxNzRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RjZS5oCisrKyBiL2luY2x1ZGUvZGNlLmgKQEAgLTQsOCArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaWZuZGVmIERDRV9ICi0jZGVmaW5lIERDRV9ICisjaWZuZGVmIF9fV0lORV9EQ0VfSAorI2RlZmluZSBfX1dJTkVfRENFX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW4uaCIKQEAgLTUwLDQgKzUwLDQgQEAKIGV4dGVybiB2b2lkICBEQ0VfRnJlZURDRSggRENFICpkY2UgKTsKIGV4dGVybiBJTlQxNiBEQ0VfRXhjbHVkZVJnbiggSERDMzIsIFdORCosIEhSR04zMiApOwogCi0jZW5kaWYgIC8qIERDRV9IICovCisjZW5kaWYgIC8qIF9fV0lORV9EQ0VfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kZWJ1Z2dlci5oIGIvaW5jbHVkZS9kZWJ1Z2dlci5oCmluZGV4IDVhNjkyMTUuLjEzNzc5ZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGVidWdnZXIuaAorKysgYi9pbmNsdWRlL2RlYnVnZ2VyLmgKQEAgLTE0LDE3ICsxNCw1OCBAQAogCiAjZGVmaW5lIFNURVBfRkxBRyAweDEwMCAvKiBzaW5nbGUgc3RlcCBmbGFnICovCiAKKyNkZWZpbmUgU1lNX0ZVTkMJIDB4MAorI2RlZmluZSBTWU1fREFUQQkgMHgxCisjZGVmaW5lIFNZTV9XSU4zMgkgMHgyCisjZGVmaW5lIFNZTV9XSU5FCSAweDQKKyNkZWZpbmUgU1lNX0lOVkFMSUQJIDB4OAorI2RlZmluZSBTWU1fVFJBTVBPTElORQkgMHgxMAorI2RlZmluZSBTWU1fU1RFUF9USFJPVUdIIDB4MjAKKworZW51bQlkZWJ1Z190eXBlIHtCQVNJQywgQ09OU1QsIFBPSU5URVIsIEFSUkFZLCBTVFJVQ1QsIEVOVU0sIFRZUEVERUYsIEZVTkMsIEJJVEZJRUxEfTsKKworCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgREVCVUdfQ2hlY2tMaW5lbm9TdGF0dXMuICBVc2VkIHRvIGRldGVybWluZQorICogd2hhdCB0byBkbyB3aGVuIHRoZSAnc3RlcCcgY29tbWFuZCBpcyBnaXZlbi4KKyAqLworI2RlZmluZSBGVU5DX0hBU19OT19MSU5FUwkoMCkKKyNkZWZpbmUgTk9UX09OX0xJTkVOVU1CRVIJKDEpCisjZGVmaW5lIEFUX0xJTkVOVU1CRVIJCSgyKQorI2RlZmluZSBGVU5DX0lTX1RSQU1QT0xJTkUJKDMpCisKKy8qCisgKiBGb3IgY29uc3RhbnRzIGdlbmVyYXRlZCBieSB0aGUgcGFyc2VyLCB3ZSB1c2UgdGhpcyBkYXRhdHlwZQorICovCitleHRlcm4gc3RydWN0IGRhdGF0eXBlICogREVCVUdfVHlwZUludDsKK2V4dGVybiBzdHJ1Y3QgZGF0YXR5cGUgKiBERUJVR19UeXBlSW50Q29uc3Q7CitleHRlcm4gc3RydWN0IGRhdGF0eXBlICogREVCVUdfVHlwZVVTSW50OworZXh0ZXJuIHN0cnVjdCBkYXRhdHlwZSAqIERFQlVHX1R5cGVTdHJpbmc7CisKIHR5cGVkZWYgc3RydWN0CiB7CisgICAgc3RydWN0IGRhdGF0eXBlICogdHlwZTsKICAgICBEV09SRCBzZWc7ICAvKiAweGZmZmZmZmZmIG1lYW5zIGN1cnJlbnQgZGVmYXVsdCBzZWdtZW50IChjcyBvciBkcykgKi8KICAgICBEV09SRCBvZmY7CiB9IERCR19BRERSOwogCitzdHJ1Y3QgbGlzdF9pZAoreworICAgIGNoYXIgKiBzb3VyY2VmaWxlOworICAgIGludCAgICBsaW5lOworfTsKKwogc3RydWN0ICB3aW5lX2xpbmVzIHsKICAgdW5zaWduZWQgbG9uZwkJbGluZV9udW1iZXI7CiAgIERCR19BRERSCQlwY19vZmZzZXQ7CiB9OwogCitzdHJ1Y3Qgc3ltYm9sX2luZm8KK3sKKyAgc3RydWN0IG5hbWVfaGFzaCAqIHN5bTsKKyAgc3RydWN0IGxpc3RfaWQgICAgIGxpc3Q7Cit9OworCiB0eXBlZGVmIHN0cnVjdCB3aW5lX2xpbmVzIFdpbmVMaW5lTm87CiAKIC8qCkBAIC0zNCwzMCArNzUsMTUgQEAKICAqLwogc3RydWN0ICB3aW5lX2xvY2FscyB7CiAgIHVuc2lnbmVkIGludAkJcmVnbm86ODsJLyogRm9yIHJlZ2lzdGVyIHN5bWJvbHMgKi8KLSAgdW5zaWduZWQgaW50CQlvZmZzZXQ6MjQ7CS8qIG9mZnNldCBmcm9tIGVzcC9lYnAgdG8gc3ltYm9sICovCisgIHNpZ25lZCBpbnQJCW9mZnNldDoyNDsJLyogb2Zmc2V0IGZyb20gZXNwL2VicCB0byBzeW1ib2wgKi8KICAgdW5zaWduZWQgaW50CQlwY19zdGFydDsJLyogRm9yIFJCUkFDL0xCUkFDICovCiAgIHVuc2lnbmVkIGludAkJcGNfZW5kOwkJLyogRm9yIFJCUkFDL0xCUkFDICovCiAgIGNoYXIJCSAgICAgICogbmFtZTsJCS8qIE5hbWUgb2Ygc3ltYm9sICovCisgIHN0cnVjdCBkYXRhdHlwZSAgICAgKiB0eXBlOwkJLyogRGF0YXR5cGUgb2Ygc3ltYm9sICovCiB9OwogCiB0eXBlZGVmIHN0cnVjdCB3aW5lX2xvY2FscyBXaW5lTG9jYWxzOwogCi1zdHJ1Y3QgbmFtZV9oYXNoCi17Ci0gICAgc3RydWN0IG5hbWVfaGFzaCAqIG5leHQ7Ci0gICAgY2hhciAqICAgICAgICAgICAgIG5hbWU7Ci0gICAgY2hhciAqICAgICAgICAgICAgIHNvdXJjZWZpbGU7Ci0KLSAgICBpbnQJCSAgICAgICBuX2xvY2FsczsKLSAgICBpbnQJCSAgICAgICBsb2NhbHNfYWxsb2M7Ci0gICAgV2luZUxvY2FscyAgICAgICAqIGxvY2FsX3ZhcnM7Ci0gIAotICAgIGludAkJICAgICAgIG5fbGluZXM7Ci0gICAgaW50CQkgICAgICAgbGluZXNfYWxsb2M7Ci0gICAgV2luZUxpbmVObyAgICAgICAqIGxpbmV0YWI7Ci0KLSAgICBEQkdfQUREUiAgICAgICAgICAgYWRkcjsKLX07CiAKICNkZWZpbmUgREJHX0ZJWF9BRERSX1NFRyhhZGRyLGRlZmF1bHQpIFwKICAgICB7IGlmICgoYWRkciktPnNlZyA9PSAweGZmZmZmZmZmKSAoYWRkciktPnNlZyA9IChkZWZhdWx0KTsgXApAQCAtOTcsOCArMTIzLDE2IEBACiBlbnVtIGV4ZWNfbW9kZQogewogICAgIEVYRUNfQ09OVCwgICAgICAgLyogQ29udGludW91cyBleGVjdXRpb24gKi8KLSAgICBFWEVDX1NURVBfT1ZFUiwgIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsICovCi0gICAgRVhFQ19TVEVQX0lOU1RSICAvKiBTaW5nbGUtc3RlcHBpbmcgYW4gaW5zdHJ1Y3Rpb24gKi8KKyAgICBFWEVDX1NURVBfT1ZFUiwgIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsIHRvIG5leHQgc291cmNlIGxpbmUgKi8KKyAgICBFWEVDX1NURVBfSU5TVFIsICAvKiBTdGVwIHRvIG5leHQgc291cmNlIGxpbmUsIHN0ZXBwaW5nIGluIGlmIG5lZWRlZCAqLworICAgIEVYRUNfU1RFUElfT1ZFUiwgIC8qIFN0ZXBwaW5nIG92ZXIgYSBjYWxsICovCisgICAgRVhFQ19TVEVQSV9JTlNUUiwgIC8qIFNpbmdsZS1zdGVwcGluZyBhbiBpbnN0cnVjdGlvbiAqLworICAgIEVYRUNfRklOSVNILAkJLyogU3RlcCB1bnRpbCB3ZSBleGl0IGN1cnJlbnQgZnJhbWUgKi8KKyAgICBFWEVDX1NURVBfT1ZFUl9UUkFNUE9MSU5FICAvKiBTdGVwIG92ZXIgdHJhbXBvbGluZS4gIFJlcXVpcmVzIHRoYXQKKwkJCQkqIHdlIGRpZyB0aGUgcmVhbCByZXR1cm4gdmFsdWUgb2ZmIHRoZSBzdGFjaworCQkJCSogYW5kIHNldCBicmVha3BvaW50IHRoZXJlIC0gbm90IGF0IHRoZQorCQkJCSogaW5zdHIganVzdCBhZnRlciB0aGUgY2FsbC4KKwkJCQkqLwogfTsKIAogZXh0ZXJuIENPTlRFWFQgREVCVUdfY29udGV4dDsgIC8qIGRlYnVnZ2VyL3JlZ2lzdGVycy5jICovCkBAIC0xMTIsNDAgKzE0Niw5MSBAQAogZXh0ZXJuIHZvaWQgREVCVUdfRW5hYmxlQnJlYWtwb2ludCggaW50IG51bSwgQk9PTDMyIGVuYWJsZSApOwogZXh0ZXJuIHZvaWQgREVCVUdfSW5mb0JyZWFrcG9pbnRzKHZvaWQpOwogZXh0ZXJuIEJPT0wzMiBERUJVR19IYW5kbGVUcmFwKHZvaWQpOwotZXh0ZXJuIEJPT0wzMiBERUJVR19TaG91bGRDb250aW51ZSggZW51bSBleGVjX21vZGUgbW9kZSApOwotZXh0ZXJuIHZvaWQgREVCVUdfUmVzdGFydEV4ZWN1dGlvbiggZW51bSBleGVjX21vZGUgbW9kZSwgaW50IGluc3RyX2xlbiApOworZXh0ZXJuIEJPT0wzMiBERUJVR19TaG91bGRDb250aW51ZSggZW51bSBleGVjX21vZGUgbW9kZSwgaW50ICogY291bnQgKTsKK2V4dGVybiBlbnVtIGV4ZWNfbW9kZSBERUJVR19SZXN0YXJ0RXhlY3V0aW9uKCBlbnVtIGV4ZWNfbW9kZSBtb2RlLCBpbnQgY291bnQgKTsKK2V4dGVybiBCT09MMzIgREVCVUdfSXNGY3RSZXR1cm4odm9pZCk7CiAKICAgLyogZGVidWdnZXIvZGJfZGlzYXNtLmMgKi8KLWV4dGVybiB2b2lkIERFQlVHX0Rpc2FzbSggREJHX0FERFIgKmFkZHIgKTsKK2V4dGVybiB2b2lkIERFQlVHX0Rpc2FzbSggREJHX0FERFIgKmFkZHIsIGludCBkaXNwbGF5ICk7CisKKyAgLyogZGVidWdnZXIvZXhwci5jICovCitleHRlcm4gdm9pZCBERUJVR19GcmVlRXhwck1lbSh2b2lkKTsKK3N0cnVjdCBleHByICogREVCVUdfUmVnaXN0ZXJFeHByKGVudW0gZGVidWdfcmVncyk7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1N5bWJvbEV4cHIoY29uc3QgY2hhciAqIG5hbWUpOworc3RydWN0IGV4cHIgKiBERUJVR19Db25zdEV4cHIoaW50IHZhbCk7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1N0cmluZ0V4cHIoY29uc3QgY2hhciAqIHN0cik7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1NlZ0FkZHIoc3RydWN0IGV4cHIgKiwgc3RydWN0IGV4cHIgKik7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1VTQ29uc3RFeHByKHVuc2lnbmVkIGludCB2YWwpOworc3RydWN0IGV4cHIgKiBERUJVR19CaW5vcEV4cHIoaW50IG9wZXIsIHN0cnVjdCBleHByICosIHN0cnVjdCBleHByICopOworc3RydWN0IGV4cHIgKiBERUJVR19Vbm9wRXhwcihpbnQgb3Blciwgc3RydWN0IGV4cHIgKik7CitzdHJ1Y3QgZXhwciAqIERFQlVHX1N0cnVjdFBFeHByKHN0cnVjdCBleHByICosIGNvbnN0IGNoYXIgKiBlbGVtZW50KTsKK3N0cnVjdCBleHByICogREVCVUdfU3RydWN0RXhwcihzdHJ1Y3QgZXhwciAqLCBjb25zdCBjaGFyICogZWxlbWVudCk7CitzdHJ1Y3QgZXhwciAqIERFQlVHX0FycmF5RXhwcihzdHJ1Y3QgZXhwciAqLCBzdHJ1Y3QgZXhwciAqIGluZGV4KTsKK3N0cnVjdCBleHByICogREVCVUdfQ2FsbEV4cHIoY29uc3QgY2hhciAqLCBpbnQgbmFyZ3MsIC4uLik7CitleHRlcm4gICBpbnQgIERFQlVHX0V4cHJWYWx1ZShEQkdfQUREUiAqLCB1bnNpZ25lZCBpbnQgKik7CitEQkdfQUREUiBERUJVR19FdmFsRXhwcihzdHJ1Y3QgZXhwciAqKTsKK2V4dGVybiBpbnQgREVCVUdfQWRkRGlzcGxheShzdHJ1Y3QgZXhwciAqIGV4cCk7CitleHRlcm4gaW50IERFQlVHX0RlbERpc3BsYXkoaW50IGRpc3BsYXludW0pOworZXh0ZXJuIHN0cnVjdCBleHByICogREVCVUdfQ2xvbmVFeHByKHN0cnVjdCBleHByICogZXhwKTsKK2V4dGVybiBpbnQgREVCVUdfRnJlZUV4cHIoc3RydWN0IGV4cHIgKiBleHApOworZXh0ZXJuIGludCBERUJVR19EaXNwbGF5RXhwcihzdHJ1Y3QgZXhwciAqIGV4cCk7CisKKyAgLyogbW9yZSBkZWJ1Z2dlci9icmVhay5jICovCitleHRlcm4gaW50IERFQlVHX0FkZEJQQ29uZGl0aW9uKGludCBicG51bSwgc3RydWN0IGV4cHIgKiBleHApOworCisgIC8qIGRlYnVnZ2VyL2Rpc3BsYXkuYyAqLworZXh0ZXJuIGludCBERUJVR19Eb0Rpc3BsYXkodm9pZCk7CitleHRlcm4gaW50IERFQlVHX0FkZERpc3BsYXkoc3RydWN0IGV4cHIgKiBleHApOworZXh0ZXJuIGludCBERUJVR19Eb0Rpc3BsYXkodm9pZCk7CitleHRlcm4gaW50IERFQlVHX0RlbERpc3BsYXkoaW50IGRpc3BsYXludW0pOworZXh0ZXJuIGludCBERUJVR19JbmZvRGlzcGxheSh2b2lkKTsKIAogICAvKiBkZWJ1Z2dlci9oYXNoLmMgKi8KIGV4dGVybiBzdHJ1Y3QgbmFtZV9oYXNoICogREVCVUdfQWRkU3ltYm9sKCBjb25zdCBjaGFyICpuYW1lLCAKIAkJCQkJICAgY29uc3QgREJHX0FERFIgKmFkZHIsCisJCQkJCSAgIGNvbnN0IGNoYXIgKiBzb3VyY2VmaWxlLAorCQkJCQkgICBpbnQgZmxhZ3MpOworZXh0ZXJuIHN0cnVjdCBuYW1lX2hhc2ggKiBERUJVR19BZGRJbnZTeW1ib2woIGNvbnN0IGNoYXIgKm5hbWUsIAorCQkJCQkgICBjb25zdCBEQkdfQUREUiAqYWRkciwKIAkJCQkJICAgY29uc3QgY2hhciAqIHNvdXJjZWZpbGUpOwogZXh0ZXJuIEJPT0wzMiBERUJVR19HZXRTeW1ib2xWYWx1ZSggY29uc3QgY2hhciAqIG5hbWUsIGNvbnN0IGludCBsaW5lbm8sCi0JCQkJICAgIERCR19BRERSICphZGRyICk7CisJCQkJICAgIERCR19BRERSICphZGRyLCBpbnQgKTsKIGV4dGVybiBCT09MMzIgREVCVUdfU2V0U3ltYm9sVmFsdWUoIGNvbnN0IGNoYXIgKiBuYW1lLCBjb25zdCBEQkdfQUREUiAqYWRkciApOwogZXh0ZXJuIGNvbnN0IGNoYXIgKiBERUJVR19GaW5kTmVhcmVzdFN5bWJvbCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBmbGFnLAogCQkJCQkgICAgIHN0cnVjdCBuYW1lX2hhc2ggKiogcnRuLAotCQkJCQkgICAgIHVuc2lnbmVkIGludCBlYnApOworCQkJCQkgICAgIHVuc2lnbmVkIGludCBlYnAsCisJCQkJCSAgICAgc3RydWN0IGxpc3RfaWQgKiBzb3VyY2UpOwogZXh0ZXJuIHZvaWQgREVCVUdfUmVhZFN5bWJvbFRhYmxlKCBjb25zdCBjaGFyICogZmlsZW5hbWUgKTsKIGV4dGVybiB2b2lkIERFQlVHX0xvYWRFbnRyeVBvaW50cyh2b2lkKTsKIGV4dGVybiB2b2lkIERFQlVHX0FkZExpbmVOdW1iZXIoIHN0cnVjdCBuYW1lX2hhc2ggKiBmdW5jLCBpbnQgbGluZV9udW0sIAogCQkgICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0ICk7Ci1leHRlcm4gdm9pZCBERUJVR19BZGRMb2NhbCggc3RydWN0IG5hbWVfaGFzaCAqIGZ1bmMsIGludCByZWdubywgCitleHRlcm4gc3RydWN0IHdpbmVfbG9jYWxzICoKKyAgICAgICAgICAgIERFQlVHX0FkZExvY2FsKCBzdHJ1Y3QgbmFtZV9oYXNoICogZnVuYywgaW50IHJlZ25vLCAKIAkJCSAgICBpbnQgb2Zmc2V0LAogCQkJICAgIGludCBwY19zdGFydCwKIAkJCSAgICBpbnQgcGNfZW5kLAogCQkJICAgIGNoYXIgKiBuYW1lKTsKK2V4dGVybiBpbnQgREVCVUdfQ2hlY2tMaW5lbm9TdGF0dXMoY29uc3QgREJHX0FERFIgKmFkZHIpOworZXh0ZXJuIHZvaWQgREVCVUdfR2V0RnVuY0luZm8oc3RydWN0IGxpc3RfaWQgKiByZXQsIGNvbnN0IGNoYXIgKiBmaWxlLCAKKwkJCSAgICAgIGNvbnN0IGNoYXIgKiBmdW5jKTsKK2V4dGVybiBpbnQgREVCVUdfU2V0U3ltYm9sU2l6ZShzdHJ1Y3QgbmFtZV9oYXNoICogc3ltLCB1bnNpZ25lZCBpbnQgbGVuKTsKK2V4dGVybiBpbnQgREVCVUdfU2V0U3ltYm9sQlBPZmYoc3RydWN0IG5hbWVfaGFzaCAqIHN5bSwgdW5zaWduZWQgaW50IGxlbik7CitleHRlcm4gaW50IERFQlVHX0dldFN5bWJvbEFkZHIoc3RydWN0IG5hbWVfaGFzaCAqIHN5bSwgREJHX0FERFIgKiBhZGRyKTsKK2V4dGVybiBpbnQgREVCVUdfY21wX3N5bShjb25zdCB2b2lkICogcDEsIGNvbnN0IHZvaWQgKiBwMik7CitleHRlcm4gQk9PTDMyIERFQlVHX0dldExpbmVOdW1iZXJBZGRyKCBzdHJ1Y3QgbmFtZV9oYXNoICosIGNvbnN0IGludCBsaW5lbm8sIAorCQkJCURCR19BRERSICphZGRyLCBpbnQgYnBfZmxhZyApOwogCitleHRlcm4gaW50IERFQlVHX1NldExvY2FsU3ltYm9sVHlwZShzdHJ1Y3Qgd2luZV9sb2NhbHMgKiBzeW0sIAorCQkJCSAgICBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlKTsKK0JPT0wzMiBERUJVR19Ob3JtYWxpemUoc3RydWN0IG5hbWVfaGFzaCAqIG5oICk7CiAKICAgLyogZGVidWdnZXIvaW5mby5jICovCi1leHRlcm4gdm9pZCBERUJVR19QcmludCggY29uc3QgREJHX0FERFIgKmFkZHIsIGludCBjb3VudCwgY2hhciBmb3JtYXQgKTsKLWV4dGVybiBzdHJ1Y3QgbmFtZV9oYXNoICogREVCVUdfUHJpbnRBZGRyZXNzKCBjb25zdCBEQkdfQUREUiAqYWRkciwgCitleHRlcm4gdm9pZCBERUJVR19QcmludEJhc2ljKCBjb25zdCBEQkdfQUREUiAqYWRkciwgaW50IGNvdW50LCBjaGFyIGZvcm1hdCApOworZXh0ZXJuIHN0cnVjdCBzeW1ib2xfaW5mbyBERUJVR19QcmludEFkZHJlc3MoIGNvbnN0IERCR19BRERSICphZGRyLCAKIAkJCQkJICAgICAgaW50IGFkZHJsZW4sIGludCBmbGFnICk7CiBleHRlcm4gdm9pZCBERUJVR19IZWxwKHZvaWQpOwotZXh0ZXJuIHZvaWQgREVCVUdfTGlzdCggREJHX0FERFIgKmFkZHIsIGludCBjb3VudCApOwotZXh0ZXJuIHN0cnVjdCBuYW1lX2hhc2ggKiBERUJVR19QcmludEFkZHJlc3NBbmRBcmdzKCBjb25zdCBEQkdfQUREUiAqYWRkciwgCitleHRlcm4gdm9pZCBERUJVR19IZWxwSW5mbyh2b2lkKTsKK2V4dGVybiBzdHJ1Y3Qgc3ltYm9sX2luZm8gREVCVUdfUHJpbnRBZGRyZXNzQW5kQXJncyggY29uc3QgREJHX0FERFIgKmFkZHIsIAogCQkJCQkJICAgICBpbnQgYWRkcmxlbiwgCiAJCQkJCQkgICAgIHVuc2lnbmVkIGludCBlYnAsIAogCQkJCQkJICAgICBpbnQgZmxhZyApOwpAQCAtMTY0LDEzICsyNDksMTcgQEAKIGV4dGVybiBCT09MMzIgREVCVUdfVmFsaWRhdGVSZWdpc3RlcnModm9pZCk7CiBleHRlcm4gdm9pZCBERUJVR19TZXRTaWdDb250ZXh0KCBjb25zdCBTSUdDT05URVhUICpzaWdjb250ZXh0ICk7CiBleHRlcm4gdm9pZCBERUJVR19HZXRTaWdDb250ZXh0KCBTSUdDT05URVhUICpzaWdjb250ZXh0ICk7CitleHRlcm4gaW50IERFQlVHX1ByaW50UmVnaXN0ZXIoZW51bSBkZWJ1Z19yZWdzIHJlZyk7CiAKICAgLyogZGVidWdnZXIvc3RhY2suYyAqLwogZXh0ZXJuIHZvaWQgREVCVUdfSW5mb1N0YWNrKHZvaWQpOwogZXh0ZXJuIHZvaWQgREVCVUdfQmFja1RyYWNlKHZvaWQpOwotZXh0ZXJuIEJPT0wzMiBERUJVR19HZXRTdGFja1N5bWJvbFZhbHVlKCBjb25zdCBjaGFyICogbmFtZSwgREJHX0FERFIgKmFkZHIgKTsKK2V4dGVybiB2b2lkIERFQlVHX1NpbGVudEJhY2tUcmFjZSh2b2lkKTsKIGV4dGVybiBpbnQgIERFQlVHX0luZm9Mb2NhbHModm9pZCk7CiBleHRlcm4gaW50ICBERUJVR19TZXRGcmFtZShpbnQgbmV3ZnJhbWUpOworZXh0ZXJuIGludCAgREVCVUdfR2V0Q3VycmVudEZyYW1lKHN0cnVjdCBuYW1lX2hhc2ggKiogbmFtZSwgCisJCQkJICB1bnNpZ25lZCBpbnQgKiBlaXAsCisJCQkJICB1bnNpZ25lZCBpbnQgKiBlYnApOwogCiAgIC8qIGRlYnVnZ2VyL3N0YWJzLmMgKi8KIGV4dGVybiBpbnQgREVCVUdfUmVhZEV4ZWN1dGFibGVEYmdJbmZvKHZvaWQpOwpAQCAtMTc5LDYgKzI2OCw0MiBAQAogZXh0ZXJuIGludCBERUJVR19SZWdpc3RlckRlYnVnSW5mbyhpbnQsIHN0cnVjdCBwZV9kYXRhICpwZSwKIAkJCQkgICBpbnQsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBERUJVR19Qcm9jZXNzRGVmZXJyZWREZWJ1Zyh2b2lkKTsKK2V4dGVybiBpbnQgREVCVUdfUmVnaXN0ZXJFTEZEZWJ1Z0luZm8oaW50IGxvYWRfYWRkciwgdV9sb25nIHNpemUsIGNoYXIgKiBuYW1lKTsKK2V4dGVybiB2b2lkIERFQlVHX0luZm9TaGFyZSh2b2lkKTsKK2V4dGVybiB2b2lkIERFQlVHX0luaXRDVkRhdGFUeXBlcyh2b2lkKTsKKworICAvKiBkZWJ1Z2dlci90eXBlcy5jICovCitleHRlcm4gdm9pZCBERUJVR19Jbml0VHlwZXModm9pZCk7CitleHRlcm4gc3RydWN0IGRhdGF0eXBlICogREVCVUdfTmV3RGF0YVR5cGUoZW51bSBkZWJ1Z190eXBlIHh0eXBlLCAKKwkJCQkJICAgY29uc3QgY2hhciAqIHR5cGVuYW1lKTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgCitERUJVR19UeXBlRGVyZWZQb2ludGVyKERCR19BRERSICogYWRkciwgc3RydWN0IGRhdGF0eXBlICoqIG5ld3R5cGUpOworZXh0ZXJuIGludCBERUJVR19BZGRTdHJ1Y3RFbGVtZW50KHN0cnVjdCBkYXRhdHlwZSAqIGR0LCAKKwkJCQkgIGNoYXIgKiBuYW1lLCBzdHJ1Y3QgZGF0YXR5cGUgKiB0eXBlLCAKKwkJCQkgIGludCBvZmZzZXQsIGludCBzaXplKTsKK2V4dGVybiBpbnQgREVCVUdfU2V0U3RydWN0U2l6ZShzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgaW50IHNpemUpOworZXh0ZXJuIGludCBERUJVR19TZXRQb2ludGVyVHlwZShzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgc3RydWN0IGRhdGF0eXBlICogZHQyKTsKK2V4dGVybiBpbnQgREVCVUdfU2V0QXJyYXlQYXJhbXMoc3RydWN0IGRhdGF0eXBlICogZHQsIGludCBtaW4sIGludCBtYXgsCisJCQkJc3RydWN0IGRhdGF0eXBlICogZHQyKTsKK2V4dGVybiB2b2lkIERFQlVHX1ByaW50KCBjb25zdCBEQkdfQUREUiAqYWRkciwgaW50IGNvdW50LCBjaGFyIGZvcm1hdCwgaW50IGxldmVsICk7CitleHRlcm4gdW5zaWduZWQgaW50IERFQlVHX0ZpbmRTdHJ1Y3RFbGVtZW50KERCR19BRERSICogYWRkciwgCisJCQkJCSAgICBjb25zdCBjaGFyICogZWxlX25hbWUsIGludCAqIHRtcGJ1Zik7CitleHRlcm4gc3RydWN0IGRhdGF0eXBlICogREVCVUdfR2V0UG9pbnRlclR5cGUoc3RydWN0IGRhdGF0eXBlICogZHQpOworZXh0ZXJuIGludCBERUJVR19HZXRPYmplY3RTaXplKHN0cnVjdCBkYXRhdHlwZSAqIGR0KTsKK2V4dGVybiB1bnNpZ25lZCBpbnQgREVCVUdfQXJyYXlJbmRleChEQkdfQUREUiAqIGFkZHIsIERCR19BRERSICogcmVzdWx0LCBpbnQgaW5kZXgpOworZXh0ZXJuIHN0cnVjdCBkYXRhdHlwZSAqIERFQlVHX0ZpbmRPck1ha2VQb2ludGVyVHlwZShzdHJ1Y3QgZGF0YXR5cGUgKiByZWZ0eXBlKTsKK2V4dGVybiBsb25nIGxvbmcgaW50IERFQlVHX0dldEV4cHJWYWx1ZShEQkdfQUREUiAqIGFkZHIsIGNoYXIgKiogZm9ybWF0KTsKK2V4dGVybiBpbnQgREVCVUdfU2V0Qml0ZmllbGRQYXJhbXMoc3RydWN0IGRhdGF0eXBlICogZHQsIGludCBvZmZzZXQsIAorCQkJCSAgIGludCBuYml0cywgc3RydWN0IGRhdGF0eXBlICogZHQyKTsKK2V4dGVybiBpbnQgREVCVUdfQ29weUZpZWxkbGlzdChzdHJ1Y3QgZGF0YXR5cGUgKiBkdCwgc3RydWN0IGRhdGF0eXBlICogZHQyKTsKKworCisgIC8qIGRlYnVnZ2VyL3NvdXJjZS5jICovCitleHRlcm4gdm9pZCBERUJVR19TaG93RGlyKHZvaWQpOworZXh0ZXJuIHZvaWQgREVCVUdfQWRkUGF0aChjb25zdCBjaGFyICogcGF0aCk7CitleHRlcm4gdm9pZCBERUJVR19MaXN0KHN0cnVjdCBsaXN0X2lkICogbGluZTEsIHN0cnVjdCBsaXN0X2lkICogbGluZTIsICAKKwkJICAgICAgIGludCBkZWx0YSk7CitleHRlcm4gdm9pZCBERUJVR19OdWtlUGF0aCh2b2lkKTsKIAogICAvKiBkZWJ1Z2dlci9kYmcueSAqLwogZXh0ZXJuIHZvaWQgREVCVUdfRW50ZXJEZWJ1Z2dlcih2b2lkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGVza3RvcC5oIGIvaW5jbHVkZS9kZXNrdG9wLmgKaW5kZXggNDRjZWQzNi4uMTI5Zjk2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZXNrdG9wLmgKKysrIGIvaW5jbHVkZS9kZXNrdG9wLmgKQEAgLTQsOCArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaWZuZGVmIERFU0tUT1BfSAotI2RlZmluZSBERVNLVE9QX0gKKyNpZm5kZWYgX19XSU5FX0RFU0tUT1BfSAorI2RlZmluZSBfX1dJTkVfREVTS1RPUF9ICiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKQEAgLTIxLDQgKzIxLDQgQEAKIGV4dGVybiBMUkVTVUxUIERlc2t0b3BXbmRQcm9jKCBIV05EMzIgaHduZCwgVUlOVDMyIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1BBUkFNMzIgd1BhcmFtLCBMUEFSQU0gbFBhcmFtICk7CiAKLSNlbmRpZiAgLyogREVTS1RPUF9IICovCisjZW5kaWYgIC8qIF9fV0lORV9ERVNLVE9QX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZGlhbG9nLmggYi9pbmNsdWRlL2RpYWxvZy5oCmluZGV4IGI5Y2I1ZjQuLmE5ZGI3MmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGlhbG9nLmgKKysrIGIvaW5jbHVkZS9kaWFsb2cuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgRElBTE9HX0gKLSNkZWZpbmUgRElBTE9HX0gKKyNpZm5kZWYgX19XSU5FX0RJQUxPR19ICisjZGVmaW5lIF9fV0lORV9ESUFMT0dfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbnByb2MuaCIKQEAgLTQ0LDQgKzQ0LDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5ET1dQUk9DVFlQRSBwcm9jVHlwZSApOwogZXh0ZXJuIElOVDMyIERJQUxPR19Eb0RpYWxvZ0JveCggSFdORDMyIGh3bmQsIEhXTkQzMiBvd25lciApOwogCi0jZW5kaWYgIC8qIERJQUxPR19IICovCisjZW5kaWYgIC8qIF9fV0lORV9ESUFMT0dfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kbGdzLmggYi9pbmNsdWRlL2RsZ3MuaAppbmRleCBmNzExNmFjLi5jNzcyNTFmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RsZ3MuaAorKysgYi9pbmNsdWRlL2RsZ3MuaApAQCAtMiw4ICsyLDggQEAKICogZGxncy5oIC0gICAgICBDb21tb24gZGlhbG9nJ3MgZGlhbG9nIGNvbnRyb2wgSUQgbnVtYmVycyAgICAgICAgICAgICAgICAgICAgICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmbmRlZiBETEdTX0gKLSNkZWZpbmUgRExHU19ICisjaWZuZGVmIF9fV0lORV9ETEdTX0gKKyNkZWZpbmUgX19XSU5FX0RMR1NfSAogCiAjZGVmaW5lIGN0bEZpcnN0ICAgIDB4MDQwMAogI2RlZmluZSBjdGxMYXN0ICAgICAweDA0ZmYKQEAgLTE4Myw0ICsxODMsNCBAQAogI2RlZmluZSBGT1JNQVRETEdPUkQzMSAgIDE1NDMKICNkZWZpbmUgRk9STUFURExHT1JEMzAgICAxNTQ0CiAKLSNlbmRpZiAgLyogI2lmZGVmIERMR1NfSCAqLworI2VuZGlmICAvKiAjaWZkZWYgX19XSU5FX0RMR1NfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kb3NfZnMuaCBiL2luY2x1ZGUvZG9zX2ZzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjN2E3MTcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9kb3NfZnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBET1MgZmlsZSBzeXN0ZW0gZGVjbGFyYXRpb25zCi0gKgotICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCi0gKi8KLQotI2lmbmRlZiBfX1dJTkVfRE9TX0ZTX0gKLSNkZWZpbmUgX19XSU5FX0RPU19GU19ICi0KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSAid2luZG93cy5oIgotCi0jZGVmaW5lIE1BWF9QQVRITkFNRV9MRU4gICAxMDI0Ci0KLSNkZWZpbmUgSVNfRU5EX09GX05BTUUoY2gpICAoIShjaCkgfHwgKChjaCkgPT0gJy8nKSB8fCAoKGNoKSA9PSAnXFwnKSkKLQotZXh0ZXJuIHZvaWQgRE9TRlNfVG9Eb3NEYXRlVGltZSggdGltZV90IHVuaXh0aW1lLCBXT1JEICpwRGF0ZSwgV09SRCAqcFRpbWUgKTsKLWV4dGVybiB0aW1lX3QgRE9TRlNfRG9zRGF0ZVRpbWVUb1VuaXhUaW1lKFdPUkQsV09SRCk7Ci1leHRlcm4gY29uc3QgY2hhciAqRE9TRlNfVG9Eb3NGQ0JGb3JtYXQoIGNvbnN0IGNoYXIgKm5hbWUgKTsKLWV4dGVybiBjb25zdCBjaGFyICpET1NGU19Ub0Rvc0RUQUZvcm1hdCggY29uc3QgY2hhciAqbmFtZSApOwotZXh0ZXJuIGNvbnN0IGNoYXIgKkRPU0ZTX0lzRGV2aWNlKCBjb25zdCBjaGFyICpuYW1lICk7Ci1leHRlcm4gQk9PTDMyIERPU0ZTX0ZpbmRVbml4TmFtZSggY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpidWZmZXIsIGludCBtYXhsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGRyaXZlX2ZsYWdzICk7Ci1leHRlcm4gY29uc3QgY2hhciAqIERPU0ZTX0dldFVuaXhGaWxlTmFtZSggY29uc3QgY2hhciAqIG5hbWUsIGludCBjaGVja19sYXN0ICk7Ci1leHRlcm4gY29uc3QgY2hhciAqIERPU0ZTX0dldERvc1RydWVOYW1lKCBjb25zdCBjaGFyICpuYW1lLCBpbnQgdW5peF9mb3JtYXQgKTsKLWV4dGVybiBpbnQgRE9TRlNfR2V0RG9zRmlsZU5hbWUoIGNvbnN0IGNoYXIgKm5hbWUsIGNoYXIgKmJ1ZmZlciwgaW50IGxlbiApOwotZXh0ZXJuIHRpbWVfdCBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoIGNvbnN0IEZJTEVUSU1FICpmdCApOwotZXh0ZXJuIHZvaWQgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKHRpbWVfdCB1bml4dGltZSxMUEZJTEVUSU1FIGZ0KTsKLWV4dGVybiBpbnQgRE9TRlNfRmluZE5leHQoIGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnNob3J0X21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpsb25nX21hc2ssIGludCBkcml2ZSwgQllURSBhdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNraXAsIFdJTjMyX0ZJTkRfREFUQTMyQSAqZW50cnkgKTsKLQotI2VuZGlmIC8qIF9fV0lORV9ET1NfRlNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9kcml2ZXIuaCBiL2luY2x1ZGUvZHJpdmVyLmgKaW5kZXggYTAzMzgwMi4uMTZlZTBlMiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kcml2ZXIuaAorKysgYi9pbmNsdWRlL2RyaXZlci5oCkBAIC0yLDYgKzIsOSBAQAogICogRHJpdmVycyBkZWZpbml0aW9ucwogICovCiAKKyNpZm5kZWYgX19XSU5FX0RSSVZFUl9ICisjZGVmaW5lIF9fV0lORV9EUklWRVJfSAorCiAjZGVmaW5lIERSVl9MT0FEICAgICAgICAgICAgICAgIDB4MDAwMQogI2RlZmluZSBEUlZfRU5BQkxFICAgICAgICAgICAgICAweDAwMDIKICNkZWZpbmUgRFJWX09QRU4gICAgICAgICAgICAgICAgMHgwMDAzCkBAIC02NCw1ICs2Nyw0IEBACiBIRFJWUjE2IEdldE5leHREcml2ZXIoSERSVlIxNiwgRFdPUkQpOwogQk9PTDE2IEdldERyaXZlckluZm8oSERSVlIxNiwgRFJJVkVSSU5GT1NUUlVDVDE2ICopOwogCi0KLQorI2VuZGlmICAvKiBfX1dJTkVfRFJJVkVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmlsZS5oIGIvaW5jbHVkZS9maWxlLmgKaW5kZXggNDg1NmRmNi4uYTJiZDM3NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9maWxlLmgKKysrIGIvaW5jbHVkZS9maWxlLmgKQEAgLTcsOSArNywyMyBAQAogI2lmbmRlZiBfX1dJTkVfRklMRV9ICiAjZGVmaW5lIF9fV0lORV9GSUxFX0gKIAorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiaGFuZGxlMzIuaCIKIAorI2RlZmluZSBNQVhfUEFUSE5BTUVfTEVOICAgMTAyNAorCisvKiBEZWZpbml0aW9uIG9mIGEgZnVsbCBET1MgZmlsZSBuYW1lICovCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNoYXIgIGxvbmdfbmFtZVtNQVhfUEFUSE5BTUVfTEVOXTsgIC8qIExvbmcgcGF0aG5hbWUgaW4gVW5peCBmb3JtYXQgKi8KKyAgICBjaGFyICBzaG9ydF9uYW1lW01BWF9QQVRITkFNRV9MRU5dOyAvKiBTaG9ydCBwYXRobmFtZSBpbiBET1MgOC4zIGZvcm1hdCAqLworICAgIGludCAgIGRyaXZlOworfSBET1NfRlVMTF9OQU1FOworCisjZGVmaW5lIElTX0VORF9PRl9OQU1FKGNoKSAgKCEoY2gpIHx8ICgoY2gpID09ICcvJykgfHwgKChjaCkgPT0gJ1xcJykpCisKKwogLyogZmlsZXMvZmlsZS5jICovCiBleHRlcm4gdm9pZCBGSUxFX0Rlc3Ryb3koIEszMk9CSiAqcHRyICk7CiBleHRlcm4gdm9pZCBGSUxFX1NldERvc0Vycm9yKHZvaWQpOwpAQCAtMjksNyArNDMsMjEgQEAKIGV4dGVybiBVSU5UMzIgRElSX0dldERvc1BhdGgoIElOVDMyIGVsZW1lbnQsIExQU1RSIHBhdGgsIFVJTlQzMiBjb3VudCApOwogZXh0ZXJuIFVJTlQzMiBESVJfR2V0VW5peFBhdGgoIElOVDMyIGVsZW1lbnQsIExQU1RSIHBhdGgsIFVJTlQzMiBjb3VudCApOwogZXh0ZXJuIERXT1JEIERJUl9TZWFyY2hQYXRoKCBMUENTVFIgcGF0aCwgTFBDU1RSIG5hbWUsIExQQ1NUUiBleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIGJ1ZmxlbiwgTFBTVFIgYnVmZmVyLCBMUFNUUiAqbGFzdHBhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiB3aW4zMiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBET1NfRlVMTF9OQU1FICpmdWxsX25hbWUsIEJPT0wzMiB3aW4zMiApOworCisvKiBmaWxlcy9kb3NfZnMuYyAqLworZXh0ZXJuIHZvaWQgRE9TRlNfVW5peFRpbWVUb0ZpbGVUaW1lKCB0aW1lX3QgdW5peHRpbWUsIExQRklMRVRJTUUgZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIHJlbWFpbmRlciApOworZXh0ZXJuIHRpbWVfdCBET1NGU19GaWxlVGltZVRvVW5peFRpbWUoIGNvbnN0IEZJTEVUSU1FICpmdCwgRFdPUkQgKnJlbWFpbmRlciApOworZXh0ZXJuIEJPT0wzMiBET1NGU19Ub0Rvc0ZDQkZvcm1hdCggTFBDU1RSIG5hbWUsIExQU1RSIGJ1ZmZlciApOworZXh0ZXJuIGNvbnN0IGNoYXIgKkRPU0ZTX0lzRGV2aWNlKCBjb25zdCBjaGFyICpuYW1lICk7CitleHRlcm4gQk9PTDMyIERPU0ZTX0ZpbmRVbml4TmFtZSggTFBDU1RSIHBhdGgsIExQQ1NUUiBuYW1lLCBMUFNUUiBsb25nX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBsb25nX2xlbiwgTFBTVFIgc2hvcnRfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wzMiBpZ25vcmVfY2FzZSApOworZXh0ZXJuIEJPT0wzMiBET1NGU19HZXRGdWxsTmFtZSggTFBDU1RSIG5hbWUsIEJPT0wzMiBjaGVja19sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9TX0ZVTExfTkFNRSAqZnVsbCApOworZXh0ZXJuIGludCBET1NGU19GaW5kTmV4dCggY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc2hvcnRfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxvbmdfbWFzaywgaW50IGRyaXZlLCBCWVRFIGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpcCwgV0lOMzJfRklORF9EQVRBMzJBICplbnRyeSApOwogCiAjZW5kaWYgIC8qIF9fV0lORV9GSUxFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ2RpLmggYi9pbmNsdWRlL2dkaS5oCmluZGV4IGIwMDk4OGUuLmFkNDg4NDkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZ2RpLmgKKysrIGIvaW5jbHVkZS9nZGkuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTkzIEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgR0RJX0gKLSNkZWZpbmUgR0RJX0gKKyNpZm5kZWYgX19XSU5FX0dESV9ICisjZGVmaW5lIF9fV0lORV9HRElfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImxkdC5oIgpAQCAtMTU4LDE0ICsxNTgsMTEgQEAKICAgICBJTlQzMiAgICAgICgqcEV4Y2x1ZGVWaXNSZWN0KShEQyosSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwRXh0Rmxvb2RGaWxsKShEQyosSU5UMzIsSU5UMzIsQ09MT1JSRUYsVUlOVDMyKTsKICAgICBCT09MMzIgICAgICgqcEV4dFRleHRPdXQpKERDKixJTlQzMixJTlQzMixVSU5UMzIsY29uc3QgUkVDVDMyKixMUENTVFIsVUlOVDMyLGNvbnN0IElOVDMyKik7Ci0gICAgQk9PTDMyICAgICAoKnBGaWxsUmduKShEQyosSFJHTjMyLEhCUlVTSDMyKTsKLSAgICBCT09MMzIgICAgICgqcEZsb29kRmlsbCkoREMqLElOVDMyLElOVDMyLENPTE9SUkVGKTsKLSAgICBCT09MMzIgICAgICgqcEZyYW1lUmduKShEQyosSFJHTjMyLEhCUlVTSDMyLElOVDMyLElOVDMyKTsKKyAgICBDT0xPUlJFRiAgICgqcEdldFBpeGVsKShEQyosSU5UMzIsSU5UMzIpOwogICAgIEJPT0wzMiAgICAgKCpwR2V0VGV4dEV4dGVudFBvaW50KShEQyosTFBDU1RSLElOVDMyLExQU0laRTMyKTsKICAgICBCT09MMzIgICAgICgqcEdldFRleHRNZXRyaWNzKShEQyosVEVYVE1FVFJJQzMyQSopOwogICAgIElOVDMyICAgICAgKCpwSW50ZXJzZWN0Q2xpcFJlY3QpKERDKixJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiAgICAgSU5UMzIgICAgICAoKnBJbnRlcnNlY3RWaXNSZWN0KShEQyosSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwotICAgIEJPT0wzMiAgICAgKCpwSW52ZXJ0UmduKShEQyosSFJHTjMyKTsKICAgICBCT09MMzIgICAgICgqcExpbmVUbykoREMqLElOVDMyLElOVDMyKTsKICAgICBCT09MMzIgICAgICgqcE1vdmVUb0V4KShEQyosSU5UMzIsSU5UMzIsTFBQT0lOVDMyKTsKICAgICBJTlQzMiAgICAgICgqcE9mZnNldENsaXBSZ24pKERDKixJTlQzMixJTlQzMik7CkBAIC0yMDgsNyArMjA1LDYgQEAKICAgICBCT09MMzIgICAgICgqcFNldFdpbmRvd09yZykoREMqLElOVDMyLElOVDMyKTsKICAgICBCT09MMzIgICAgICgqcFN0cmV0Y2hCbHQpKERDKixJTlQzMixJTlQzMixJTlQzMixJTlQzMixEQyosSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIsRFdPUkQpOwogICAgIElOVDMyICAgICAgKCpwU3RyZXRjaERJQml0cykoREMqLElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLElOVDMyLExQU1RSLExQQklUTUFQSU5GTyxXT1JELERXT1JEKTsKLSAgICBCT09MMzIgICAgICgqcFRleHRPdXQpKERDKixJTlQzMixJTlQzMixMUENTVFIsSU5UMzIpOwogfSBEQ19GVU5DVElPTlM7CiAKICAgLyogREMgaG9vayBjb2RlcyAqLwpAQCAtMjk5LDQgKzI5NSw0IEBACiBleHRlcm4gaW50IHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIHNjcmVlbkRlcHRoOwogZXh0ZXJuIGludCBkZXNrdG9wWCwgZGVza3RvcFk7ICAgLyogbWlzYy9tYWluLmMgKi8KIAotI2VuZGlmICAvKiBHRElfSCAqLworI2VuZGlmICAvKiBfX1dJTkVfR0RJX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaGFuZGxlMzIuaCBiL2luY2x1ZGUvaGFuZGxlMzIuaAppbmRleCBhNTg5MDkxLi43Njk5ZWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2hhbmRsZTMyLmgKKysrIGIvaW5jbHVkZS9oYW5kbGUzMi5oCkBAIC00Myw0NSArNDMsNCBAQAogZXh0ZXJuIHZvaWQgSzMyT0JKX0luY0NvdW50KCBLMzJPQkogKnB0ciApOwogZXh0ZXJuIHZvaWQgSzMyT0JKX0RlY0NvdW50KCBLMzJPQkogKnB0ciApOwogCi0KLS8qIFRoZSBfKl9PQkpFQ1Qgc3RydWN0dXJlcyBjb250YWluIGluZm9ybWF0aW9uIG5lZWRlZCBhYm91dCBlYWNoCi0gKiBwYXJ0aWN1bGFyIHR5cGUgb2YgaGFuZGxlLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBhIGNvbWJpbmF0aW9uIG9mCi0gKiBlcXVpdmFsZW50IFVOSVgtc3R5bGUgaGFuZGxlcy9kZXNjcmlwdG9ycyBhbmQgZ2VuZXJhbCBpbmZvcm1hdGlvbgotICogdGhhdCB0aGUgV2luMzIgQVBJIG1pZ2h0IHJlcXVlc3QuCi0gKgotICogVGhlIEtFUk5FTF9PQkpFQ1Qgc3RydWN0dXJlIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciBvZiBhbnkgc3BlY2lmaWMKLSAqIGtlcm5lbCBvYmplY3QgdHlwZSdzIHN0cnVjdHVyZS4KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gICAgdW5zaWduZWQgbG9uZyAgICAgICBtYWdpYzsKLX0gS0VSTkVMX09CSkVDVDsKLQotCi0vKiBPYmplY3QgbnVtYmVyIGRlZmluaXRpb25zLiAgVGhlc2UgbnVtYmVycyBhcmUgdXNlZCB0bwotICogdmFsaWRhdGUgdGhlIGtlcm5lbCBvYmplY3QgYnkgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZQotICogb2JqZWN0J3MgJ21hZ2ljJyB2YWx1ZS4KLSAgKi8KLSNkZWZpbmUgS0VSTkVMX09CSkVDVF9VTlVTRUQgICAgMjQwNDU1NDA0NlVMCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfVEhSRUFEICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDEpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfUFJPQ0VTUyAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDIpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfRklMRSAgICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDMpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfU0VNQVBIT1JFIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDQpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfRVZFTlQgICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDUpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfUkVHS0VZICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDYpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfRklMRU1BUCAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDcpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfVlJBTkdFICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDgpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfSEVBUCAgICAgIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDkpCi0jZGVmaW5lIEtFUk5FTF9PQkpFQ1RfSEVBUElURU0gIChLRVJORUxfT0JKRUNUX1VOVVNFRCArIDEwKQotCi0vKiBGdW5jdGlvbnMgZm9yIGNoZWNraW5nIGtlcm5lbCBvYmplY3RzLgotICovCi1pbnQgVmFsaWRhdGVLZXJuZWxPYmplY3QoS0VSTkVMX09CSkVDVCAqcHRyKTsKLQotLyogRm9yIG5vdywgQ3JlYXRlS2VybmVsT2JqZWN0IGFuZCBSZWxlYXNlS2VybmVsT2JqZWN0IHdpbGwKLSAqIHNpbXBseSBtYXAgdG8gbWFsbG9jKCkgYW5kIGZyZWUoKS4KLSAqLwotI2RlZmluZSBDcmVhdGVLZXJuZWxPYmplY3Qoc2l6ZSkgKG1hbGxvYyhzaXplKSkKLSNkZWZpbmUgUmVsZWFzZUtlcm5lbE9iamVjdChwdHIpIChmcmVlKHB0cikpCi0KICNlbmRpZiAvKiBfX1dJTkVfSEFORExFMzJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9semV4cGFuZC5oIGIvaW5jbHVkZS9semV4cGFuZC5oCmluZGV4IGIzNjgyNzIuLmEwMjY3OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbHpleHBhbmQuaAorKysgYi9pbmNsdWRlL2x6ZXhwYW5kLmgKQEAgLTMsNiArMyw5IEBACiAgKiBDb3B5cmlnaHQgMTk5NiBNYXJjdXMgTWVpc3NuZXIKICAqLwogCisjaWZuZGVmIF9fV0lORV9MWkVYUEFORF9ICisjZGVmaW5lIF9fV0lORV9MWkVYUEFORF9ICisKICNkZWZpbmUgTFpFUlJPUl9CQURJTkhBTkRMRQkweEZGRkYJLyogLTEgKi8KICNkZWZpbmUgTFpFUlJPUl9CQURPVVRIQU5ETEUJMHhGRkZFCS8qIC0yICovCiAjZGVmaW5lIExaRVJST1JfUkVBRAkJMHhGRkZECS8qIC0zICovCkBAIC0xMSwzICsxNCw1IEBACiAjZGVmaW5lIExaRVJST1JfR0xPQkxPQ0sJMHhGRkZBCS8qIC02ICovCiAjZGVmaW5lIExaRVJST1JfQkFEVkFMVUUJMHhGRkY5CS8qIC03ICovCiAjZGVmaW5lIExaRVJST1JfVU5LTk9XTkFMRwkweEZGRjgJLyogLTggKi8KKworI2VuZGlmICAvKiBfX1dJTkVfTFpFWFBBTkRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZGkuaCBiL2luY2x1ZGUvbWRpLmgKaW5kZXggNTY0YjQwYS4uNWRiNzViNiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZGkuaAorKysgYi9pbmNsdWRlL21kaS5oCkBAIC02LDggKzYsOCBAQAogICogTURJIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KICAqLwogCi0jaWZuZGVmIE1ESV9ICi0jZGVmaW5lIE1ESV9ICisjaWZuZGVmIF9fV0lORV9NRElfSAorI2RlZmluZSBfX1dJTkVfTURJX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIApAQCAtNDMsNSArNDMsNSBAQAogICAgIEhXTkQgICAJc2VsZjsKIH0gTURJQ0xJRU5USU5GTzsKIAotI2VuZGlmIC8qIE1ESV9IICovCisjZW5kaWYgLyogX19XSU5FX01ESV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVudS5oIGIvaW5jbHVkZS9tZW51LmgKaW5kZXggNGNkOTMxOC4uNjllZjg1MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZW51LmgKKysrIGIvaW5jbHVkZS9tZW51LmgKQEAgLTUsMTYgKzUsMTQgQEAKICNpZm5kZWYgX19XSU5FX01FTlVfSAogI2RlZmluZSBfX1dJTkVfTUVOVV9ICiAKLWV4dGVybiBCT09MIE1FTlVfSW5pdCh2b2lkKTsKLWV4dGVybiBITUVOVTE2IE1FTlVfR2V0RGVmU3lzTWVudSh2b2lkKTsKLWV4dGVybiB2b2lkIE1FTlVfSW5pdFN5c01lbnVQb3B1cChITUVOVTE2IGhtZW51LCBEV09SRCBzdHlsZSwgRFdPUkQgY2xzU3R5bGUpOwotZXh0ZXJuIFVJTlQgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EIGh3bmQsIFVJTlQgbWVudWJhcldpZHRoLAotCQkJCSAgIGludCBvcmdYLCBpbnQgb3JnWSApOwotZXh0ZXJuIHZvaWQgTUVOVV9UcmFja01vdXNlTWVudUJhciggV05EKiAsIElOVDE2IGh0LCBQT0lOVDE2IHB0ICk7Ci1leHRlcm4gdm9pZCBNRU5VX1RyYWNrS2JkTWVudUJhciggV05EKiwgVUlOVDE2IHdQYXJhbSwgSU5UMTYgdmtleSk7Ci1leHRlcm4gVUlOVCBNRU5VX0RyYXdNZW51QmFyKCBIREMzMiBoREMsIExQUkVDVDE2IGxwcmVjdCwKLQkJCSAgICAgIEhXTkQgaHduZCwgQk9PTCBzdXBwcmVzc19kcmF3ICk7Ci1leHRlcm4gTFJFU1VMVCBQb3B1cE1lbnVXbmRQcm9jKCBIV05EIGh3bmQsIFVJTlQgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApOworZXh0ZXJuIEJPT0wzMiBNRU5VX0luaXQodm9pZCk7CitleHRlcm4gSE1FTlUzMiBNRU5VX0dldERlZlN5c01lbnUodm9pZCk7CitleHRlcm4gdm9pZCBNRU5VX0luaXRTeXNNZW51UG9wdXAoSE1FTlUzMiBobWVudSwgRFdPUkQgc3R5bGUsIERXT1JEIGNsc1N0eWxlKTsKK2V4dGVybiBVSU5UMzIgTUVOVV9HZXRNZW51QmFySGVpZ2h0KCBIV05EMzIgaHduZCwgVUlOVDMyIG1lbnViYXJXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBvcmdYLCBJTlQzMiBvcmdZICk7CitleHRlcm4gdm9pZCBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCBXTkQgKnduZCwgSU5UMzIgaHQsIFBPSU5UMzIgcHQgKTsKK2V4dGVybiB2b2lkIE1FTlVfVHJhY2tLYmRNZW51QmFyKCBXTkQgKnduZCwgVUlOVDMyIHdQYXJhbSwgSU5UMzIgdmtleSApOworZXh0ZXJuIFVJTlQzMiBNRU5VX0RyYXdNZW51QmFyKCBIREMzMiBoREMsIExQUkVDVDMyIGxwcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFdORDMyIGh3bmQsIEJPT0wzMiBzdXBwcmVzc19kcmF3ICk7CiAKICNlbmRpZiAvKiBfX1dJTkVfTUVOVV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21ldGFmaWxlLmggYi9pbmNsdWRlL21ldGFmaWxlLmgKaW5kZXggMjJlMGI2MS4uYjUxMWZjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tZXRhZmlsZS5oCisrKyBiL2luY2x1ZGUvbWV0YWZpbGUuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAgRGF2aWQgVy4gTWV0Y2FsZmUsIDE5OTQKICAqLwogCi0jaWZuZGVmIE1FVEFGSUxFX0gKLSNkZWZpbmUgTUVUQUZJTEVfSAorI2lmbmRlZiBfX1dJTkVfTUVUQUZJTEVfSAorI2RlZmluZSBfX1dJTkVfTUVUQUZJTEVfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCkBAIC0zNyw1ICszNyw1IEBACiAJCSAgIHNob3J0IGhlaWdodERlc3QsIERDICpkY1NyYywgc2hvcnQgeFNyYywgc2hvcnQgeVNyYywgCiAJCSAgIHNob3J0IHdpZHRoU3JjLCBzaG9ydCBoZWlnaHRTcmMsIERXT1JEIHJvcCk7CiAKLSNlbmRpZiAgIC8qIE1FVEFGSUxFX0ggKi8KKyNlbmRpZiAgIC8qIF9fV0lORV9NRVRBRklMRV9IICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWV0YWZpbGVkcnYuaCBiL2luY2x1ZGUvbWV0YWZpbGVkcnYuaAppbmRleCA5MTAyN2E4Li5kZmI0YjkyIDEwMDY0NAotLS0gYS9pbmNsdWRlL21ldGFmaWxlZHJ2LmgKKysrIGIvaW5jbHVkZS9tZXRhZmlsZWRydi5oCkBAIC00Myw1ICs0MywzMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiB4RGVub20sIElOVDMyIHlOdW0sIElOVDMyIHlEZW5vbSApOwogZXh0ZXJuIEJPT0wzMiBNRkRSVl9TY2FsZVdpbmRvd0V4dCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeE51bSwgSU5UMzIgeERlbm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgeU51bSwgSU5UMzIgeURlbm9tICk7CitleHRlcm4gQk9PTDMyIE1GRFJWX01vdmVUb0V4KHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIExQUE9JTlQzMiBwdCk7CitleHRlcm4gQk9PTDMyIE1GRFJWX0xpbmVUbyggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeCwgSU5UMzIgeSApOworZXh0ZXJuIEJPT0wzMiBNRkRSVl9BcmMoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsCisJCQkgSU5UMzIgYm90dG9tLCBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwKKwkJCSBJTlQzMiB5ZW5kICk7CitleHRlcm4gQk9PTDMyIE1GRFJWX1BpZSggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwKKwkJCSBJTlQzMiBib3R0b20sIElOVDMyIHhzdGFydCwgSU5UMzIgeXN0YXJ0LCBJTlQzMiB4ZW5kLAorCQkJIElOVDMyIHllbmQgKTsKK2V4dGVybiBCT09MMzIgTUZEUlZfQ2hvcmQoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsCisJCQkgICBJTlQzMiBib3R0b20sIElOVDMyIHhzdGFydCwgSU5UMzIgeXN0YXJ0LCBJTlQzMiB4ZW5kLAorCQkJICAgSU5UMzIgeWVuZCApOworZXh0ZXJuIEJPT0wzMiBNRkRSVl9FbGxpcHNlKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsCisJCQkgICAgIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20gKTsKK2V4dGVybiBCT09MMzIgTUZEUlZfUmVjdGFuZ2xlKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsCisJCQkgICAgICAgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSk7CitleHRlcm4gQk9PTDMyIE1GRFJWX1JvdW5kUmVjdCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAorCQkJICAgICAgIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20sIElOVDMyIGVsbF93aWR0aCwKKwkJCSAgICAgICBJTlQzMiBlbGxfaGVpZ2h0ICk7CitleHRlcm4gQ09MT1JSRUYgTUZEUlZfU2V0UGl4ZWwoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksIENPTE9SUkVGIGNvbG9yICk7CitleHRlcm4gQk9PTDMyIE1GRFJWX1BvbHlsaW5lKCBzdHJ1Y3QgdGFnREMgKmRjLCBjb25zdCBMUFBPSU5UMzIgcHQsSU5UMzIgY291bnQpOworZXh0ZXJuIEJPT0wzMiBNRkRSVl9Qb2x5Z29uKCBzdHJ1Y3QgdGFnREMgKmRjLCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICk7CitleHRlcm4gQk9PTDMyIE1GRFJWX1BvbHlQb2x5Z29uKCBzdHJ1Y3QgdGFnREMgKmRjLCBMUFBPSU5UMzIgcHQsIExQSU5UMzIgY291bnRzLAorCQkJCSBVSU5UMzIgcG9seWdvbnMpOworZXh0ZXJuIEJPT0wzMiBNRkRSVl9FeHRGbG9vZEZpbGwoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksCisJCQkJICBDT0xPUlJFRiBjb2xvciwgVUlOVDMyIGZpbGxUeXBlICk7CitleHRlcm4gQk9PTDMyIE1GRFJWX0V4dFRleHRPdXQoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIHgsIElOVDMyIHksCisJCQkJVUlOVDMyIGZsYWdzLCBjb25zdCBSRUNUMzIgKmxwcmVjdCwgTFBDU1RSIHN0ciwKKwkJCQlVSU5UMzIgY291bnQsIGNvbnN0IElOVDMyICpscER4ICk7CiAKICNlbmRpZiAgLyogX19XSU5FX01FVEFGSUxFRFJWX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW1zeXN0ZW0uaCBiL2luY2x1ZGUvbW1zeXN0ZW0uaAppbmRleCA5MWU3ZWY1Li5jZDFjOWI3IDEwMDY0NAotLS0gYS9pbmNsdWRlL21tc3lzdGVtLmgKKysrIGIvaW5jbHVkZS9tbXN5c3RlbS5oCkBAIC0yLDggKzIsOCBAQAogICogTU1TWVNURU0gLSBNdWx0aW1lZGlhIFdpbmUgRXh0ZW5zaW9uIC4uLiA6LSkKICAqLwogCi0jaWZuZGVmIE1NU1lTVEVNX0gKLSNkZWZpbmUgTU1TWVNURU1fSAorI2lmbmRlZiBfX1dJTkVfTU1TWVNURU1fSAorI2RlZmluZSBfX1dJTkVfTU1TWVNURU1fSAogCiB0eXBlZGVmIExQU1RSCQkgICAgSFBTVFI7ICAgICAgICAgIC8qIGEgaHVnZSB2ZXJzaW9uIG9mIExQU1RSICovCiB0eXBlZGVmIExQQ1NUUgkJCUhQQ1NUUjsgICAgICAgICAvKiBhIGh1Z2UgdmVyc2lvbiBvZiBMUENTVFIgKi8KQEAgLTE1MzksNyArMTUzOSw0IEBACiBEV09SRCB3b2RNZXNzYWdlKFdPUkQgd0RldklELCBXT1JEIHdNc2csIERXT1JEIGR3VXNlciwgCiAJCQkJCURXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CiAKLSNlbmRpZiAvKiBNTVNZU1RFTV9IICovCi0KLQotCisjZW5kaWYgLyogX19XSU5FX01NU1lTVEVNX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbW9kdWxlLmggYi9pbmNsdWRlL21vZHVsZS5oCmluZGV4IGYzYTQ1MjIuLjNiNTIwMzkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbW9kdWxlLmgKKysrIGIvaW5jbHVkZS9tb2R1bGUuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgX1dJTkVfTU9EVUxFX0gKLSNkZWZpbmUgX1dJTkVfTU9EVUxFX0gKKyNpZm5kZWYgX19XSU5FX01PRFVMRV9ICisjZGVmaW5lIF9fV0lORV9NT0RVTEVfSAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgpAQCAtMTQwLDQgKzE0MCw0IEBACiBleHRlcm4gdm9pZCBORV9GaXh1cFByb2xvZ3MoIE5FX01PRFVMRSAqcE1vZHVsZSApOwogZXh0ZXJuIHZvaWQgTkVfSW5pdGlhbGl6ZURMTHMoIEhNT0RVTEUxNiBoTW9kdWxlICk7CiAKLSNlbmRpZiAgLyogX1dJTkVfTU9EVUxFX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX01PRFVMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL21zZG9zLmggYi9pbmNsdWRlL21zZG9zLmgKaW5kZXggMzU1YWVkNy4uMTExZmJjNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tc2Rvcy5oCisrKyBiL2luY2x1ZGUvbXNkb3MuaApAQCAtMSw1ICsxLDUgQEAKLSNpZm5kZWYgX19NU0RPU19ICi0jZGVmaW5lIF9fTVNET1NfSAorI2lmbmRlZiBfX1dJTkVfTVNET1NfSAorI2RlZmluZSBfX1dJTkVfTVNET1NfSAogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgpAQCAtMTU4LDQgKzE1OCw0IEBACiAjZGVmaW5lIEVMX1NlcmlhbCAgICAgICAgICAgIDB4MDQKICNkZWZpbmUgRUxfTWVtb3J5ICAgICAgICAgICAgMHgwNQogCi0jZW5kaWYgLyogX19NU0RPU19IICovCisjZW5kaWYgLyogX19XSU5FX01TRE9TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmVleGUuaCBiL2luY2x1ZGUvbmVleGUuaAppbmRleCA3Y2MzNmU0Li5lNDI1NTczIDEwMDY0NAotLS0gYS9pbmNsdWRlL25lZXhlLmgKKysrIGIvaW5jbHVkZS9uZWV4ZS5oCkBAIC0xLDEwICsxLDggQEAKLS8qICRJZDogbmVleGUuaCx2IDEuNCAxOTkzLzA3LzA0IDA0OjA0OjIxIHJvb3QgRXhwIHJvb3QgJAotICovCiAvKgogICogQ29weXJpZ2h0ICBSb2JlcnQgSi4gQW1zdGFkdCwgMTk5MwogICovCi0jaWZuZGVmIE5FRVhFX0gKLSNkZWZpbmUgTkVFWEVfSAorI2lmbmRlZiBfX1dJTkVfTkVFWEVfSAorI2RlZmluZSBfX1dJTkVfTkVFWEVfSAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKIApAQCAtMjI5LDQgKzIyNyw0IEBACiBpbnQgIGxvYWRfdHlwZWluZm8gIChpbnQsIHN0cnVjdCByZXNvdXJjZV90eXBlaW5mb19zICopOwogaW50ICBsb2FkX25hbWVpbmZvICAoaW50LCBzdHJ1Y3QgcmVzb3VyY2VfbmFtZWluZm9fcyAqKTsKIAotI2VuZGlmIC8qIE5FRVhFX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX05FRVhFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbm9uY2xpZW50LmggYi9pbmNsdWRlL25vbmNsaWVudC5oCmluZGV4IGU4YTU5ODAuLjY0YjhkYTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbm9uY2xpZW50LmgKKysrIGIvaW5jbHVkZS9ub25jbGllbnQuaApAQCAtMjEsNSArMjEsNyBAQAogZXh0ZXJuIExPTkcgTkNfSGFuZGxlTkNMQnV0dG9uRGJsQ2xrKCBXTkQgKnBXbmQsIFdQQVJBTTE2IHdQYXJhbSwgTFBBUkFNIGxQYXJhbSk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVTeXNDb21tYW5kKCBIV05EMzIgaHduZCwgV1BBUkFNMTYgd1BhcmFtLCBQT0lOVDE2IHB0ICk7CiBleHRlcm4gTE9ORyBOQ19IYW5kbGVTZXRDdXJzb3IoIEhXTkQzMiBod25kLCBXUEFSQU0xNiB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKK2V4dGVybiB2b2lkIE5DX0RyYXdTeXNCdXR0b24oIEhXTkQzMiBod25kLCBIREMzMiBoZGMsIEJPT0wzMiBkb3duICk7CitleHRlcm4gQk9PTDMyIE5DX0dldFN5c1BvcHVwUG9zKCBXTkQqIHduZFB0ciwgUkVDVDMyKiByZWN0ICk7CiAKICNlbmRpZiAvKiBfX1dJTkVfTk9OQ0xJRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb2xlMi5oIGIvaW5jbHVkZS9vbGUyLmgKaW5kZXggMTBhMTZlOS4uZDM4NTZkNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9vbGUyLmgKKysrIGIvaW5jbHVkZS9vbGUyLmgKQEAgLTIsNiArMiw5IEBACiAgKglvbGUyLmggLSBEZWNsYXJhdGlvbnMgZm9yIE9MRTIKICAqLwogCisjaWZuZGVmIF9fV0lORV9PTEUyX0gKKyNkZWZpbmUgX19XSU5FX09MRTJfSAorCiB0eXBlZGVmIExPTkcgSFJFU1VMVDsKIAogI2RlZmluZSBTX09LCTAKQEAgLTEwLDMgKzEzLDUgQEAKIC8qIE9MRSB2ZXJzaW9uICovCiAjZGVmaW5lIHJtbSAgICAgICAgICAgICAyMwogI2RlZmluZSBydXAgICAgICAgICAgICA2MzkKKworI2VuZGlmICAvKiBfX1dJTkVfT0xFMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IDllNDMwZmMuLjZmY2Y1NzAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC00LDggKzQsOCBAQAogICogQ29weXJpZ2h0IDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBPUFRJT05TX0gKLSNkZWZpbmUgT1BUSU9OU19ICisjaWZuZGVmIF9fV0lORV9PUFRJT05TX0gKKyNkZWZpbmUgX19XSU5FX09QVElPTlNfSAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKIApAQCAtNTAsNyArNTAsNyBAQAogICAgIGludCAgICBiYWNraW5nc3RvcmU7ICAgIC8qIFVzZSBiYWNraW5nIHN0b3JlICovCiAgICAgc2hvcnQgIGNtZFNob3c7CiAgICAgaW50ICAgIGRlYnVnOwotICAgIGludCAgICBhbGxvd1JlYWRPbmx5OyAgIC8qIE9wZW5pbmcgYSByZWFkIG9ubHkgZmlsZSB3aWxsIHN1Y2NlZWQgZXZlbgorICAgIGludCAgICBmYWlsUmVhZE9ubHk7ICAgIC8qIE9wZW5pbmcgYSByZWFkIG9ubHkgZmlsZSB3aWxsIGZhaWwKIAkJCSAgICAgICBpZiB3cml0ZSBhY2Nlc3MgaXMgcmVxdWVzdGVkICovCiAgICAgV0lORV9NT0RFIG1vZGU7ICAgICAgICAgLyogU3RhcnQgV2luZSBpbiBzZWxlY3RlZCBtb2RlCiAJCQkgICAgICAgKHN0YW5kYXJkL2VuaGFuY2VkKSAqLwpAQCAtNzAsNCArNzAsNCBAQAogZXh0ZXJuIGludCBQUk9GSUxFX0dldFdpbmVJbmlJbnQoIGNvbnN0IGNoYXIgKnNlY3Rpb24sIGNvbnN0IGNoYXIgKmtleV9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWYgKTsKIAotI2VuZGlmCisjZW5kaWYgIC8qIF9fV0lORV9PUFRJT05TX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcGVleGUuaCBiL2luY2x1ZGUvcGVleGUuaAppbmRleCBhN2Q1NDc0Li5jYTQ2ZTk3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3BlZXhlLmgKKysrIGIvaW5jbHVkZS9wZWV4ZS5oCkBAIC0yNTMsNCArMjUzLDIyIEBACiAjZGVmaW5lIElNQUdFX1JFTF9CQVNFRF9ISUdIQURKCQkJNAogI2RlZmluZSBJTUFHRV9SRUxfQkFTRURfTUlQU19KTVBBRERSCTUKIAorLyoKKyAqIFRoaXMgaXMgdGhlIHN0cnVjdHVyZSB0aGF0IGFwcGVhcnMgYXQgdGhlIHZlcnkgc3RhcnQgb2YgYSAuREJHIGZpbGUuCisgKi8KK3N0cnVjdCBQRV9EQkdfRmlsZUhlYWRlciB7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IFNpZ25hdHVyZTsKKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgRmxhZ3M7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IE1hY2hpbmU7CisgICAgdW5zaWduZWQgc2hvcnQgaW50IENoYXJhY3RlcmlzdGljczsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgVGltZURhdGVTdGFtcDsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgQ2hlY2tTdW07CisgICAgdW5zaWduZWQgaW50ICAgICAgIEltYWdlQmFzZTsKKyAgICB1bnNpZ25lZCBpbnQgICAgICAgU2l6ZU9mSW1hZ2U7CisgICAgdW5zaWduZWQgaW50ICAgICAgIE51bWJlck9mU2VjdGlvbnM7CisgICAgdW5zaWduZWQgaW50ICAgICAgIEV4cG9ydGVkTmFtZXNTaXplOworICAgIHVuc2lnbmVkIGludCAgICAgICBEZWJ1Z0RpcmVjdG9yeVNpemU7CisgICAgdW5zaWduZWQgaW50ICAgICAgIFJlc2VydmVkWyAzIF07Cit9OworCiAjZW5kaWYgLyogX19XSU5FX1BFRVhFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvcHJvY2Vzcy5oIGIvaW5jbHVkZS9wcm9jZXNzLmgKaW5kZXggY2E1NjcwYy4uMmMwMThlNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcm9jZXNzLmgKKysrIGIvaW5jbHVkZS9wcm9jZXNzLmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgogI2luY2x1ZGUgImhhbmRsZTMyLmgiCisjaW5jbHVkZSAidGFzay5oIgogCiAvKiBQcm9jZXNzIGhhbmRsZSBlbnRyeSAqLwogdHlwZWRlZiBzdHJ1Y3QKQEAgLTI5LDEzICszMCwxMyBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMUFNUUiAgICAgICAgICAgZW52aXJvbjsgICAgICAgICAgLyogMDAgUHJvY2VzcyBlbnZpcm9ubWVudCBzdHJpbmdzICovCi0gICAgRFdPUkQgICAgICAgICAgIHVua25vd24xOyAgICAgICAgIC8qIDA0IFVua25vd24gKi8KKyAgICBEV09SRCAgICAgICAgICAgZW52X3NpemU7ICAgICAgICAgLyogMDQgRW52aXJvbm1lbnQgc2l6ZSAod2FzOiBVbmtub3duKSAqLwogICAgIExQU1RSICAgICAgICAgICBjbWRfbGluZTsgICAgICAgICAvKiAwOCBDb21tYW5kIGxpbmUgKi8KICAgICBMUFNUUiAgICAgICAgICAgY3VyX2RpcjsgICAgICAgICAgLyogMGMgQ3VycmVudCBkaXJlY3RvcnkgKi8KICAgICBTVEFSVFVQSU5GTzMyQSAqc3RhcnR1cF9pbmZvOyAgICAgLyogMTAgU3RhcnR1cCBpbmZvcm1hdGlvbiAqLwotICAgIEhBTkRMRTMyICAgICAgICBoU3RkaW47ICAgICAgICAgICAgLyogMTQgSGFuZGxlIGZvciBzdGFuZGFyZCBpbnB1dCAqLwotICAgIEhBTkRMRTMyICAgICAgICBoU3Rkb3V0OyAgICAgICAgICAgLyogMTggSGFuZGxlIGZvciBzdGFuZGFyZCBvdXRwdXQgKi8KLSAgICBIQU5ETEUzMiAgICAgICAgaFN0ZGVycjsgICAgICAgICAgIC8qIDFjIEhhbmRsZSBmb3Igc3RhbmRhcmQgZXJyb3IgKi8KKyAgICBIQU5ETEUzMiAgICAgICAgaFN0ZGluOyAgICAgICAgICAgLyogMTQgSGFuZGxlIGZvciBzdGFuZGFyZCBpbnB1dCAqLworICAgIEhBTkRMRTMyICAgICAgICBoU3Rkb3V0OyAgICAgICAgICAvKiAxOCBIYW5kbGUgZm9yIHN0YW5kYXJkIG91dHB1dCAqLworICAgIEhBTkRMRTMyICAgICAgICBoU3RkZXJyOyAgICAgICAgICAvKiAxYyBIYW5kbGUgZm9yIHN0YW5kYXJkIGVycm9yICovCiAgICAgRFdPUkQgICAgICAgICAgIHVua25vd24yOyAgICAgICAgIC8qIDIwIFVua25vd24gKi8KICAgICBEV09SRCAgICAgICAgICAgaW5oZXJpdF9jb25zb2xlOyAgLyogMjQgSW5oZXJpdCBjb25zb2xlIGZsYWcgKi8KICAgICBEV09SRCAgICAgICAgICAgYnJlYWtfdHlwZTsgICAgICAgLyogMjggQ29uc29sZSBldmVudHMgZmxhZyAqLwpAQCAtNjYsNyArNjcsNyBAQAogICAgIEhBTkRMRTMyICAgICAgICAgc3lzdGVtX2hlYXA7ICAgICAgLyogMzQgU3lzdGVtIGhlYXAgdG8gYWxsb2NhdGUgaGFuZGxlcyAqLwogICAgIEhUQVNLMzIgICAgICAgICAgdGFzazsgICAgICAgICAgICAgLyogMzggV2luMTYgdGFzayAqLwogICAgIHZvaWQgICAgICAgICAgICAqbWVtX21hcF9maWxlczsgICAgLyogM2MgUG9pbnRlciB0byBtZW0tbWFwcGVkIGZpbGVzICovCi0gICAgRU5WREIgICAgICAgICAgICplbnZfREI7ICAgICAgICAgICAvKiA0MCBFbnZpcm9ubWVudCBkYXRhYmFzZSAqLworICAgIEVOVkRCICAgICAgICAgICAqZW52X2RiOyAgICAgICAgICAgLyogNDAgRW52aXJvbm1lbnQgZGF0YWJhc2UgKi8KICAgICBIQU5ETEVfVEFCTEUgICAgKmhhbmRsZV90YWJsZTsgICAgIC8qIDQ0IEhhbmRsZSB0YWJsZSAqLwogICAgIHN0cnVjdCBfUERCMzIgICAqcGFyZW50OyAgICAgICAgICAgLyogNDggUGFyZW50IHByb2Nlc3MgKi8KICAgICB2b2lkICAgICAgICAgICAgKm1vZHJlZl9saXN0OyAgICAgIC8qIDRjIE1PRFJFRiBsaXN0ICovCkBAIC05MSwxMyArOTIsMTUgQEAKICAgICBXT1JEICAgICAgICAgICAgIGVycm9yX21vZGU7ICAgICAgIC8qIGI2IEVycm9yIG1vZGUgKi8KICAgICBLMzJPQkogICAgICAgICAgKmxvYWRfZG9uZV9ldnQ7ICAgIC8qIGI4IEV2ZW50IGZvciBwcm9jZXNzIGxvYWRpbmcgZG9uZSAqLwogICAgIERXT1JEICAgICAgICAgICAgdW5rbm93bjc7ICAgICAgICAgLyogYmMgVW5rbm93biAqLworICAgIERXT1JEICAgICAgICAgICAgdW5rbm93bjg7ICAgICAgICAgLyogYzAgVW5rbm93biAoTlQpICovCisgICAgTENJRCAgICAgICAgICAgICBsb2NhbGU7ICAgICAgICAgICAvKiBjNCBMb2NhbGUgdG8gYmUgcXVlcmllZCBieSBHZXRUaHJlYWRMb2NhbGUgKE5UKSAqLwogfSBQREIzMjsKIAogZXh0ZXJuIEhBTkRMRTMyIFBST0NFU1NfQWxsb2NIYW5kbGUoIEszMk9CSiAqcHRyLCBEV09SRCBmbGFncyk7CiBleHRlcm4gSzMyT0JKICpQUk9DRVNTX0dldE9ialB0ciggSEFORExFMzIgaGFuZGxlLCBLMzJPQkpfVFlQRSB0eXBlICk7CiBleHRlcm4gQk9PTDMyIFBST0NFU1NfU2V0T2JqUHRyKCBIQU5ETEUzMiBoYW5kbGUsIEszMk9CSiAqcHRyLCBEV09SRCBmbGFncyApOwogCi1leHRlcm4gUERCMzIgKlBST0NFU1NfQ3JlYXRlKHZvaWQpOworZXh0ZXJuIFBEQjMyICpQUk9DRVNTX0NyZWF0ZSggVERCICpwVGFzayApOwogZXh0ZXJuIHZvaWQgUFJPQ0VTU19EZXN0cm95KCBLMzJPQkogKnB0ciApOwogCiBleHRlcm4gUERCMzIgKnBDdXJyZW50UHJvY2VzczsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2Nyb2xsLmggYi9pbmNsdWRlL3Njcm9sbC5oCmluZGV4IDkwNDExZGMuLjcwOTAyNDUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2Nyb2xsLmgKKysrIGIvaW5jbHVkZS9zY3JvbGwuaApAQCAtNSw4ICs1LDggQEAKICAqIENvcHlyaWdodCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgU0NST0xMX0gKLSNkZWZpbmUgU0NST0xMX0gKKyNpZm5kZWYgX19XSU5FX1NDUk9MTF9ICisjZGVmaW5lIF9fV0lORV9TQ1JPTExfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCkBAIC0yNiw0ICsyNiw0IEBACiBleHRlcm4gdm9pZCBTQ1JPTExfSGFuZGxlU2Nyb2xsRXZlbnQoIEhXTkQzMiBod25kLCBJTlQzMiBuQmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbXNnLCBQT0lOVDMyIHB0ICk7CiAKLSNlbmRpZiAgLyogU0NST0xMX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX1NDUk9MTF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NlbGVjdG9ycy5oIGIvaW5jbHVkZS9zZWxlY3RvcnMuaAppbmRleCBiOGUxMTk2Li5mODA3NDAzIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NlbGVjdG9ycy5oCisrKyBiL2luY2x1ZGUvc2VsZWN0b3JzLmgKQEAgLTQwLDYgKzQwLDExIEBACiAjZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDE3CiAjZW5kaWYgIC8qIHN2cjQgfHwgU0NPX0RTICovCiAKKyNpZmRlZiBfX0VNWF9fCisjZGVmaW5lIFdJTkVfREFUQV9TRUxFQ1RPUiAweDAwIC8qIEZJWE1FOiBUaGlzIGlzIHdyb25nICovCisjZGVmaW5lIFdJTkVfQ09ERV9TRUxFQ1RPUiAweDAwCisjZW5kaWYgIC8qIE9TLzIgKi8KKwogI2Vsc2UgIC8qIFdJTkVMSUIgKi8KIAogI2RlZmluZSBXSU5FX0RBVEFfU0VMRUNUT1IgMHgwMApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaGVsbC5oIGIvaW5jbHVkZS9zaGVsbC5oCmluZGV4IDQ5Y2FkZTQyLi5kYWViZTgwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3NoZWxsLmgKKysrIGIvaW5jbHVkZS9zaGVsbC5oCkBAIC0xLDggKzEsNiBAQAogLyoKICAqIAkJCQlTaGVsbCBMaWJyYXJ5IGRlZmluaXRpb25zCiAgKi8KLSNpbmNsdWRlICJ3aW50eXBlcy5oIgotCiAjaWZuZGVmIF9fV0lORV9TSEVMTF9ICiAjZGVmaW5lIF9fV0lORV9TSEVMTF9ICiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RhdGljLmggYi9pbmNsdWRlL3N0YXRpYy5oCmluZGV4IDQyZWJmZTAuLjBkZDYyNGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3RhdGljLmgKKysrIGIvaW5jbHVkZS9zdGF0aWMuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTk0IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKLSNpZm5kZWYgU1RBVElDX0gKLSNkZWZpbmUgU1RBVElDX0gKKyNpZm5kZWYgX19XSU5FX1NUQVRJQ19ICisjZGVmaW5lIF9fV0lORV9TVEFUSUNfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCkBAIC0xOSw0ICsxOSw0IEBACiAKIGV4dGVybiBMUkVTVUxUIFN0YXRpY1duZFByb2MoSFdORCBoV25kLFVJTlQgdU1zZyxXUEFSQU0xNiB3UGFyYW0sTFBBUkFNIGxQYXJhbSApOwogCi0jZW5kaWYgIC8qIFNUQVRJQ19IICovCisjZW5kaWYgIC8qIF9fV0lORV9TVEFUSUNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdHJlc3MuaCBiL2luY2x1ZGUvc3RyZXNzLmgKaW5kZXggMTkwZTY3NS4uMGQxZWY5MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJlc3MuaAorKysgYi9pbmNsdWRlL3N0cmVzcy5oCkBAIC0xLDUgKzEsNSBAQAotI2lmbmRlZiBfX1NUUkVTU19ICi0jZGVmaW5lIF9fU1RSRVNTX0gKKyNpZm5kZWYgX19XSU5FX1NUUkVTU19ICisjZGVmaW5lIF9fV0lORV9TVFJFU1NfSAogCiAjaW5jbHVkZSA8d2luZG93cy5oPgogCkBAIC0yNyw0ICsyNyw0IEBACiB9CiAjZW5kaWYKIAotI2VuZGlmIC8qIF9fU1RSRVNTX0ggKi8KKyNlbmRpZiAvKiBfX1dJTkVfU1RSRVNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc3RyaW5nMzIuaCBiL2luY2x1ZGUvc3RyaW5nMzIuaAppbmRleCAzNzFiNWNjLi42YzY0NGEyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0cmluZzMyLmgKKysrIGIvaW5jbHVkZS9zdHJpbmczMi5oCkBAIC01LDEyICs1LDEyIEBACiAgKgogICovCiAKLSNpZm5kZWYgX1NUUklORzMyX0gKLSNkZWZpbmUgX1NUUklORzMyX0gKKyNpZm5kZWYgX19XSU5FX1NUUklORzMyX0gKKyNkZWZpbmUgX19XSU5FX1NUUklORzMyX0gKIAogI2luY2x1ZGUgIndpbnR5cGVzLmgiCiAKIExQV1NUUglTVFJJTkczMl9EdXBBbnNpVG9VbmkoTFBDU1RSIHNyYyk7CiBMUFdTVFIJU1RSSU5HMzJfc3RyZHVwVyhMUENXU1RSKTsKIAotI2VuZGlmCisjZW5kaWYgIC8qIF9fV0lORV9TVFJJTkczMl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N0cnVjdDMyLmggYi9pbmNsdWRlL3N0cnVjdDMyLmgKaW5kZXggYzBlODhjZS4uODFhNjBlMSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zdHJ1Y3QzMi5oCisrKyBiL2luY2x1ZGUvc3RydWN0MzIuaApAQCAtMywxMiArMyw2IEBACiAjZGVmaW5lIF9fV0lORV9fU1RSVUNUMzJfSAogI2luY2x1ZGUgImhhbmRsZTMyLmgiCiAKLXZvaWQgU1RSVUNUMzJfUkVDVDMydG8xNihjb25zdCBSRUNUMzIqLFJFQ1QxNiopOwotdm9pZCBTVFJVQ1QzMl9SRUNUMTZ0bzMyKGNvbnN0IFJFQ1QxNiosUkVDVDMyKik7Ci12b2lkIFNUUlVDVDMyX1BPSU5UMzJ0bzE2KGNvbnN0IFBPSU5UMzIqLFBPSU5UMTYqKTsKLXZvaWQgU1RSVUNUMzJfUE9JTlQxNnRvMzIoY29uc3QgUE9JTlQxNiosUE9JTlQzMiopOwotdm9pZCBTVFJVQ1QzMl9TSVpFMTZ0bzMyKGNvbnN0IFNJWkUxNiosIFNJWkUzMiopOwotCiBleHRlcm4gdm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMzJ0bzE2KCBjb25zdCBNSU5NQVhJTkZPMzIqLCBNSU5NQVhJTkZPMTYqICk7CiBleHRlcm4gdm9pZCBTVFJVQ1QzMl9NSU5NQVhJTkZPMTZ0bzMyKCBjb25zdCBNSU5NQVhJTkZPMTYqLCBNSU5NQVhJTkZPMzIqICk7CiBleHRlcm4gdm9pZCBTVFJVQ1QzMl9XSU5ET1dQT1MzMnRvMTYoIGNvbnN0IFdJTkRPV1BPUzMyKiwgV0lORE9XUE9TMTYqICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c2NvbG9yLmggYi9pbmNsdWRlL3N5c2NvbG9yLmgKaW5kZXggYzhmYThjOS4uZjhiZDY1NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zeXNjb2xvci5oCisrKyBiL2luY2x1ZGUvc3lzY29sb3IuaApAQCAtNCw4ICs0LDggQEAKICAqIENvcHlyaWdodCAgQWxleGFuZHJlIEp1bGxpYXJkLCAxOTk0CiAgKi8KIAotI2lmbmRlZiBTWVNDT0xPUl9ICi0jZGVmaW5lIFNZU0NPTE9SX0gKKyNpZm5kZWYgX19XSU5FX1NZU0NPTE9SX0gKKyNkZWZpbmUgX19XSU5FX1NZU0NPTE9SX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIApAQCAtMzcsNCArMzcsNCBAQAogZXh0ZXJuIHZvaWQgU1lTQ09MT1JfSW5pdCh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgU3lzQ29sb3JPYmplY3RzIHN5c0NvbG9yT2JqZWN0czsKIAotI2VuZGlmICAvKiBTWVNDT0xPUl9IICovCisjZW5kaWYgIC8qIF9fV0lORV9TWVNDT0xPUl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3N5c21ldHJpY3MuaCBiL2luY2x1ZGUvc3lzbWV0cmljcy5oCmluZGV4IDUyZmZhNmMuLjRkNWRlMmYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc3lzbWV0cmljcy5oCisrKyBiL2luY2x1ZGUvc3lzbWV0cmljcy5oCkBAIC00LDggKzQsOCBAQAogICogQ29weXJpZ2h0IDE5OTQgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBTWVNNRVRSSUNTX0gKLSNkZWZpbmUgU1lTTUVUUklDU19ICisjaWZuZGVmIF9fV0lORV9TWVNNRVRSSUNTX0gKKyNkZWZpbmUgX19XSU5FX1NZU01FVFJJQ1NfSAogCiAjaW5jbHVkZSAid2luZG93cy5oIgogCkBAIC03Nyw0ICs3Nyw0IEBACiBleHRlcm4gdm9pZCBTWVNNRVRSSUNTX0luaXQodm9pZCk7CiBleHRlcm4gc2hvcnQgc3lzTWV0cmljc1tTTV9DTUVUUklDUysxXTsKIAotI2VuZGlmCisjZW5kaWYgIC8qIF9fV0lORV9TWVNNRVRSSUNTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdGFzay5oIGIvaW5jbHVkZS90YXNrLmgKaW5kZXggZGY2NWM2MC4uNzBmNzliYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS90YXNrLmgKKysrIGIvaW5jbHVkZS90YXNrLmgKQEAgLTQsOCArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaWZuZGVmIF9XSU5FX1RBU0tfSAotI2RlZmluZSBfV0lORV9UQVNLX0gKKyNpZm5kZWYgX19XSU5FX1RBU0tfSAorI2RlZmluZSBfX1dJTkVfVEFTS19ICiAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCkBAIC0yOCw3ICsyOCw4IEBACiAgICAgV09SRCAgICAgIHJlc2VydmVkMlsyXTsKICAgICBXT1JEICAgICAgbmJGaWxlczsgICAgICAgICAgICAgICAgIC8qIDMyIE51bWJlciBvZiBmaWxlIGhhbmRsZXMgKi8KICAgICBTRUdQVFIgICAgZmlsZUhhbmRsZXNQdHI7ICAgICAgICAgIC8qIDM0IFBvaW50ZXIgdG8gZmlsZSBoYW5kbGUgdGFibGUgKi8KLSAgICBXT1JEICAgICAgcmVzZXJ2ZWQzWzE4XTsKKyAgICBIQU5ETEUxNiAgaEZpbGVIYW5kbGVzOyAgICAgICAgICAgIC8qIDM4IEhhbmRsZSB0byBmaWxlSGFuZGxlc1B0ciAqLworICAgIFdPUkQgICAgICByZXNlcnZlZDNbMTddOwogICAgIEJZVEUgICAgICBmY2IxWzE2XTsgICAgICAgICAgICAgICAgLyogNWMgRmlyc3QgRkNCICovCiAgICAgQllURSAgICAgIGZjYjJbMjBdOyAgICAgICAgICAgICAgICAvKiA2YyBTZWNvbmQgRkNCICovCiAgICAgQllURSAgICAgIGNtZExpbmVbMTI4XTsgICAgICAgICAgICAvKiA4MCBDb21tYW5kLWxpbmUgKGZpcnN0IGJ5dGUgaXMgbGVuKSovCkBAIC0xMTcsNCArMTE4LDQgQEAKIGV4dGVybiB2b2lkIFRBU0tfS2lsbEN1cnJlbnRUYXNrKCBJTlQxNiBleGl0Q29kZSApOwogZXh0ZXJuIEhUQVNLMTYgVEFTS19HZXROZXh0VGFzayggSFRBU0sxNiBoVGFzayApOwogCi0jZW5kaWYgLyogX1dJTkVfVEFTS19IICovCisjZW5kaWYgLyogX19XSU5FX1RBU0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90b29saGVscC5oIGIvaW5jbHVkZS90b29saGVscC5oCmluZGV4IGMxZDk4MzYuLmRiZWJlODEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdG9vbGhlbHAuaAorKysgYi9pbmNsdWRlL3Rvb2xoZWxwLmgKQEAgLTEsNSArMSw1IEBACi0jaWZuZGVmIF9fVE9PTEhFTFBfSAotI2RlZmluZSBfX1RPT0xIRUxQX0gKKyNpZm5kZWYgX19XSU5FX1RPT0xIRUxQX0gKKyNkZWZpbmUgX19XSU5FX1RPT0xIRUxQX0gKIAogI2luY2x1ZGUgIndpbmRvd3MuaCIKIApAQCAtMzQzLDQgKzM0Myw0IEBACiAgICAgRkFSUFJPQzE2ICAgbHBmbkVycm9yQWRkcjsKICAgICB2b2lkICAgICAgKipscEJhZFBhcmFtOwogfSBORllMT0dQQVJBTUVSUk9SOwotI2VuZGlmIC8qIF9fVE9PTEhFTFBfSCAqLworI2VuZGlmIC8qIF9fV0lORV9UT09MSEVMUF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzZXIuaCBiL2luY2x1ZGUvdXNlci5oCmluZGV4IGYyMmZhMWEuLmNmYjA2OGIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNlci5oCisrKyBiL2luY2x1ZGUvdXNlci5oCkBAIC00LDggKzQsOCBAQAogICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBVU0VSX0gKLSNkZWZpbmUgVVNFUl9ICisjaWZuZGVmIF9fV0lORV9VU0VSX0gKKyNkZWZpbmUgX19XSU5FX1VTRVJfSAogCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibG9jYWwuaCIKQEAgLTIzLDQgKzIzLDQgQEAKICNkZWZpbmUgVVNFUl9IRUFQX1NFR19BRERSKGhhbmRsZSkgIFwKICAgICAgICAgICgoaGFuZGxlKSA/IFBUUl9TRUdfT0ZGX1RPX1NFR1BUUihVU0VSX0hlYXBTZWwsIChoYW5kbGUpKSA6IChTRUdQVFIpMCkKIAotI2VuZGlmICAvKiBVU0VSX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX1VTRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4uaCBiL2luY2x1ZGUvd2luLmgKaW5kZXggNDQ1ZWUzYi4uYjhiNzc4YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4uaAorKysgYi9pbmNsdWRlL3dpbi5oCkBAIC00LDggKzQsOCBAQAogICogQ29weXJpZ2h0IDE5OTMgQWxleGFuZHJlIEp1bGxpYXJkCiAgKi8KIAotI2lmbmRlZiBXSU5fSAotI2RlZmluZSBXSU5fSAorI2lmbmRlZiBfX1dJTkVfV0lOX0gKKyNkZWZpbmUgX19XSU5FX1dJTl9ICiAKICNpbmNsdWRlIDxYMTEvWGxpYi5oPgogCkBAIC0xMTEsNCArMTExLDQgQEAKIGV4dGVybiBTY3JlZW4gKiBzY3JlZW47CiBleHRlcm4gV2luZG93IHJvb3RXaW5kb3c7CiAKLSNlbmRpZiAgLyogV0lOX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX1dJTl9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmRvd3MuaCBiL2luY2x1ZGUvd2luZG93cy5oCmluZGV4IGUwZDhjZDQuLmE2NTc4MmQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luZG93cy5oCisrKyBiL2luY2x1ZGUvd2luZG93cy5oCkBAIC0yNjE0LDEwICsyNjE0LDEwIEBACiAjZGVmaW5lIEhXTkRfQlJPQURDQVNUCSAgICAoKEhXTkQpMHhmZmZmKQogCiAvKiBTZXRXaW5kb3dQb3MoKSBod25kSW5zZXJ0QWZ0ZXIgZmllbGQgdmFsdWVzICovCi0jZGVmaW5lIEhXTkRfVE9QICAgICAgICAgICAgKChIV05EKTApCi0jZGVmaW5lIEhXTkRfQk9UVE9NICAgICAgICAgKChIV05EKTEpCi0jZGVmaW5lIEhXTkRfVE9QTU9TVCAgICAgICAgKChIV05EKS0xKQotI2RlZmluZSBIV05EX05PVE9QTU9TVCAgICAgICgoSFdORCktMikKKyNkZWZpbmUgSFdORF9UT1AgICAgICAgICAgICAoKEhXTkQzMikwKQorI2RlZmluZSBIV05EX0JPVFRPTSAgICAgICAgICgoSFdORDMyKTEpCisjZGVmaW5lIEhXTkRfVE9QTU9TVCAgICAgICAgKChIV05EMzIpLTEpCisjZGVmaW5lIEhXTkRfTk9UT1BNT1NUICAgICAgKChIV05EMzIpLTIpCiAKIC8qIEZsYWdzIGZvciBUcmFja1BvcHVwTWVudSAqLwogI2RlZmluZSBUUE1fTEVGVEJVVFRPTiAgICAweDAwMDAKQEAgLTMyNzksNTIgKzMyNzksMTM3IEBACiAjZGVmaW5lIE9EU19GT0NVUyAgICAgICAweDAwMTAKIAogLyogRWRpdCBjb250cm9sIHN0eWxlcyAqLwotI2RlZmluZSBFU19MRUZUICAgICAgICAgMHgwMDAwMDAwMEwKLSNkZWZpbmUgRVNfQ0VOVEVSICAgICAgIDB4MDAwMDAwMDFMCi0jZGVmaW5lIEVTX1JJR0hUICAgICAgICAweDAwMDAwMDAyTAotI2RlZmluZSBFU19NVUxUSUxJTkUgICAgMHgwMDAwMDAwNEwKLSNkZWZpbmUgRVNfVVBQRVJDQVNFICAgIDB4MDAwMDAwMDhMCi0jZGVmaW5lIEVTX0xPV0VSQ0FTRSAgICAweDAwMDAwMDEwTAotI2RlZmluZSBFU19QQVNTV09SRCAgICAgMHgwMDAwMDAyMEwKLSNkZWZpbmUgRVNfQVVUT1ZTQ1JPTEwgIDB4MDAwMDAwNDBMCi0jZGVmaW5lIEVTX0FVVE9IU0NST0xMICAweDAwMDAwMDgwTAotI2RlZmluZSBFU19OT0hJREVTRUwgICAgMHgwMDAwMDEwMEwKLSNkZWZpbmUgRVNfT0VNQ09OVkVSVCAgIDB4MDAwMDA0MDBMCi0jZGVmaW5lIEVTX1JFQURPTkxZICAgICAweDAwMDAwODAwTAotI2RlZmluZSBFU19XQU5UUkVUVVJOICAgMHgwMDAwMTAwMEwKKyNkZWZpbmUgRVNfTEVGVCAgICAgICAgIDB4MDAwMDAwMDAKKyNkZWZpbmUgRVNfQ0VOVEVSICAgICAgIDB4MDAwMDAwMDEKKyNkZWZpbmUgRVNfUklHSFQgICAgICAgIDB4MDAwMDAwMDIKKyNkZWZpbmUgRVNfTVVMVElMSU5FICAgIDB4MDAwMDAwMDQKKyNkZWZpbmUgRVNfVVBQRVJDQVNFICAgIDB4MDAwMDAwMDgKKyNkZWZpbmUgRVNfTE9XRVJDQVNFICAgIDB4MDAwMDAwMTAKKyNkZWZpbmUgRVNfUEFTU1dPUkQgICAgIDB4MDAwMDAwMjAKKyNkZWZpbmUgRVNfQVVUT1ZTQ1JPTEwgIDB4MDAwMDAwNDAKKyNkZWZpbmUgRVNfQVVUT0hTQ1JPTEwgIDB4MDAwMDAwODAKKyNkZWZpbmUgRVNfTk9ISURFU0VMICAgIDB4MDAwMDAxMDAKKyNkZWZpbmUgRVNfT0VNQ09OVkVSVCAgIDB4MDAwMDA0MDAKKyNkZWZpbmUgRVNfUkVBRE9OTFkgICAgIDB4MDAwMDA4MDAKKyNkZWZpbmUgRVNfV0FOVFJFVFVSTiAgIDB4MDAwMDEwMDAKKyNkZWZpbmUgRVNfTlVNQkVSICAgICAgIDB4MDAwMDIwMDAKIAogLyogRWRpdCBjb250cm9sIG1lc3NhZ2VzICovCi0jZGVmaW5lIEVNX0dFVFNFTCAgICAgICAgICAgICAgKFdNX1VTRVIrMCkKLSNkZWZpbmUgRU1fU0VUU0VMICAgICAgICAgICAgICAoV01fVVNFUisxKQotI2RlZmluZSBFTV9HRVRSRUNUICAgICAgICAgICAgIChXTV9VU0VSKzIpCi0jZGVmaW5lIEVNX1NFVFJFQ1QgICAgICAgICAgICAgKFdNX1VTRVIrMykKLSNkZWZpbmUgRU1fU0VUUkVDVE5QICAgICAgICAgICAoV01fVVNFUis0KQotI2RlZmluZSBFTV9MSU5FU0NST0xMICAgICAgICAgIChXTV9VU0VSKzYpCi0jZGVmaW5lIEVNX0dFVE1PRElGWSAgICAgICAgICAgKFdNX1VTRVIrOCkKLSNkZWZpbmUgRU1fU0VUTU9ESUZZICAgICAgICAgICAoV01fVVNFUis5KQotI2RlZmluZSBFTV9HRVRMSU5FQ09VTlQgICAgICAgIChXTV9VU0VSKzEwKQotI2RlZmluZSBFTV9MSU5FSU5ERVggICAgICAgICAgIChXTV9VU0VSKzExKQotI2RlZmluZSBFTV9TRVRIQU5ETEUgICAgICAgICAgIChXTV9VU0VSKzEyKQotI2RlZmluZSBFTV9HRVRIQU5ETEUgICAgICAgICAgIChXTV9VU0VSKzEzKQotI2RlZmluZSBFTV9MSU5FTEVOR1RIICAgICAgICAgIChXTV9VU0VSKzE3KQotI2RlZmluZSBFTV9SRVBMQUNFU0VMICAgICAgICAgIChXTV9VU0VSKzE4KQotI2RlZmluZSBFTV9HRVRMSU5FICAgICAgICAgICAgIChXTV9VU0VSKzIwKQotI2RlZmluZSBFTV9MSU1JVFRFWFQgICAgICAgICAgIChXTV9VU0VSKzIxKQotI2RlZmluZSBFTV9DQU5VTkRPICAgICAgICAgICAgIChXTV9VU0VSKzIyKQotI2RlZmluZSBFTV9VTkRPICAgICAgICAgICAgICAgIChXTV9VU0VSKzIzKQotI2RlZmluZSBFTV9GTVRMSU5FUyAgICAgICAgICAgIChXTV9VU0VSKzI0KQotI2RlZmluZSBFTV9MSU5FRlJPTUNIQVIgICAgICAgIChXTV9VU0VSKzI1KQotI2RlZmluZSBFTV9TRVRUQUJTVE9QUyAgICAgICAgIChXTV9VU0VSKzI3KQotI2RlZmluZSBFTV9TRVRQQVNTV09SRENIQVIgICAgIChXTV9VU0VSKzI4KQotI2RlZmluZSBFTV9FTVBUWVVORE9CVUZGRVIgICAgIChXTV9VU0VSKzI5KQotI2RlZmluZSBFTV9HRVRGSVJTVFZJU0lCTEVMSU5FIChXTV9VU0VSKzMwKQotI2RlZmluZSBFTV9TRVRSRUFET05MWSAgICAgICAgIChXTV9VU0VSKzMxKQotI2RlZmluZSBFTV9TRVRXT1JEQlJFQUtQUk9DICAgIChXTV9VU0VSKzMyKQotI2RlZmluZSBFTV9HRVRXT1JEQlJFQUtQUk9DICAgIChXTV9VU0VSKzMzKQotI2RlZmluZSBFTV9HRVRQQVNTV09SRENIQVIgICAgIChXTV9VU0VSKzM0KQotLyogRWRpdCBjb250cm9sIHVuZG9jdW1lbnRlZCBtZXNzYWdlcyAqLwotI2RlZmluZSBFTV9TQ1JPTEwgICAgICAgICAgICAgIChXTV9VU0VSKzUpCi0jZGVmaW5lIEVNX0dFVFRIVU1CICAgICAgICAgICAgKFdNX1VTRVIrMTQpCisjZGVmaW5lIEVNX0dFVFNFTDE2ICAgICAgICAgICAgICAgIChXTV9VU0VSKzApCisjZGVmaW5lIEVNX0dFVFNFTDMyICAgICAgICAgICAgICAgIDB4MDBiMAorI2RlZmluZSBFTV9HRVRTRUwgICAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fR0VUU0VMKQorI2RlZmluZSBFTV9TRVRTRUwxNiAgICAgICAgICAgICAgICAoV01fVVNFUisxKQorI2RlZmluZSBFTV9TRVRTRUwzMiAgICAgICAgICAgICAgICAweDAwYjEKKyNkZWZpbmUgRU1fU0VUU0VMICAgICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX1NFVFNFTCkKKyNkZWZpbmUgRU1fR0VUUkVDVDE2ICAgICAgICAgICAgICAgKFdNX1VTRVIrMikKKyNkZWZpbmUgRU1fR0VUUkVDVDMyICAgICAgICAgICAgICAgMHgwMGIyCisjZGVmaW5lIEVNX0dFVFJFQ1QgICAgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9HRVRSRUNUKQorI2RlZmluZSBFTV9TRVRSRUNUMTYgICAgICAgICAgICAgICAoV01fVVNFUiszKQorI2RlZmluZSBFTV9TRVRSRUNUMzIgICAgICAgICAgICAgICAweDAwYjMKKyNkZWZpbmUgRU1fU0VUUkVDVCAgICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX1NFVFJFQ1QpCisjZGVmaW5lIEVNX1NFVFJFQ1ROUDE2ICAgICAgICAgICAgIChXTV9VU0VSKzQpCisjZGVmaW5lIEVNX1NFVFJFQ1ROUDMyICAgICAgICAgICAgIDB4MDBiNAorI2RlZmluZSBFTV9TRVRSRUNUTlAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fU0VUUkVDVE5QKQorI2RlZmluZSBFTV9TQ1JPTEwxNiAgICAgICAgICAgICAgICAoV01fVVNFUis1KQorI2RlZmluZSBFTV9TQ1JPTEwzMiAgICAgICAgICAgICAgICAweDAwYjUKKyNkZWZpbmUgRU1fU0NST0xMICAgICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX1NDUk9MTCkKKyNkZWZpbmUgRU1fTElORVNDUk9MTDE2ICAgICAgICAgICAgKFdNX1VTRVIrNikKKyNkZWZpbmUgRU1fTElORVNDUk9MTDMyICAgICAgICAgICAgMHgwMGI2CisjZGVmaW5lIEVNX0xJTkVTQ1JPTEwgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9MSU5FU0NST0xMKQorI2RlZmluZSBFTV9TQ1JPTExDQVJFVDE2ICAgICAgICAgICAoV01fVVNFUis3KQorI2RlZmluZSBFTV9TQ1JPTExDQVJFVDMyICAgICAgICAgICAweDAwYjcKKyNkZWZpbmUgRU1fU0NST0xMQ0FSRVQgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX1NDUk9MTENBUkVUKQorI2RlZmluZSBFTV9HRVRNT0RJRlkxNiAgICAgICAgICAgICAoV01fVVNFUis4KQorI2RlZmluZSBFTV9HRVRNT0RJRlkzMiAgICAgICAgICAgICAweDAwYjgKKyNkZWZpbmUgRU1fR0VUTU9ESUZZICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0dFVE1PRElGWSkKKyNkZWZpbmUgRU1fU0VUTU9ESUZZMTYgICAgICAgICAgICAgKFdNX1VTRVIrOSkKKyNkZWZpbmUgRU1fU0VUTU9ESUZZMzIgICAgICAgICAgICAgMHgwMGI5CisjZGVmaW5lIEVNX1NFVE1PRElGWSAgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9TRVRNT0RJRlkpCisjZGVmaW5lIEVNX0dFVExJTkVDT1VOVDE2ICAgICAgICAgIChXTV9VU0VSKzEwKQorI2RlZmluZSBFTV9HRVRMSU5FQ09VTlQzMiAgICAgICAgICAweDAwYmEKKyNkZWZpbmUgRU1fR0VUTElORUNPVU5UICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0dFVExJTkVDT1VOVCkKKyNkZWZpbmUgRU1fTElORUlOREVYMTYgICAgICAgICAgICAgKFdNX1VTRVIrMTEpCisjZGVmaW5lIEVNX0xJTkVJTkRFWDMyICAgICAgICAgICAgIDB4MDBiYgorI2RlZmluZSBFTV9MSU5FSU5ERVggICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fTElORUlOREVYKQorI2RlZmluZSBFTV9TRVRIQU5ETEUxNiAgICAgICAgICAgICAoV01fVVNFUisxMikKKyNkZWZpbmUgRU1fU0VUSEFORExFMzIgICAgICAgICAgICAgMHgwMGJjCisjZGVmaW5lIEVNX1NFVEhBTkRMRSAgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9TRVRIQU5ETEUpCisjZGVmaW5lIEVNX0dFVEhBTkRMRTE2ICAgICAgICAgICAgIChXTV9VU0VSKzEzKQorI2RlZmluZSBFTV9HRVRIQU5ETEUzMiAgICAgICAgICAgICAweDAwYmQKKyNkZWZpbmUgRU1fR0VUSEFORExFICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0dFVEhBTkRMRSkKKyNkZWZpbmUgRU1fR0VUVEhVTUIxNiAgICAgICAgICAgICAgKFdNX1VTRVIrMTQpCisjZGVmaW5lIEVNX0dFVFRIVU1CMzIgICAgICAgICAgICAgIDB4MDBiZQorI2RlZmluZSBFTV9HRVRUSFVNQiAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fR0VUVEhVTUIpCisvKiBGSVhNRSA6IG1pc3NpbmcgZnJvbSBzcGVjcyAweDAwYmYgYW5kIDB4MDBjMCAqLworI2RlZmluZSBFTV9MSU5FTEVOR1RIMTYgICAgICAgICAgICAoV01fVVNFUisxNykKKyNkZWZpbmUgRU1fTElORUxFTkdUSDMyICAgICAgICAgICAgMHgwMGMxCisjZGVmaW5lIEVNX0xJTkVMRU5HVEggICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9MSU5FTEVOR1RIKQorI2RlZmluZSBFTV9SRVBMQUNFU0VMMTYgICAgICAgICAgICAoV01fVVNFUisxOCkKKyNkZWZpbmUgRU1fUkVQTEFDRVNFTDMyICAgICAgICAgICAgMHgwMGMyCisjZGVmaW5lIEVNX1JFUExBQ0VTRUwgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9SRVBMQUNFU0VMKQorLyogRklYTUUgOiBtaXNzaW5nIGZyb20gc3BlY3MgMHgwMGMzICovCisjZGVmaW5lIEVNX0dFVExJTkUxNiAgICAgICAgICAgICAgIChXTV9VU0VSKzIwKQorI2RlZmluZSBFTV9HRVRMSU5FMzIgICAgICAgICAgICAgICAweDAwYzQKKyNkZWZpbmUgRU1fR0VUTElORSAgICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0dFVExJTkUpCisjZGVmaW5lIEVNX0xJTUlUVEVYVDE2ICAgICAgICAgICAgIChXTV9VU0VSKzIxKQorI2RlZmluZSBFTV9MSU1JVFRFWFQzMiAgICAgICAgICAgICAweDAwYzUKKyNkZWZpbmUgRU1fTElNSVRURVhUICAgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0xJTUlUVEVYVCkKKyNkZWZpbmUgRU1fQ0FOVU5ETzE2ICAgICAgICAgICAgICAgKFdNX1VTRVIrMjIpCisjZGVmaW5lIEVNX0NBTlVORE8zMiAgICAgICAgICAgICAgIDB4MDBjNgorI2RlZmluZSBFTV9DQU5VTkRPICAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fQ0FOVU5ETykKKyNkZWZpbmUgRU1fVU5ETzE2ICAgICAgICAgICAgICAgICAgKFdNX1VTRVIrMjMpCisjZGVmaW5lIEVNX1VORE8zMiAgICAgICAgICAgICAgICAgIDB4MDBjNworI2RlZmluZSBFTV9VTkRPICAgICAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fVU5ETykKKyNkZWZpbmUgRU1fRk1UTElORVMxNiAgICAgICAgICAgICAgKFdNX1VTRVIrMjQpCisjZGVmaW5lIEVNX0ZNVExJTkVTMzIgICAgICAgICAgICAgIDB4MDBjOAorI2RlZmluZSBFTV9GTVRMSU5FUyAgICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fRk1UTElORVMpCisjZGVmaW5lIEVNX0xJTkVGUk9NQ0hBUjE2ICAgICAgICAgIChXTV9VU0VSKzI1KQorI2RlZmluZSBFTV9MSU5FRlJPTUNIQVIzMiAgICAgICAgICAweDAwYzkKKyNkZWZpbmUgRU1fTElORUZST01DSEFSICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0xJTkVGUk9NQ0hBUikKKy8qIEZJWE1FIDogbWlzc2luZyBmcm9tIHNwZWNzIDB4MDBjYSAqLworI2RlZmluZSBFTV9TRVRUQUJTVE9QUzE2ICAgICAgICAgICAoV01fVVNFUisyNykKKyNkZWZpbmUgRU1fU0VUVEFCU1RPUFMzMiAgICAgICAgICAgMHgwMGNiCisjZGVmaW5lIEVNX1NFVFRBQlNUT1BTICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9TRVRUQUJTVE9QUykKKyNkZWZpbmUgRU1fU0VUUEFTU1dPUkRDSEFSMTYgICAgICAgKFdNX1VTRVIrMjgpCisjZGVmaW5lIEVNX1NFVFBBU1NXT1JEQ0hBUjMyICAgICAgIDB4MDBjYworI2RlZmluZSBFTV9TRVRQQVNTV09SRENIQVIgICAgICAgICBXSU5FTElCX05BTUUoRU1fU0VUUEFTU1dPUkRDSEFSKQorI2RlZmluZSBFTV9FTVBUWVVORE9CVUZGRVIxNiAgICAgICAoV01fVVNFUisyOSkKKyNkZWZpbmUgRU1fRU1QVFlVTkRPQlVGRkVSMzIgICAgICAgMHgwMGNkCisjZGVmaW5lIEVNX0VNUFRZVU5ET0JVRkZFUiAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9FTVBUWVVORE9CVUZGRVIpCisjZGVmaW5lIEVNX0dFVEZJUlNUVklTSUJMRUxJTkUxNiAgIChXTV9VU0VSKzMwKQorI2RlZmluZSBFTV9HRVRGSVJTVFZJU0lCTEVMSU5FMzIgICAweDAwY2UKKyNkZWZpbmUgRU1fR0VURklSU1RWSVNJQkxFTElORSAgICAgV0lORUxJQl9OQU1FKEVNX0dFVEZJUlNUVklTSUJMRUxJTkUpCisjZGVmaW5lIEVNX1NFVFJFQURPTkxZMTYgICAgICAgICAgIChXTV9VU0VSKzMxKQorI2RlZmluZSBFTV9TRVRSRUFET05MWTMyICAgICAgICAgICAweDAwY2YKKyNkZWZpbmUgRU1fU0VUUkVBRE9OTFkgICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX1NFVFJFQURPTkxZKQorI2RlZmluZSBFTV9TRVRXT1JEQlJFQUtQUk9DMTYgICAgICAoV01fVVNFUiszMikKKyNkZWZpbmUgRU1fU0VUV09SREJSRUFLUFJPQzMyICAgICAgMHgwMGQwCisjZGVmaW5lIEVNX1NFVFdPUkRCUkVBS1BST0MgICAgICAgIFdJTkVMSUJfTkFNRShFTV9TRVRXT1JEQlJFQUtQUk9DKQorI2RlZmluZSBFTV9HRVRXT1JEQlJFQUtQUk9DMTYgICAgICAoV01fVVNFUiszMykKKyNkZWZpbmUgRU1fR0VUV09SREJSRUFLUFJPQzMyICAgICAgMHgwMGQxCisjZGVmaW5lIEVNX0dFVFdPUkRCUkVBS1BST0MgICAgICAgIFdJTkVMSUJfTkFNRShFTV9HRVRXT1JEQlJFQUtQUk9DKQorI2RlZmluZSBFTV9HRVRQQVNTV09SRENIQVIxNiAgICAgICAoV01fVVNFUiszNCkKKyNkZWZpbmUgRU1fR0VUUEFTU1dPUkRDSEFSMzIgICAgICAgMHgwMGQyCisjZGVmaW5lIEVNX0dFVFBBU1NXT1JEQ0hBUiAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9HRVRQQVNTV09SRENIQVIpCisjZGVmaW5lIEVNX1NFVE1BUkdJTlMxNiAgICAgICAgICAgIFdNX05VTEwgLyogbm90IGluIHdpbjE2ICovCisjZGVmaW5lIEVNX1NFVE1BUkdJTlMzMiAgICAgICAgICAgIDB4MDBkMworI2RlZmluZSBFTV9TRVRNQVJHSU5TICAgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fU0VUTUFSR0lOUykKKyNkZWZpbmUgRU1fR0VUTUFSR0lOUzE2ICAgICAgICAgICAgV01fTlVMTCAvKiBub3QgaW4gd2luMTYgKi8KKyNkZWZpbmUgRU1fR0VUTUFSR0lOUzMyICAgICAgICAgICAgMHgwMGQ0CisjZGVmaW5lIEVNX0dFVE1BUkdJTlMgICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9HRVRNQVJHSU5TKQorI2RlZmluZSBFTV9HRVRMSU1JVFRFWFQxNiAgICAgICAgICBXTV9OVUxMIC8qIG5vdCBpbiB3aW4xNiAqLworI2RlZmluZSBFTV9HRVRMSU1JVFRFWFQzMiAgICAgICAgICAweDAwZDUKKyNkZWZpbmUgRU1fR0VUTElNSVRURVhUICAgICAgICAgICAgV0lORUxJQl9OQU1FKEVNX0dFVExJTUlUVEVYVCkKKyNkZWZpbmUgRU1fUE9TRlJPTUNIQVIxNiAgICAgICAgICAgV01fTlVMTCAvKiBub3QgaW4gd2luMTYgKi8KKyNkZWZpbmUgRU1fUE9TRlJPTUNIQVIzMiAgICAgICAgICAgMHgwMGQ2CisjZGVmaW5lIEVNX1BPU0ZST01DSEFSICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9QT1NGUk9NQ0hBUikKKyNkZWZpbmUgRU1fQ0hBUkZST01QT1MxNiAgICAgICAgICAgV01fTlVMTCAvKiBub3QgaW4gd2luMTYgKi8KKyNkZWZpbmUgRU1fQ0hBUkZST01QT1MzMiAgICAgICAgICAgMHgwMGQ3CisjZGVmaW5lIEVNX0NIQVJGUk9NUE9TICAgICAgICAgICAgIFdJTkVMSUJfTkFNRShFTV9DSEFSRlJPTVBPUykKKy8qIGEgbmFtZSBjaGFuZ2Ugc2luY2Ugd2luOTUgKi8KKyNkZWZpbmUgRU1fU0VUTElNSVRURVhUMTYgICAgICAgICAgV01fTlVMTCAvKiBubyBuYW1lIGNoYW5nZSBpbiB3aW4xNiAqLworI2RlZmluZSBFTV9TRVRMSU1JVFRFWFQzMiAgICAgICAgICBFTV9MSU1JVFRFWFQzMgorI2RlZmluZSBFTV9TRVRMSU1JVFRFWFQgICAgICAgICAgICBXSU5FTElCX05BTUUoRU1fU0VUTElNSVRURVhUKQogCiAvKiBFRElUV09SREJSRUFLUFJPQyBjb2RlIHZhbHVlcyAqLwogI2RlZmluZSBXQl9MRUZUICAgICAgICAgMApAQCAtMzM0MSw2ICszNDI2LDExIEBACiAjZGVmaW5lIEVOX0hTQ1JPTEwgICAgICAweDA2MDEKICNkZWZpbmUgRU5fVlNDUk9MTCAgICAgIDB4MDYwMgogCisvKiBOZXcgc2luY2Ugd2luOTUgOiBFTV9TRVRNQVJHSU4gcGFyYW1ldGVycyAqLworI2RlZmluZSBFQ19MRUZUTUFSR0lOCTB4MDAwMQorI2RlZmluZSBFQ19SSUdIVE1BUkdJTgkweDAwMDIKKyNkZWZpbmUgRUNfVVNFRk9OVElORk8JMHhmZmZmCisKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTQzNTMsNiArNDQ0MywxMiBAQAogCUxQV1NUUglCdWZmZXI7CiB9IFVOSUNPREVfU1RSSU5HLCpMUFVOSUNPREVfU1RSSU5HOwogCisvKiB7RyxTfWV0UHJpb3JpdHlDbGFzcyAqLworI2RlZmluZQlOT1JNQUxfUFJJT1JJVFlfQ0xBU1MJMHgwMDAwMDAyMAorI2RlZmluZQlJRExFX1BSSU9SSVRZX0NMQVNTCTB4MDAwMDAwNDAKKyNkZWZpbmUJSElHSF9QUklPUklUWV9DTEFTUwkweDAwMDAwMDgwCisjZGVmaW5lCVJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTCTB4MDAwMDAxMDAKKwogI3ByYWdtYSBwYWNrKDQpCiAKIC8qIERlY2xhcmF0aW9ucyBmb3IgZnVuY3Rpb25zIHRoYXQgZXhpc3Qgb25seSBpbiBXaW4xNiAqLwpAQCAtNDM2MSw4ICs0NDU3LDYgQEAKIFdPUkQgICAgICAgQWxsb2NEU3RvQ1NBbGlhcyhXT1JEKTsKIFdPUkQgICAgICAgQWxsb2NTZWxlY3RvcihXT1JEKTsKIFdPUkQgICAgICAgQWxsb2NTZWxlY3RvckFycmF5KFdPUkQpOwotTFBTVFIgICAgICBBbnNpTG93ZXIoTFBTVFIpOwotTFBTVFIgICAgICBBbnNpVXBwZXIoTFBTVFIpOwogSU5UMTYgICAgICBDYXRjaChMUENBVENIQlVGKTsKIFdPUkQgICAgICAgQ2hhbmdlU2VsZWN0b3IoV09SRCxXT1JEKTsKIElOVDE2ICAgICAgQ2xvc2VDb21tKElOVDE2KTsKQEAgLTQ0MjUsNiArNDUxOSw3IEBACiBIVEFTSzE2ICAgIElzVGFza0xvY2tlZCh2b2lkKTsKIEJPT0wxNiAgICAgTG9jYWxJbml0KEhBTkRMRTE2LFdPUkQsV09SRCk7CiBIVEFTSzE2ICAgIExvY2tDdXJyZW50VGFzayhCT09MMTYpOworSE1FTlUxNiAgICBMb29rdXBNZW51SGFuZGxlKEhNRU5VMTYsSU5UMTYpOwogRFdPUkQgICAgICBNb3ZlVG8oSERDMTYsSU5UMTYsSU5UMTYpOwogRFdPUkQgICAgICBPZmZzZXRWaWV3cG9ydE9yZyhIREMxNixJTlQxNixJTlQxNik7CiBJTlQxNiAgICAgIE9mZnNldFZpc1JnbihIREMxNixJTlQxNixJTlQxNik7CkBAIC00NDc0LDYgKzQ1NjksOSBAQAogQk9PTDMyICAgICBCZWVwKERXT1JELERXT1JEKTsKIEJPT0wzMiAgICAgQ2xlYXJDb21tRXJyb3IoSU5UMzIsTFBEV09SRCxMUENPTVNUQVQpOwogQk9PTDMyICAgICBDbG9zZUhhbmRsZShIQU5ETEUzMik7CitCT09MMzIgICAgIENvcHlGaWxlMzJBKExQQ1NUUixMUENTVFIsQk9PTDMyKTsKK0JPT0wzMiAgICAgQ29weUZpbGUzMlcoTFBDV1NUUixMUENXU1RSLEJPT0wzMik7CisjZGVmaW5lICAgIENvcHlGaWxlIFdJTkVMSUJfTkFNRV9BVyhDb3B5RmlsZSkKIEhGSUxFMzIgICAgQ3JlYXRlRmlsZTMyQShMUENTVFIsRFdPUkQsRFdPUkQsTFBTRUNVUklUWV9BVFRSSUJVVEVTLERXT1JELERXT1JELEhBTkRMRTMyKTsKIEhGSUxFMzIgICAgQ3JlYXRlRmlsZTMyVyhMUENXU1RSLERXT1JELERXT1JELExQU0VDVVJJVFlfQVRUUklCVVRFUyxEV09SRCxEV09SRCxIQU5ETEUzMik7CiAjZGVmaW5lICAgIENyZWF0ZUZpbGUgV0lORUxJQl9OQU1FX0FXKENyZWF0ZUZpbGUpCkBAIC00NTAwLDYgKzQ1OTgsOSBAQAogSFJTUkMzMiAgICBGaW5kUmVzb3VyY2VFeDMyVyhISU5TVEFOQ0UzMixMUENXU1RSLExQQ1dTVFIsV09SRCk7CiAjZGVmaW5lICAgIEZpbmRSZXNvdXJjZUV4IFdJTkVMSUJfTkFNRV9BVyhGaW5kUmVzb3VyY2VFeCkKIEJPT0wzMiAgICAgRmx1c2hGaWxlQnVmZmVycyhIRklMRTMyKTsKK0JPT0wzMiAgICAgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQShMUFNUUik7CitCT09MMzIgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MzMlcoTFBXU1RSKTsKKyNkZWZpbmUgICAgRnJlZUVudmlyb25tZW50U3RyaW5ncyBXSU5FTElCX05BTUVfQVcoRnJlZUVudmlyb25tZW50U3RyaW5ncykKIFVJTlQzMiAgICAgR2V0QUNQKHZvaWQpOwogTFBDU1RSICAgICBHZXRDb21tYW5kTGluZTMyQSgpOwogTFBDV1NUUiAgICBHZXRDb21tYW5kTGluZTMyVygpOwpAQCAtNDUxMSwxMyArNDYxMiwyMyBAQAogSEFORExFMzIgICBHZXRDdXJyZW50VGhyZWFkKHZvaWQpOwogRFdPUkQgICAgICBHZXRDdXJyZW50VGhyZWFkSWQodm9pZCk7CiBCT09MMzIgICAgIEdldERDT3JnRXgoSERDMzIsTFBQT0lOVDMyKTsKK0xQU1RSICAgICAgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJBKHZvaWQpOworTFBXU1RSICAgICBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMlcodm9pZCk7CisjZGVmaW5lICAgIEdldEVudmlyb25tZW50U3RyaW5ncyBXSU5FTElCX05BTUVfQVcoR2V0RW52aXJvbm1lbnRTdHJpbmdzKQorRFdPUkQgICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CitEV09SRCAgICAgIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcoTFBDV1NUUixMUFdTVFIsRFdPUkQpOworI2RlZmluZSAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlIFdJTkVMSUJfTkFNRV9BVyhHZXRFbnZpcm9ubWVudFZhcmlhYmxlKQogRFdPUkQgICAgICBHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShIRklMRTMyLEJZX0hBTkRMRV9GSUxFX0lORk9STUFUSU9OKik7CiBEV09SRCAgICAgIEdldEZpbGVTaXplKEhGSUxFMzIsTFBEV09SRCk7CiBCT09MMzIgICAgIEdldEZpbGVUaW1lKEhGSUxFMzIsTFBGSUxFVElNRSxMUEZJTEVUSU1FLExQRklMRVRJTUUpOwogRFdPUkQgICAgICBHZXRGaWxlVHlwZShIRklMRTMyKTsKK0RXT1JEICAgICAgR2V0RnVsbFBhdGhOYW1lMzJBKExQQ1NUUixEV09SRCxMUFNUUixMUFNUUiopOworRFdPUkQgICAgICBHZXRGdWxsUGF0aE5hbWUzMlcoTFBDV1NUUixEV09SRCxMUFdTVFIsTFBXU1RSKik7CisjZGVmaW5lICAgIEdldEZ1bGxQYXRoTmFtZSBXSU5FTElCX05BTUVfQVcoR2V0RnVsbFBhdGhOYW1lKQogVk9JRCAgICAgICBHZXRMb2NhbFRpbWUoTFBTWVNURU1USU1FKTsKIERXT1JEICAgICAgR2V0TG9naWNhbERyaXZlcyh2b2lkKTsKIFVJTlQzMiAgICAgR2V0T0VNQ1Aodm9pZCk7CitEV09SRCAgICAgIEdldFByaW9yaXR5Q2xhc3MoSEFORExFMzIpOwogSEFORExFMzIgICBHZXRQcm9jZXNzSGVhcCh2b2lkKTsKIERXT1JEICAgICAgR2V0U2hvcnRQYXRoTmFtZTMyQShMUENTVFIsTFBTVFIsRFdPUkQpOwogRFdPUkQgICAgICBHZXRTaG9ydFBhdGhOYW1lMzJXKExQQ1dTVFIsTFBXU1RSLERXT1JEKTsKQEAgLTQ1MjYsNiArNDYzNyw4IEBACiBWT0lEICAgICAgIEdldFN5c3RlbUluZm8oTFBTWVNURU1fSU5GTyk7CiBCT09MMzIgICAgIEdldFN5c3RlbVBvd2VyU3RhdHVzKExQU1lTVEVNX1BPV0VSX1NUQVRVUyk7CiBWT0lEICAgICAgIEdldFN5c3RlbVRpbWUoTFBTWVNURU1USU1FKTsKK0xDSUQgICAgICAgR2V0VGhyZWFkTG9jYWxlKCk7CitJTlQzMiAgICAgIEdldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyKTsKIFZPSUQgICAgICAgR2xvYmFsTWVtb3J5U3RhdHVzKExQTUVNT1JZU1RBVFVTKTsKIExQVk9JRCAgICAgSGVhcEFsbG9jKEhBTkRMRTMyLERXT1JELERXT1JEKTsKIERXT1JEICAgICAgSGVhcENvbXBhY3QoSEFORExFMzIsRFdPUkQpOwpAQCAtNDUzNyw2ICs0NjUwLDcgQEAKIERXT1JEICAgICAgSGVhcFNpemUoSEFORExFMzIsRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgSGVhcFVubG9jayhIQU5ETEUzMik7CiBCT09MMzIgICAgIEhlYXBWYWxpZGF0ZShIQU5ETEUzMixEV09SRCxMUFZPSUQpOworQk9PTDMyICAgICBJc0RCQ1NMZWFkQnl0ZUV4KFVJTlQzMixCWVRFKTsKIEJPT0wzMiAgICAgSXNXaW5kb3dVbmljb2RlKEhXTkQzMik7CiBCT09MMzIgICAgIElzVmFsaWRMb2NhbGUoRFdPUkQsRFdPUkQpOwogQk9PTDMyICAgICBMb2NhbEZpbGVUaW1lVG9GaWxlVGltZShjb25zdCBGSUxFVElNRSosTFBGSUxFVElNRSk7CkBAIC00NTQ0LDYgKzQ2NTgsOSBAQAogQk9PTDMyICAgICBNb3ZlRmlsZTMyQShMUENTVFIsTFBDU1RSKTsKIEJPT0wzMiAgICAgTW92ZUZpbGUzMlcoTFBDV1NUUixMUENXU1RSKTsKICNkZWZpbmUgICAgTW92ZUZpbGUgV0lORUxJQl9OQU1FX0FXKE1vdmVGaWxlKQorRFdPUkQgICAgICBRdWVyeURvc0RldmljZTMyQShMUENTVFIsTFBTVFIsRFdPUkQpOworRFdPUkQgICAgICBRdWVyeURvc0RldmljZTMyVyhMUENXU1RSLExQV1NUUixEV09SRCk7CisjZGVmaW5lICAgIFF1ZXJ5RG9zRGV2aWNlIFdJTkVMSUJfTkFNRV9BVyhRdWVyeURvc0RldmljZSkKIEJPT0wzMiAgICAgUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoTFBMQVJHRV9JTlRFR0VSKTsKIEJPT0wzMiAgICAgUmVhZENvbnNvbGUzMkEoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKIEJPT0wzMiAgICAgUmVhZENvbnNvbGUzMlcoSEFORExFMzIsTFBWT0lELERXT1JELExQRFdPUkQsTFBWT0lEKTsKQEAgLTQ1NzgsMTIgKzQ2OTUsMTggQEAKIEJPT0wzMiAgICAgU2V0Q29uc29sZVRpdGxlMzJXKExQQ1dTVFIpOwogI2RlZmluZSAgICBTZXRDb25zb2xlVGl0bGUgV0lORUxJQl9OQU1FX0FXKFNldENvbnNvbGVUaXRsZSkKIEJPT0wzMiAgICAgU2V0RW5kT2ZGaWxlKEhGSUxFMzIpOworQk9PTDMyICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKExQQ1NUUixMUENTVFIpOworQk9PTDMyICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXKExQQ1dTVFIsTFBDV1NUUik7CisjZGVmaW5lICAgIFNldEVudmlyb25tZW50VmFyaWFibGUgV0lORUxJQl9OQU1FX0FXKFNldEVudmlyb25tZW50VmFyaWFibGUpCiBEV09SRCAgICAgIFNldEZpbGVQb2ludGVyKEhGSUxFMzIsTE9ORyxMUExPTkcsRFdPUkQpOwogQk9PTDMyICAgICBTZXRGaWxlVGltZShIRklMRTMyLGNvbnN0IEZJTEVUSU1FKixjb25zdCBGSUxFVElNRSosY29uc3QgRklMRVRJTUUqKTsKIFZPSUQgICAgICAgU2V0TGFzdEVycm9yRXgoRFdPUkQsRFdPUkQpOwotQk9PTDMyICAgICBTZXRUaW1lWm9uZUluZm9ybWF0aW9uKGNvbnN0IExQVElNRV9aT05FX0lORk9STUFUSU9OKTsKK0JPT0wzMiAgICAgU2V0UHJpb3JpdHlDbGFzcyhIQU5ETEUzMixEV09SRCk7CitCT09MMzIgICAgIFNldFN0ZEhhbmRsZShEV09SRCxIQU5ETEUzMik7CiBCT09MMzIgICAgIFNldFN5c3RlbVBvd2VyU3RhdGUoQk9PTDMyLEJPT0wzMik7CiBCT09MMzIgICAgIFNldFN5c3RlbVRpbWUoY29uc3QgU1lTVEVNVElNRSopOworQk9PTDMyICAgICBTZXRUaHJlYWRQcmlvcml0eShIQU5ETEUzMixJTlQzMik7CitCT09MMzIgICAgIFNldFRpbWVab25lSW5mb3JtYXRpb24oY29uc3QgTFBUSU1FX1pPTkVfSU5GT1JNQVRJT04pOwogVk9JRCAgICAgICBTbGVlcChEV09SRCk7CiBCT09MMzIgICAgIFN5c3RlbVRpbWVUb0ZpbGVUaW1lKGNvbnN0IFNZU1RFTVRJTUUqLExQRklMRVRJTUUpOwogQk9PTDMyICAgICBUcmFja1BvcHVwTWVudUV4KEhNRU5VMzIsVUlOVDMyLElOVDMyLElOVDMyLEhXTkQzMixMUFRQTVBBUkFNUyk7CkBAIC00NjEzLDggKzQ3MzYsMTAgQEAKIERXT1JEICAgICAgR2V0QXBwQ29tcGF0RmxhZ3MoSFRBU0szMik7CiBMT05HICAgICAgIEdldEJpdG1hcEJpdHMoSEJJVE1BUDMyLExPTkcsTFBWT0lEKTsKIFdPUkQgICAgICAgR2V0Q2xhc3NXb3JkKEhXTkQzMixJTlQzMik7CitEV09SRCAgICAgIEdldERpYWxvZ0Jhc2VVbml0cyh2b2lkKTsKIElOVDE2ICAgICAgR2V0RGxnQ3RybElEKEhXTkQzMik7CiBEV09SRCAgICAgIEdldExhc3RFcnJvcih2b2lkKTsKK0RXT1JEICAgICAgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnModm9pZCk7CiBDT0xPUlJFRiAgIEdldFN5c0NvbG9yKElOVDMyKTsKIERXT1JEICAgICAgR2V0VGlja0NvdW50KHZvaWQpOwogSU5UMTYgICAgICBHZXRVcGRhdGVSZ24oSFdORDMyLEhSR04zMixCT09MMzIpOwpAQCAtNDY1Miw2ICs0Nzc3LDIyIEBACiBIR0xPQkFMMTYgIEFsbG9jUmVzb3VyY2UxNihISU5TVEFOQ0UxNixIUlNSQzE2LERXT1JEKTsKIEhHTE9CQUwzMiAgQWxsb2NSZXNvdXJjZTMyKEhJTlNUQU5DRTMyLEhSU1JDMzIsRFdPUkQpOwogI2RlZmluZSAgICBBbGxvY1Jlc291cmNlIFdJTkVMSUJfTkFNRShBbGxvY1Jlc291cmNlKQorU0VHUFRSICAgICBBbnNpTG93ZXIxNihTRUdQVFIpOworI2RlZmluZSAgICBBbnNpTG93ZXIzMkEgQ2hhckxvd2VyMzJBCisjZGVmaW5lICAgIEFuc2lMb3dlcjMyVyBDaGFyTG93ZXIzMlcKKyNkZWZpbmUgICAgQW5zaUxvd2VyIFdJTkVMSUJfTkFNRV9BVyhBbnNpTG93ZXIpCitVSU5UMTYgICAgIEFuc2lMb3dlckJ1ZmYxNihMUFNUUixVSU5UMTYpOworI2RlZmluZSAgICBBbnNpTG93ZXJCdWZmMzJBIENoYXJMb3dlckJ1ZmYzMkEKKyNkZWZpbmUgICAgQW5zaUxvd2VyQnVmZjMyVyBDaGFyTG93ZXJCdWZmMzJXCisjZGVmaW5lICAgIEFuc2lMb3dlckJ1ZmYgV0lORUxJQl9OQU1FX0FXKEFuc2lMb3dlckJ1ZmYpCitTRUdQVFIgICAgIEFuc2lOZXh0MTYoU0VHUFRSKTsKKyNkZWZpbmUgICAgQW5zaU5leHQzMkEgQ2hhck5leHQzMkEKKyNkZWZpbmUgICAgQW5zaU5leHQzMlcgQ2hhck5leHQzMlcKKyNkZWZpbmUgICAgQW5zaU5leHQgV0lORUxJQl9OQU1FX0FXKEFuc2lOZXh0KQorU0VHUFRSICAgICBBbnNpUHJldjE2KFNFR1BUUixTRUdQVFIpOworI2RlZmluZSAgICBBbnNpUHJldjMyQSBDaGFyUHJldjMyQQorI2RlZmluZSAgICBBbnNpUHJldjMyVyBDaGFyUHJldjMyVworI2RlZmluZSAgICBBbnNpUHJldiBXSU5FTElCX05BTUVfQVcoQW5zaVByZXYpCiBJTlQxNiAgICAgIEFuc2lUb09lbTE2KExQQ1NUUixMUFNUUik7CiAjZGVmaW5lICAgIEFuc2lUb09lbTMyQSBDaGFyVG9PZW0zMkEKICNkZWZpbmUgICAgQW5zaVRvT2VtMzJXIENoYXJUb09lbTMyVwpAQCAtNDY2MCw2ICs0ODAxLDE0IEBACiAjZGVmaW5lICAgIEFuc2lUb09lbUJ1ZmYzMkEgQ2hhclRvT2VtQnVmZjMyQQogI2RlZmluZSAgICBBbnNpVG9PZW1CdWZmMzJXIENoYXJUb09lbUJ1ZmYzMlcKICNkZWZpbmUgICAgQW5zaVRvT2VtQnVmZiBXSU5FTElCX05BTUVfQVcoQW5zaVRvT2VtQnVmZikKK1NFR1BUUiAgICAgQW5zaVVwcGVyMTYoU0VHUFRSKTsKKyNkZWZpbmUgICAgQW5zaVVwcGVyMzJBIENoYXJVcHBlcjMyQQorI2RlZmluZSAgICBBbnNpVXBwZXIzMlcgQ2hhclVwcGVyMzJXCisjZGVmaW5lICAgIEFuc2lVcHBlciBXSU5FTElCX05BTUVfQVcoQW5zaVVwcGVyKQorVUlOVDE2ICAgICBBbnNpVXBwZXJCdWZmMTYoTFBTVFIsVUlOVDE2KTsKKyNkZWZpbmUgICAgQW5zaVVwcGVyQnVmZjMyQSBDaGFyVXBwZXJCdWZmMzJBCisjZGVmaW5lICAgIEFuc2lVcHBlckJ1ZmYzMlcgQ2hhclVwcGVyQnVmZjMyVworI2RlZmluZSAgICBBbnNpVXBwZXJCdWZmIFdJTkVMSUJfTkFNRV9BVyhBbnNpVXBwZXJCdWZmKQogQk9PTDE2ICAgICBBcHBlbmRNZW51MTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2LFNFR1BUUik7CiBCT09MMzIgICAgIEFwcGVuZE1lbnUzMkEoSE1FTlUzMixVSU5UMzIsVUlOVDMyLExQQ1NUUik7CiBCT09MMzIgICAgIEFwcGVuZE1lbnUzMlcoSE1FTlUzMixVSU5UMzIsVUlOVDMyLExQQ1dTVFIpOwpAQCAtNDY4Nyw2ICs0ODM2LDkgQEAKIExSRVNVTFQgICAgQ2FsbFdpbmRvd1Byb2MzMkEoV05EUFJPQzMyLEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKIExSRVNVTFQgICAgQ2FsbFdpbmRvd1Byb2MzMlcoV05EUFJPQzMyLEhXTkQzMixVSU5UMzIsV1BBUkFNMzIsTFBBUkFNKTsKICNkZWZpbmUgICAgQ2FsbFdpbmRvd1Byb2MgV0lORUxJQl9OQU1FX0FXKENhbGxXaW5kb3dQcm9jKQorQk9PTDE2ICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbjE2KEhXTkQxNixIV05EMTYpOworQk9PTDMyICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyKEhXTkQzMixIV05EMzIpOworI2RlZmluZSAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbiBXSU5FTElCX05BTUUoQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4pCiBCT09MMTYgICAgIENoYW5nZU1lbnUxNihITUVOVTE2LFVJTlQxNixTRUdQVFIsVUlOVDE2LFVJTlQxNik7CiBCT09MMzIgICAgIENoYW5nZU1lbnUzMkEoSE1FTlUzMixVSU5UMzIsTFBDU1RSLFVJTlQzMixVSU5UMzIpOwogQk9PTDMyICAgICBDaGFuZ2VNZW51MzJXKEhNRU5VMzIsVUlOVDMyLExQQ1dTVFIsVUlOVDMyLFVJTlQzMik7CkBAIC00NzIxLDYgKzQ4NzMsOSBAQAogQk9PTDMyICAgICBDaGFyVG9PZW1CdWZmMzJBKExQQ1NUUixMUFNUUixEV09SRCk7CiBCT09MMzIgICAgIENoYXJUb09lbUJ1ZmYzMlcoTFBDV1NUUixMUFNUUixEV09SRCk7CiAjZGVmaW5lICAgIENoYXJUb09lbUJ1ZmYgV0lORUxJQl9OQU1FX0FXKENoYXJUb09lbUJ1ZmYpCitCT09MMTYgICAgIENoZWNrTWVudUl0ZW0xNihITUVOVTE2LFVJTlQxNixVSU5UMTYpOworRFdPUkQgICAgICBDaGVja01lbnVJdGVtMzIoSE1FTlUzMixVSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgQ2hlY2tNZW51SXRlbSBXSU5FTElCX05BTUUoQ2hlY2tNZW51SXRlbSkKIEhXTkQxNiAgICAgQ2hpbGRXaW5kb3dGcm9tUG9pbnQxNihIV05EMTYsUE9JTlQxNik7CiBIV05EMzIgICAgIENoaWxkV2luZG93RnJvbVBvaW50MzIoSFdORDMyLFBPSU5UMzIpOwogI2RlZmluZSAgICBDaGlsZFdpbmRvd0Zyb21Qb2ludCBXSU5FTElCX05BTUUoQ2hpbGRXaW5kb3dGcm9tUG9pbnQpCkBAIC00ODI3LDYgKzQ5ODIsOSBAQAogSERDMzIgICAgICBDcmVhdGVJQzMyQShMUENTVFIsTFBDU1RSLExQQ1NUUixjb25zdCBERVZNT0RFMzJBKik7CiBIREMzMiAgICAgIENyZWF0ZUlDMzJXKExQQ1dTVFIsTFBDV1NUUixMUENXU1RSLGNvbnN0IERFVk1PREUzMlcqKTsKICNkZWZpbmUgICAgQ3JlYXRlSUMgV0lORUxJQl9OQU1FX0FXKENyZWF0ZUlDKQorSE1FTlUxNiAgICBDcmVhdGVNZW51MTYodm9pZCk7CitITUVOVTMyICAgIENyZWF0ZU1lbnUzMih2b2lkKTsKKyNkZWZpbmUgICAgQ3JlYXRlTWVudSBXSU5FTElCX05BTUUoQ3JlYXRlTWVudSkKIEhEQzE2ICAgICAgQ3JlYXRlTWV0YUZpbGUxNihMUENTVFIpOwogSERDMzIgICAgICBDcmVhdGVNZXRhRmlsZTMyQShMUENTVFIpOwogSERDMzIgICAgICBDcmVhdGVNZXRhRmlsZTMyVyhMUENXU1RSKTsKQEAgLTQ4NDYsNiArNTAwNCw5IEBACiBIUkdOMTYgICAgIENyZWF0ZVBvbHlnb25SZ24xNihjb25zdCBQT0lOVDE2KixJTlQxNixJTlQxNik7CiBIUkdOMzIgICAgIENyZWF0ZVBvbHlnb25SZ24zMihjb25zdCBQT0lOVDMyKixJTlQzMixJTlQzMik7CiAjZGVmaW5lICAgIENyZWF0ZVBvbHlnb25SZ24gV0lORUxJQl9OQU1FKENyZWF0ZVBvbHlnb25SZ24pCitITUVOVTE2ICAgIENyZWF0ZVBvcHVwTWVudTE2KHZvaWQpOworSE1FTlUzMiAgICBDcmVhdGVQb3B1cE1lbnUzMih2b2lkKTsKKyNkZWZpbmUgICAgQ3JlYXRlUG9wdXBNZW51IFdJTkVMSUJfTkFNRShDcmVhdGVQb3B1cE1lbnUpCiBIUkdOMTYgICAgIENyZWF0ZVJlY3RSZ24xNihJTlQxNixJTlQxNixJTlQxNixJTlQxNik7CiBIUkdOMzIgICAgIENyZWF0ZVJlY3RSZ24zMihJTlQzMixJTlQzMixJTlQzMixJTlQzMik7CiAjZGVmaW5lICAgIENyZWF0ZVJlY3RSZ24gV0lORUxJQl9OQU1FKENyZWF0ZVJlY3RSZ24pCkBAIC00ODk5LDEyICs1MDYwLDE4IEBACiBCT09MMzIgICAgIERlbGV0ZUZpbGUzMkEoTFBDU1RSKTsKIEJPT0wzMiAgICAgRGVsZXRlRmlsZTMyVyhMUENXU1RSKTsKICNkZWZpbmUgICAgRGVsZXRlRmlsZSBXSU5FTElCX05BTUVfQVcoRGVsZXRlRmlsZSkKK0JPT0wxNiAgICAgRGVsZXRlTWVudTE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7CitCT09MMzIgICAgIERlbGV0ZU1lbnUzMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOworI2RlZmluZSAgICBEZWxldGVNZW51IFdJTkVMSUJfTkFNRShEZWxldGVNZW51KQogQk9PTDE2ICAgICBEZWxldGVNZXRhRmlsZTE2KEhNRVRBRklMRTE2KTsKIEJPT0wzMiAgICAgRGVsZXRlTWV0YUZpbGUzMihITUVUQUZJTEUzMik7CiAjZGVmaW5lICAgIERlbGV0ZU1ldGFGaWxlIFdJTkVMSUJfTkFNRShEZWxldGVNZXRhRmlsZSkKIEJPT0wxNiAgICAgRGVsZXRlT2JqZWN0MTYoSEdESU9CSjE2KTsKIEJPT0wzMiAgICAgRGVsZXRlT2JqZWN0MzIoSEdESU9CSjMyKTsKICNkZWZpbmUgICAgRGVsZXRlT2JqZWN0IFdJTkVMSUJfTkFNRShEZWxldGVPYmplY3QpCitCT09MMTYgICAgIERlc3Ryb3lNZW51MTYoSE1FTlUxNik7CitCT09MMzIgICAgIERlc3Ryb3lNZW51MzIoSE1FTlUzMik7CisjZGVmaW5lICAgIERlc3Ryb3lNZW51IFdJTkVMSUJfTkFNRShEZXN0cm95TWVudSkKIElOVDE2ICAgICAgRGlhbG9nQm94MTYoSElOU1RBTkNFMTYsU0VHUFRSLEhXTkQxNixETEdQUk9DMTYpOwogI2RlZmluZSAgICBEaWFsb2dCb3gzMkEoaW5zdCx0ZW1wbGF0ZSxvd25lcixmdW5jKSBcCiAgICAgICAgICAgIERpYWxvZ0JveFBhcmFtMzJBKGluc3QsdGVtcGxhdGUsb3duZXIsZnVuYywwKQpAQCAtNDk1Myw2ICs1MTIwLDkgQEAKIEJPT0wxNiAgICAgRHJhd0ZyYW1lQ29udHJvbDE2KEhEQzE2LExQUkVDVDE2LFVJTlQxNixVSU5UMTYpOwogQk9PTDMyICAgICBEcmF3RnJhbWVDb250cm9sMzIoSERDMzIsTFBSRUNUMzIsVUlOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIERyYXdGcmFtZUNvbnRyb2wgV0lORUxJQl9OQU1FKERyYXdGcmFtZUNvbnRyb2wpCitWT0lEICAgICAgIERyYXdNZW51QmFyMTYoSFdORDE2KTsKK0JPT0wzMiAgICAgRHJhd01lbnVCYXIzMihIV05EMzIpOworI2RlZmluZSAgICBEcmF3TWVudUJhciBXSU5FTElCX05BTUUoRHJhd01lbnVCYXIpCiBJTlQxNiAgICAgIERyYXdUZXh0MTYoSERDMTYsTFBDU1RSLElOVDE2LExQUkVDVDE2LFVJTlQxNik7CiBJTlQzMiAgICAgIERyYXdUZXh0MzJBKEhEQzMyLExQQ1NUUixJTlQzMixMUFJFQ1QzMixVSU5UMzIpOwogSU5UMzIgICAgICBEcmF3VGV4dDMyVyhIREMzMixMUENXU1RSLElOVDMyLExQUkVDVDMyLFVJTlQzMik7CkBAIC00OTYwLDYgKzUxMzAsOSBAQAogQk9PTDE2ICAgICBFbGxpcHNlMTYoSERDMTYsSU5UMTYsSU5UMTYsSU5UMTYsSU5UMTYpOwogQk9PTDMyICAgICBFbGxpcHNlMzIoSERDMzIsSU5UMzIsSU5UMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBFbGxpcHNlIFdJTkVMSUJfTkFNRShFbGxpcHNlKQorQk9PTDE2ICAgICBFbmFibGVNZW51SXRlbTE2KEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7CitCT09MMzIgICAgIEVuYWJsZU1lbnVJdGVtMzIoSE1FTlUzMixVSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgRW5hYmxlTWVudUl0ZW0gV0lORUxJQl9OQU1FKEVuYWJsZU1lbnVJdGVtKQogQk9PTDE2ICAgICBFbmFibGVTY3JvbGxCYXIxNihIV05EMTYsSU5UMTYsVUlOVDE2KTsKIEJPT0wzMiAgICAgRW5hYmxlU2Nyb2xsQmFyMzIoSFdORDMyLElOVDMyLFVJTlQzMik7CiAjZGVmaW5lICAgIEVuYWJsZVNjcm9sbEJhciBXSU5FTElCX05BTUUoRW5hYmxlU2Nyb2xsQmFyKQpAQCAtNTE5NCw2ICs1MzY3LDIyIEBACiBJTlQxNiAgICAgIEdldE1hcE1vZGUxNihIREMxNik7CiBJTlQzMiAgICAgIEdldE1hcE1vZGUzMihIREMzMik7CiAjZGVmaW5lICAgIEdldE1hcE1vZGUgV0lORUxJQl9OQU1FKEdldE1hcE1vZGUpCitITUVOVTE2ICAgIEdldE1lbnUxNihIV05EMTYpOworSE1FTlUzMiAgICBHZXRNZW51MzIoSFdORDMyKTsKKyNkZWZpbmUgICAgR2V0TWVudSBXSU5FTElCX05BTUUoR2V0TWVudSkKK0lOVDE2ICAgICAgR2V0TWVudUl0ZW1Db3VudDE2KEhNRU5VMTYpOworSU5UMzIgICAgICBHZXRNZW51SXRlbUNvdW50MzIoSE1FTlUzMik7CisjZGVmaW5lICAgIEdldE1lbnVJdGVtQ291bnQgV0lORUxJQl9OQU1FKEdldE1lbnVJdGVtQ291bnQpCitVSU5UMTYgICAgIEdldE1lbnVJdGVtSUQxNihITUVOVTE2LElOVDE2KTsKK1VJTlQzMiAgICAgR2V0TWVudUl0ZW1JRDMyKEhNRU5VMzIsSU5UMzIpOworI2RlZmluZSAgICBHZXRNZW51SXRlbUlEIFdJTkVMSUJfTkFNRShHZXRNZW51SXRlbUlEKQorVUlOVDE2ICAgICBHZXRNZW51U3RhdGUxNihITUVOVTE2LFVJTlQxNixVSU5UMTYpOworVUlOVDMyICAgICBHZXRNZW51U3RhdGUzMihITUVOVTMyLFVJTlQzMixVSU5UMzIpOworI2RlZmluZSAgICBHZXRNZW51U3RhdGUgV0lORUxJQl9OQU1FKEdldE1lbnVTdGF0ZSkKK0lOVDE2ICAgICAgR2V0TWVudVN0cmluZzE2KEhNRU5VMTYsVUlOVDE2LExQU1RSLElOVDE2LFVJTlQxNik7CitJTlQzMiAgICAgIEdldE1lbnVTdHJpbmczMkEoSE1FTlUzMixVSU5UMzIsTFBTVFIsSU5UMzIsVUlOVDMyKTsKK0lOVDMyICAgICAgR2V0TWVudVN0cmluZzMyVyhITUVOVTMyLFVJTlQzMixMUFdTVFIsSU5UMzIsVUlOVDMyKTsKKyNkZWZpbmUgICAgR2V0TWVudVN0cmluZyBXSU5FTElCX05BTUVfQVcoR2V0TWVudVN0cmluZykKIElOVDE2ICAgICAgR2V0TW9kdWxlRmlsZU5hbWUxNihISU5TVEFOQ0UxNixMUFNUUixJTlQxNik7CiBEV09SRCAgICAgIEdldE1vZHVsZUZpbGVOYW1lMzJBKEhNT0RVTEUzMixMUFNUUixEV09SRCk7CiBEV09SRCAgICAgIEdldE1vZHVsZUZpbGVOYW1lMzJXKEhNT0RVTEUzMixMUFdTVFIsRFdPUkQpOwpAQCAtNTI2NCw2ICs1NDUzLDkgQEAKIElOVDE2ICAgICAgR2V0U3RyZXRjaEJsdE1vZGUxNihIREMxNik7CiBJTlQzMiAgICAgIEdldFN0cmV0Y2hCbHRNb2RlMzIoSERDMzIpOwogI2RlZmluZSAgICBHZXRTdHJldGNoQmx0TW9kZSBXSU5FTElCX05BTUUoR2V0U3RyZXRjaEJsdE1vZGUpCitITUVOVTE2ICAgIEdldFN1Yk1lbnUxNihITUVOVTE2LElOVDE2KTsKK0hNRU5VMzIgICAgR2V0U3ViTWVudTMyKEhNRU5VMzIsSU5UMzIpOworI2RlZmluZSAgICBHZXRTdWJNZW51IFdJTkVMSUJfTkFNRShHZXRTdWJNZW51KQogSEJSVVNIMTYgICBHZXRTeXNDb2xvckJydXNoMTYoSU5UMTYpOwogSEJSVVNIMzIgICBHZXRTeXNDb2xvckJydXNoMzIoSU5UMzIpOwogI2RlZmluZSAgICBHZXRTeXNDb2xvckJydXNoIFdJTkVMSUJfTkFNRShHZXRTeXNDb2xvckJydXNoKQpAQCAtNTI3NCw2ICs1NDY2LDkgQEAKIFVJTlQzMiAgICAgR2V0U3lzdGVtRGlyZWN0b3J5MzJBKExQU1RSLFVJTlQzMik7CiBVSU5UMzIgICAgIEdldFN5c3RlbURpcmVjdG9yeTMyVyhMUFdTVFIsVUlOVDMyKTsKICNkZWZpbmUgICAgR2V0U3lzdGVtRGlyZWN0b3J5IFdJTkVMSUJfTkFNRV9BVyhHZXRTeXN0ZW1EaXJlY3RvcnkpCitITUVOVTE2ICAgIEdldFN5c3RlbU1lbnUxNihIV05EMTYsQk9PTDE2KTsKK0hNRU5VMzIgICAgR2V0U3lzdGVtTWVudTMyKEhXTkQzMixCT09MMzIpOworI2RlZmluZSAgICBHZXRTeXN0ZW1NZW51IFdJTkVMSUJfTkFNRShHZXRTeXN0ZW1NZW51KQogVUlOVDE2ICAgICBHZXRUZW1wRmlsZU5hbWUxNihCWVRFLExQQ1NUUixVSU5UMTYsTFBTVFIpOwogVUlOVDMyICAgICBHZXRUZW1wRmlsZU5hbWUzMkEoTFBDU1RSLExQQ1NUUixVSU5UMzIsTFBTVFIpOwogVUlOVDMyICAgICBHZXRUZW1wRmlsZU5hbWUzMlcoTFBDV1NUUixMUENXU1RSLFVJTlQzMixMUFdTVFIpOwpAQCAtNTM5MCw2ICs1NTg1LDkgQEAKIEJPT0wxNiAgICAgR2xvYmFsVW5sb2NrMTYoSEdMT0JBTDE2KTsKIEJPT0wzMiAgICAgR2xvYmFsVW5sb2NrMzIoSEdMT0JBTDMyKTsKICNkZWZpbmUgICAgR2xvYmFsVW5sb2NrIFdJTkVMSUJfTkFNRShHbG9iYWxVbmxvY2spCitCT09MMTYgICAgIEhpbGl0ZU1lbnVJdGVtMTYoSFdORDE2LEhNRU5VMTYsVUlOVDE2LFVJTlQxNik7CitCT09MMzIgICAgIEhpbGl0ZU1lbnVJdGVtMzIoSFdORDMyLEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIEhpbGl0ZU1lbnVJdGVtIFdJTkVMSUJfTkFNRShIaWxpdGVNZW51SXRlbSkKIHZvaWQgICAgICAgSW5mbGF0ZVJlY3QxNihMUFJFQ1QxNixJTlQxNixJTlQxNik7CiB2b2lkICAgICAgIEluZmxhdGVSZWN0MzIoTFBSRUNUMzIsSU5UMzIsSU5UMzIpOwogI2RlZmluZSAgICBJbmZsYXRlUmVjdCBXSU5FTElCX05BTUUoSW5mbGF0ZVJlY3QpCkBAIC01NDUwLDYgKzU2NDgsMTIgQEAKIEJPT0wzMiAgICAgSXNDaGFyVXBwZXIzMkEoQ0hBUik7CiBCT09MMzIgICAgIElzQ2hhclVwcGVyMzJXKFdDSEFSKTsKICNkZWZpbmUgICAgSXNDaGFyVXBwZXIgV0lORUxJQl9OQU1FX0FXKElzQ2hhclVwcGVyKQorQk9PTDE2ICAgICBJc0RCQ1NMZWFkQnl0ZTE2KEJZVEUpOworQk9PTDMyICAgICBJc0RCQ1NMZWFkQnl0ZTMyKEJZVEUpOworI2RlZmluZSAgICBJc0RCQ1NMZWFkQnl0ZSBXSU5FTElCX05BTUUoSXNEQkNTTGVhZEJ5dGUpCitCT09MMTYgICAgIElzTWVudTE2KEhNRU5VMTYpOworQk9PTDMyICAgICBJc01lbnUzMihITUVOVTMyKTsKKyNkZWZpbmUgICAgSXNNZW51IFdJTkVMSUJfTkFNRShJc01lbnUpCiBCT09MMTYgICAgIElzUmVjdEVtcHR5MTYoY29uc3QgUkVDVDE2Kik7CiBCT09MMzIgICAgIElzUmVjdEVtcHR5MzIoY29uc3QgUkVDVDMyKik7CiAjZGVmaW5lICAgIElzUmVjdEVtcHR5IFdJTkVMSUJfTkFNRShJc1JlY3RFbXB0eSkKQEAgLTU3MzIsNiArNTkzNiw5IEBACiBCT09MMzIgICAgIFJlbW92ZURpcmVjdG9yeTMyQShMUENTVFIpOwogQk9PTDMyICAgICBSZW1vdmVEaXJlY3RvcnkzMlcoTFBDV1NUUik7CiAjZGVmaW5lICAgIFJlbW92ZURpcmVjdG9yeSBXSU5FTElCX05BTUVfQVcoUmVtb3ZlRGlyZWN0b3J5KQorQk9PTDE2ICAgICBSZW1vdmVNZW51MTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2KTsKK0JPT0wzMiAgICAgUmVtb3ZlTWVudTMyKEhNRU5VMzIsVUlOVDMyLFVJTlQzMik7CisjZGVmaW5lICAgIFJlbW92ZU1lbnUgV0lORUxJQl9OQU1FKFJlbW92ZU1lbnUpCiBIREMxNiAgICAgIFJlc2V0REMxNihIREMxNixjb25zdCBERVZNT0RFMTYgKik7CiBIREMzMiAgICAgIFJlc2V0REMzMkEoSERDMzIsY29uc3QgREVWTU9ERTMyQSAqKTsKIEhEQzMyICAgICAgUmVzZXREQzMyVyhIREMzMixjb25zdCBERVZNT0RFMzJXICopOwpAQCAtNTgxOCw5ICs2MDI1LDYgQEAKIHZvaWQgICAgICAgU2V0RGxnSXRlbVRleHQzMkEoSFdORDMyLElOVDMyLExQQ1NUUik7CiB2b2lkICAgICAgIFNldERsZ0l0ZW1UZXh0MzJXKEhXTkQzMixJTlQzMixMUENXU1RSKTsKICNkZWZpbmUgICAgU2V0RGxnSXRlbVRleHQgV0lORUxJQl9OQU1FX0FXKFNldERsZ0l0ZW1UZXh0KQotQk9PTDMyICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKExQQ1NUUixMUENTVFIpOwotQk9PTDMyICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXKExQQ1dTVFIsTFBDV1NUUik7Ci0jZGVmaW5lICAgIFNldEVudmlyb25tZW50VmFyaWFibGUgV0lORUxJQl9OQU1FX0FXKFNldEVudmlyb25tZW50VmFyaWFibGUpCiBCT09MMTYgICAgIFNldEZpbGVBdHRyaWJ1dGVzMTYoTFBDU1RSLERXT1JEKTsKIEJPT0wzMiAgICAgU2V0RmlsZUF0dHJpYnV0ZXMzMkEoTFBDU1RSLERXT1JEKTsKIEJPT0wzMiAgICAgU2V0RmlsZUF0dHJpYnV0ZXMzMlcoTFBDV1NUUixEV09SRCk7CkBAIC01ODM3LDYgKzYwNDEsMTIgQEAKIElOVDE2ICAgICAgU2V0TWFwTW9kZTE2KEhEQzE2LElOVDE2KTsKIElOVDMyICAgICAgU2V0TWFwTW9kZTMyKEhEQzMyLElOVDMyKTsKICNkZWZpbmUgICAgU2V0TWFwTW9kZSBXSU5FTElCX05BTUUoU2V0TWFwTW9kZSkKK0JPT0wxNiAgICAgU2V0TWVudTE2KEhXTkQxNixITUVOVTE2KTsKK0JPT0wzMiAgICAgU2V0TWVudTMyKEhXTkQzMixITUVOVTMyKTsKKyNkZWZpbmUgICAgU2V0TWVudSBXSU5FTElCX05BTUUoU2V0TWVudSkKK0JPT0wxNiAgICAgU2V0TWVudUl0ZW1CaXRtYXBzMTYoSE1FTlUxNixVSU5UMTYsVUlOVDE2LEhCSVRNQVAxNixIQklUTUFQMTYpOworQk9PTDMyICAgICBTZXRNZW51SXRlbUJpdG1hcHMzMihITUVOVTMyLFVJTlQzMixVSU5UMzIsSEJJVE1BUDMyLEhCSVRNQVAzMik7CisjZGVmaW5lICAgIFNldE1lbnVJdGVtQml0bWFwcyBXSU5FTElCX05BTUUoU2V0TWVudUl0ZW1CaXRtYXBzKQogQ09MT1JSRUYgICBTZXRQaXhlbDE2KEhEQzE2LElOVDE2LElOVDE2LENPTE9SUkVGKTsKIENPTE9SUkVGICAgU2V0UGl4ZWwzMihIREMzMixJTlQzMixJTlQzMixDT0xPUlJFRik7CiAjZGVmaW5lICAgIFNldFBpeGVsIFdJTkVMSUJfTkFNRShTZXRQaXhlbCkKQEAgLTU4NzcsNiArNjA4Nyw5IEBACiBVSU5UMTYgICAgIFNldFN5c3RlbVRpbWVyMTYoSFdORDE2LFVJTlQxNixVSU5UMTYsVElNRVJQUk9DMTYpOwogVUlOVDMyICAgICBTZXRTeXN0ZW1UaW1lcjMyKEhXTkQzMixVSU5UMzIsVUlOVDMyLFRJTUVSUFJPQzMyKTsKICNkZWZpbmUgICAgU2V0U3lzdGVtVGltZXIgV0lORUxJQl9OQU1FKFNldFN5c3RlbVRpbWVyKQorQk9PTDE2ICAgICBTZXRTeXN0ZW1NZW51MTYoSFdORDE2LEhNRU5VMTYpOworQk9PTDMyICAgICBTZXRTeXN0ZW1NZW51MzIoSFdORDMyLEhNRU5VMzIpOworI2RlZmluZSAgICBTZXRTeXN0ZW1NZW51IFdJTkVMSUJfTkFNRShTZXRTeXN0ZW1NZW51KQogVUlOVDE2ICAgICBTZXRUZXh0QWxpZ24xNihIREMxNixVSU5UMTYpOwogVUlOVDMyICAgICBTZXRUZXh0QWxpZ24zMihIREMzMixVSU5UMzIpOwogI2RlZmluZSAgICBTZXRUZXh0QWxpZ24gV0lORUxJQl9OQU1FKFNldFRleHRBbGlnbikKQEAgLTYxMzEsMTggKzYzNDQsMTIgQEAKIEFUT00gICAgICAgQWRkQXRvbShTRUdQVFIpOwogSU5UICAgICAgICBBZGRGb250UmVzb3VyY2UoTFBDU1RSKTsKIEJPT0wgICAgICAgQW5pbWF0ZVBhbGV0dGUoSFBBTEVUVEUxNixVSU5ULFVJTlQsTFBQQUxFVFRFRU5UUlkpOwotVUlOVCAgICAgICBBbnNpTG93ZXJCdWZmKExQU1RSLFVJTlQpOwotU0VHUFRSICAgICBBbnNpTmV4dChTRUdQVFIpOwotU0VHUFRSICAgICBBbnNpUHJldihTRUdQVFIsU0VHUFRSKTsKLVVJTlQgICAgICAgQW5zaVVwcGVyQnVmZihMUFNUUixVSU5UKTsKIEJPT0wgICAgICAgQW55UG9wdXAodm9pZCk7CiBVSU5UICAgICAgIEFycmFuZ2VJY29uaWNXaW5kb3dzKEhXTkQpOwogSERXUDE2ICAgICBCZWdpbkRlZmVyV2luZG93UG9zKElOVCk7CiBCT09MICAgICAgIEJyaW5nV2luZG93VG9Ub3AoSFdORCk7CiB2b2lkICAgICAgIENhbGNDaGlsZFNjcm9sbChIV05ELFdPUkQpOwogQk9PTCAgICAgICBDYWxsTXNnRmlsdGVyKFNFR1BUUixJTlQpOwotQk9PTCAgICAgICBDaGFuZ2VDbGlwYm9hcmRDaGFpbihIV05ELEhXTkQpOwotSU5UICAgICAgICBDaGVja01lbnVJdGVtKEhNRU5VMTYsVUlOVCxVSU5UKTsKIEJPT0wgICAgICAgQ2xvc2VDbGlwYm9hcmQodm9pZCk7CiB2b2lkICAgICAgIENsb3NlU291bmQodm9pZCk7CiBCT09MICAgICAgIENsb3NlV2luZG93KEhXTkQpOwpAQCAtNjE1MywyNCArNjM2MCwxOCBAQAogSENVUlNPUjE2ICBDcmVhdGVDdXJzb3IoSElOU1RBTkNFMTYsSU5ULElOVCxJTlQsSU5ULGNvbnN0IEJZVEUqLGNvbnN0IEJZVEUqKTsKIEhHTE9CQUwxNiAgQ3JlYXRlQ3Vyc29ySWNvbkluZGlyZWN0KEhJTlNUQU5DRTE2LENVUlNPUklDT05JTkZPKixjb25zdCBCWVRFKixjb25zdCBCWVRFKik7CiBISUNPTjE2ICAgIENyZWF0ZUljb24oSElOU1RBTkNFMTYsSU5ULElOVCxCWVRFLEJZVEUsY29uc3QgQllURSosY29uc3QgQllURSopOwotSE1FTlUxNiAgICBDcmVhdGVNZW51KHZvaWQpOwogSFBBTEVUVEUxNiBDcmVhdGVQYWxldHRlKGNvbnN0IExPR1BBTEVUVEUqKTsKLUhNRU5VMTYgICAgQ3JlYXRlUG9wdXBNZW51KHZvaWQpOwogSERXUDE2ICAgICBEZWZlcldpbmRvd1BvcyhIRFdQMTYsSFdORCxIV05ELElOVCxJTlQsSU5ULElOVCxVSU5UKTsKIEFUT00gICAgICAgRGVsZXRlQXRvbShBVE9NKTsKLUJPT0wgICAgICAgRGVsZXRlTWVudShITUVOVTE2LFVJTlQsVUlOVCk7CiBCT09MICAgICAgIERlc3Ryb3lDdXJzb3IoSENVUlNPUjE2KTsKIEJPT0wgICAgICAgRGVzdHJveUljb24oSElDT04xNik7Ci1CT09MICAgICAgIERlc3Ryb3lNZW51KEhNRU5VMTYpOwogQk9PTCAgICAgICBEZXN0cm95V2luZG93KEhXTkQpOwogTE9ORyAgICAgICBEaXNwYXRjaE1lc3NhZ2UoY29uc3QgTVNHMTYqKTsKIEJPT0wxNiAgICAgRHJhZ0RldGVjdChIV05EMTYsUE9JTlQxNik7CiBEV09SRCAgICAgIERyYWdPYmplY3QoSFdORCwgSFdORCwgV09SRCwgSEFORExFMTYsIFdPUkQsIEhDVVJTT1IxNik7CiBCT09MICAgICAgIERyYXdJY29uKEhEQzE2LElOVCxJTlQsSElDT04xNik7Ci12b2lkICAgICAgIERyYXdNZW51QmFyKEhXTkQpOwogRFdPUkQgICAgICBEdW1wSWNvbihTRUdQVFIsV09SRCosU0VHUFRSKixTRUdQVFIqKTsKIEJPT0wgICAgICAgRW1wdHlDbGlwYm9hcmQodm9pZCk7Ci1CT09MICAgICAgIEVuYWJsZU1lbnVJdGVtKEhNRU5VMTYsVUlOVCxVSU5UKTsKIEJPT0wgICAgICAgRW5hYmxlV2luZG93KEhXTkQsQk9PTCk7CiBCT09MICAgICAgIEVuZERlZmVyV2luZG93UG9zKEhEV1AxNik7CiBVSU5UMTYgICAgIEVudW1DbGlwYm9hcmRGb3JtYXRzKFVJTlQxNik7CkBAIC02MTk3LDcgKzYzOTgsNiBAQAogSENVUlNPUjE2ICBHZXRDdXJzb3Iodm9pZCk7CiBTRUdQVFIgICAgIEdldERPU0Vudmlyb25tZW50KHZvaWQpOwogaW50ICAgICAgICBHZXREZXZpY2VDYXBzKEhEQzE2LFdPUkQpOwotRFdPUkQgICAgICBHZXREaWFsb2dCYXNlVW5pdHModm9pZCk7CiBIV05EICAgICAgIEdldERsZ0l0ZW0oSFdORCxXT1JEKTsKIFdPUkQgICAgICAgR2V0RGxnSXRlbUludChIV05ELFdPUkQsQk9PTCosQk9PTCk7CiBXT1JEICAgICAgIEdldERvdWJsZUNsaWNrVGltZSh2b2lkKTsKQEAgLTYyMTEsMTIgKzY0MTEsNiBAQAogdm9pZCAgICAgICBHZXRLZXlib2FyZFN0YXRlKEJZVEUqKTsKIGludCAgICAgICAgR2V0S2V5Ym9hcmRUeXBlKGludCk7CiBIV05EICAgICAgIEdldExhc3RBY3RpdmVQb3B1cChIV05EKTsKLUhNRU5VMTYgICAgR2V0TWVudShIV05EKTsKLURXT1JEICAgICAgR2V0TWVudUNoZWNrTWFya0RpbWVuc2lvbnModm9pZCk7Ci1JTlQgICAgICAgIEdldE1lbnVJdGVtQ291bnQoSE1FTlUxNik7Ci1VSU5UICAgICAgIEdldE1lbnVJdGVtSUQoSE1FTlUxNixpbnQpOwotVUlOVCAgICAgICBHZXRNZW51U3RhdGUoSE1FTlUxNixVSU5ULFVJTlQpOwotaW50ICAgICAgICBHZXRNZW51U3RyaW5nKEhNRU5VMTYsVUlOVCxMUFNUUixzaG9ydCxVSU5UKTsKIEJPT0wgICAgICAgR2V0TWVzc2FnZShTRUdQVFIsSFdORCxVSU5ULFVJTlQpOwogTE9ORyAgICAgICBHZXRNZXNzYWdlRXh0cmFJbmZvKHZvaWQpOwogRFdPUkQgICAgICBHZXRNZXNzYWdlUG9zKHZvaWQpOwpAQCAtNjIzMyw4ICs2NDI3LDYgQEAKIGludCAgICAgICAgR2V0UHJpb3JpdHlDbGlwYm9hcmRGb3JtYXQoV09SRCosc2hvcnQpOwogRFdPUkQgICAgICBHZXRRdWV1ZVN0YXR1cyhVSU5UKTsKIEJPT0wgICAgICAgR2V0UmFzdGVyaXplckNhcHMoTFBSQVNURVJJWkVSX1NUQVRVUyxVSU5UKTsKLUhNRU5VMTYgICAgR2V0U3ViTWVudShITUVOVTE2LHNob3J0KTsKLUhNRU5VMTYgICAgR2V0U3lzdGVtTWVudShIV05ELEJPT0wpOwogaW50ICAgICAgICBHZXRTeXN0ZW1NZXRyaWNzKFdPUkQpOwogV09SRCAgICAgICBHZXRTeXN0ZW1QYWxldHRlRW50cmllcyhIREMxNixXT1JELFdPUkQsTFBQQUxFVFRFRU5UUlkpOwogV09SRCAgICAgICBHZXRTeXN0ZW1QYWxldHRlVXNlKEhEQzE2KTsKQEAgLTYyNTIsNyArNjQ0NCw2IEBACiB2b2lkICAgICAgIEdsb2JhbFVuZml4KEhHTE9CQUwxNik7CiBTRUdQVFIgICAgIEdsb2JhbFdpcmUoSEdMT0JBTDE2KTsKIEJPT0wgICAgICAgR3JheVN0cmluZyhIREMxNixIQlJVU0gxNixHUkFZU1RSSU5HUFJPQzE2LExQQVJBTSxJTlQsSU5ULElOVCxJTlQsSU5UKTsKLUJPT0wgICAgICAgSGlsaXRlTWVudUl0ZW0oSFdORCxITUVOVTE2LFVJTlQsVUlOVCk7CiBCT09MICAgICAgIEluU2VuZE1lc3NhZ2Uodm9pZCk7CiBXT1JEICAgICAgIEluaXRBdG9tVGFibGUoV09SRCk7CiBCT09MICAgICAgIElzQ2hpbGQoSFdORCxIV05EKTsKQEAgLTYyNjAsMTQgKzY0NTEsMTIgQEAKIEJPT0wgICAgICAgSXNEaWFsb2dNZXNzYWdlKEhXTkQsTFBNU0cxNik7CiBXT1JEICAgICAgIElzRGxnQnV0dG9uQ2hlY2tlZChIV05ELFdPUkQpOwogQk9PTCAgICAgICBJc0ljb25pYyhIV05EKTsKLUJPT0wgICAgICAgSXNNZW51KEhNRU5VMTYpOwogQk9PTCAgICAgICBJc1ZhbGlkTWV0YUZpbGUoSE1FVEFGSUxFMTYpOwogQk9PTCAgICAgICBJc1dpbmRvd0VuYWJsZWQoSFdORCk7CiBCT09MICAgICAgIElzV2luZG93VmlzaWJsZShIV05EKTsKIEJPT0wgICAgICAgSXNab29tZWQoSFdORCk7CiBISU5TVEFOQ0UxNiBMb2FkTW9kdWxlKExQQ1NUUixMUFZPSUQpOwogRkFSUFJPQzE2ICBMb2NhbE5vdGlmeShGQVJQUk9DMTYpOwotSE1FTlUxNiAgICBMb29rdXBNZW51SGFuZGxlKEhNRU5VMTYsSU5UKTsKIFdPUkQgICAgICAgTWFwVmlydHVhbEtleShXT1JELFdPUkQpOwogdm9pZCAgICAgICBNZXNzYWdlQmVlcChXT1JEKTsKIEJPT0wgICAgICAgTW92ZVdpbmRvdyhIV05ELHNob3J0LHNob3J0LHNob3J0LHNob3J0LEJPT0wpOwpAQCAtNjI5MCw3ICs2NDc5LDYgQEAKIHZvaWQgICAgICAgUHJvZlN0b3Aodm9pZCk7CiBXT1JEICAgICAgIFJlYWxpemVEZWZhdWx0UGFsZXR0ZShIREMxNik7CiBCT09MICAgICAgIFJlbW92ZUZvbnRSZXNvdXJjZShMUFNUUik7Ci1CT09MICAgICAgIFJlbW92ZU1lbnUoSE1FTlUxNixVSU5ULFVJTlQpOwogdm9pZCAgICAgICBSZXBseU1lc3NhZ2UoTFJFU1VMVCk7CiBCT09MICAgICAgIFJlc2l6ZVBhbGV0dGUoSFBBTEVUVEUxNixVSU5UKTsKIHZvaWQgICAgICAgU2Nyb2xsQ2hpbGRyZW4oSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CkBAIC02MzA5LDggKzY0OTcsNiBAQAogV09SRCAgICAgICBTZXRIb29rRmxhZ3MoSERDMTYsV09SRCk7CiB2b2lkICAgICAgIFNldEtleWJvYXJkU3RhdGUoQllURSopOwogRFdPUkQgICAgICBTZXRNYXBwZXJGbGFncyhIREMxNixEV09SRCk7Ci1CT09MICAgICAgIFNldE1lbnUoSFdORCxITUVOVTE2KTsKLUJPT0wgICAgICAgU2V0TWVudUl0ZW1CaXRtYXBzKEhNRU5VMTYsVUlOVCxVSU5ULEhCSVRNQVAxNixIQklUTUFQMTYpOwogQk9PTCAgICAgICBTZXRNZXNzYWdlUXVldWUoaW50KTsKIEhNRVRBRklMRTE2IFNldE1ldGFGaWxlQml0cyhIR0xPQkFMMTYpOwogV09SRCAgICAgICBTZXRQYWxldHRlRW50cmllcyhIUEFMRVRURTE2LFdPUkQsV09SRCxMUFBBTEVUVEVFTlRSWSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbmVycm9yLmggYi9pbmNsdWRlL3dpbmVycm9yLmgKaW5kZXggYzQ4Y2M2OS4uNjQ4OGU1ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5lcnJvci5oCisrKyBiL2luY2x1ZGUvd2luZXJyb3IuaApAQCAtMSwzICsxLDcgQEAKKyNpZm5kZWYgX19XSU5FX1dJTkVSUk9SX0gKKyNkZWZpbmUgX19XSU5FX1dJTkVSUk9SX0gKKworCiBleHRlcm4gaW50IFdJTjMyX0xhc3RFcnJvcjsKIAogLyogRVJST1JfVU5LTk9XTiBpcyBhIHBsYWNlaG9sZGVyIGZvciBlcnJvciBjb25kaXRpb25zIHdoaWNoIGhhdmVuJ3QKQEAgLTMwLDMgKzM0LDUgQEAKICNkZWZpbmUgRVJST1JfSU9fREVWSUNFICAgICAgICAgICAgIDExMTcKICNkZWZpbmUgRVJST1JfUE9TU0lCTEVfREVBRExPQ0sgICAgIDExMzEKICNkZWZpbmUgRVJST1JfQkFEX0RFVklDRSAgICAgICAgICAgIDEyMDAKKworI2VuZGlmICAvKiBfX1dJTkVfV0lORVJST1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5udC5oIGIvaW5jbHVkZS93aW5udC5oCmluZGV4IDY1NGVjNDYuLjU1YTk2YTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2lubnQuaAorKysgYi9pbmNsdWRlL3dpbm50LmgKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJ3aW50eXBlcy5oIgogCiAvKiBIZWFwIGZsYWdzICovCisKICNkZWZpbmUgSEVBUF9OT19TRVJJQUxJWkUgICAgICAgICAgICAgICAweDAwMDAwMDAxCiAjZGVmaW5lIEhFQVBfR1JPV0FCTEUgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMgogI2RlZmluZSBIRUFQX0dFTkVSQVRFX0VYQ0VQVElPTlMgICAgICAgIDB4MDAwMDAwMDQKQEAgLTEzOCw0ICsxMzksNTAgQEAKIAogI2VuZGlmICAvKiBfX1dJTkVfXyAqLwogCisvKiBMYW5ndWFnZSBJRHMgKi8KKworI2RlZmluZSBMQU5HX05FVVRSQUwgICAgICAgICAgICAgICAgICAgICAweDAwCisjZGVmaW5lIExBTkdfQVJBQklDICAgICAgICAgICAgICAgICAgICAgIDB4MDEKKyNkZWZpbmUgTEFOR19BRlJJS0FBTlMgICAgICAgICAgICAgICAgICAgMHgzNgorI2RlZmluZSBMQU5HX0FMQkFOSUFOICAgICAgICAgICAgICAgICAgICAweDFjCisjZGVmaW5lIExBTkdfQkFTUVVFICAgICAgICAgICAgICAgICAgICAgIDB4MmQKKyNkZWZpbmUgTEFOR19CVUxHQVJJQU4gICAgICAgICAgICAgICAgICAgMHgwMgorI2RlZmluZSBMQU5HX0JZRUxPUlVTU0lBTiAgICAgICAgICAgICAgICAweDIzCisjZGVmaW5lIExBTkdfQ0FUQUxBTiAgICAgICAgICAgICAgICAgICAgIDB4MDMKKyNkZWZpbmUgTEFOR19DSElORVNFICAgICAgICAgICAgICAgICAgICAgMHgwNAorI2RlZmluZSBMQU5HX0NST0FUSUFOICAgICAgICAgICAgICAgICAgICAweDFhCisjZGVmaW5lIExBTkdfQ1pFQ0ggICAgICAgICAgICAgICAgICAgICAgIDB4MDUKKyNkZWZpbmUgTEFOR19EQU5JU0ggICAgICAgICAgICAgICAgICAgICAgMHgwNgorI2RlZmluZSBMQU5HX0RVVENIICAgICAgICAgICAgICAgICAgICAgICAweDEzCisjZGVmaW5lIExBTkdfRU5HTElTSCAgICAgICAgICAgICAgICAgICAgIDB4MDkKKyNkZWZpbmUgTEFOR19FU1RPTklBTiAgICAgICAgICAgICAgICAgICAgMHgyNQorI2RlZmluZSBMQU5HX0ZBRVJPRVNFICAgICAgICAgICAgICAgICAgICAweDM4CisjZGVmaW5lIExBTkdfRkFSU0kgICAgICAgICAgICAgICAgICAgICAgIDB4MjkKKyNkZWZpbmUgTEFOR19GSU5OSVNIICAgICAgICAgICAgICAgICAgICAgMHgwYgorI2RlZmluZSBMQU5HX0ZSRU5DSCAgICAgICAgICAgICAgICAgICAgICAweDBjCisjZGVmaW5lIExBTkdfR0VSTUFOICAgICAgICAgICAgICAgICAgICAgIDB4MDcKKyNkZWZpbmUgTEFOR19HUkVFSyAgICAgICAgICAgICAgICAgICAgICAgMHgwOAorI2RlZmluZSBMQU5HX0hFQlJFVyAgICAgICAgICAgICAgICAgICAgICAweDBECisjZGVmaW5lIExBTkdfSFVOR0FSSUFOICAgICAgICAgICAgICAgICAgIDB4MGUKKyNkZWZpbmUgTEFOR19JQ0VMQU5ESUMgICAgICAgICAgICAgICAgICAgMHgwZgorI2RlZmluZSBMQU5HX0lORE9ORVNJQU4gICAgICAgICAgICAgICAgICAweDIxCisjZGVmaW5lIExBTkdfSVRBTElBTiAgICAgICAgICAgICAgICAgICAgIDB4MTAKKyNkZWZpbmUgTEFOR19KQVBBTkVTRSAgICAgICAgICAgICAgICAgICAgMHgxMQorI2RlZmluZSBMQU5HX0tPUkVBTiAgICAgICAgICAgICAgICAgICAgICAweDEyCisjZGVmaW5lIExBTkdfTEFUVklBTiAgICAgICAgICAgICAgICAgICAgIDB4MjYKKyNkZWZpbmUgTEFOR19MSVRIVUFOSUFOICAgICAgICAgICAgICAgICAgMHgyNworI2RlZmluZSBMQU5HX05PUldFR0lBTiAgICAgICAgICAgICAgICAgICAweDE0CisjZGVmaW5lIExBTkdfUE9MSVNIICAgICAgICAgICAgICAgICAgICAgIDB4MTUKKyNkZWZpbmUgTEFOR19QT1JUVUdVRVNFICAgICAgICAgICAgICAgICAgMHgxNgorI2RlZmluZSBMQU5HX1JPTUFOSUFOICAgICAgICAgICAgICAgICAgICAweDE4CisjZGVmaW5lIExBTkdfUlVTU0lBTiAgICAgICAgICAgICAgICAgICAgIDB4MTkKKyNkZWZpbmUgTEFOR19TTE9WQUsgICAgICAgICAgICAgICAgICAgICAgMHgxYgorI2RlZmluZSBMQU5HX1NMT1ZFTklBTiAgICAgICAgICAgICAgICAgICAweDI0CisjZGVmaW5lIExBTkdfU09SQklBTiAgICAgICAgICAgICAgICAgICAgIDB4MmUKKyNkZWZpbmUgTEFOR19TUEFOSVNIICAgICAgICAgICAgICAgICAgICAgMHgwYQorI2RlZmluZSBMQU5HX1NXRURJU0ggICAgICAgICAgICAgICAgICAgICAweDFkCisjZGVmaW5lIExBTkdfVEhBSSAgICAgICAgICAgICAgICAgICAgICAgIDB4MWUKKyNkZWZpbmUgTEFOR19UVVJLSVNIICAgICAgICAgICAgICAgICAgICAgMHgxZgorI2RlZmluZSBMQU5HX1VLUkFJTklBTiAgICAgICAgICAgICAgICAgICAweDIyCisKICNlbmRpZiAgLyogX19XSU5FX1dJTk5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveDExZHJ2LmggYi9pbmNsdWRlL3gxMWRydi5oCmluZGV4IDBjODExYTQuLjkzNzIyMjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveDExZHJ2LmgKKysrIGIvaW5jbHVkZS94MTFkcnYuaApAQCAtNjIsNSArNjIsMzggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHdpZHRoRHN0LCBJTlQzMiBoZWlnaHREc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGFnREMgKmRjU3JjLCBJTlQzMiB4U3JjLCBJTlQzMiB5U3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5UMzIgd2lkdGhTcmMsIElOVDMyIGhlaWdodFNyYywgRFdPUkQgcm9wICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9Nb3ZlVG9FeCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeCwgSU5UMzIgeSxMUFBPSU5UMzIgcHQpOworZXh0ZXJuIEJPT0wzMiBYMTFEUlZfTGluZVRvKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5KTsKK2V4dGVybiBCT09MMzIgWDExRFJWX0FyYyggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwKKwkJCSAgSU5UMzIgYm90dG9tLCBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwKKwkJCSAgSU5UMzIgeWVuZCApOworZXh0ZXJuIEJPT0wzMiBYMTFEUlZfUGllKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LAorCQkJICBJTlQzMiBib3R0b20sIElOVDMyIHhzdGFydCwgSU5UMzIgeXN0YXJ0LCBJTlQzMiB4ZW5kLAorCQkJICBJTlQzMiB5ZW5kICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9DaG9yZCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAorCQkJICAgIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20sIElOVDMyIHhzdGFydCwKKwkJCSAgICBJTlQzMiB5c3RhcnQsIElOVDMyIHhlbmQsIElOVDMyIHllbmQgKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX0VsbGlwc2UoIHN0cnVjdCB0YWdEQyAqZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwKKwkJCSAgICAgIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20gKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX1JlY3RhbmdsZShzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsCisJCQkgICAgICBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX1JvdW5kUmVjdCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLAorCQkJCUlOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20sIElOVDMyIGVsbF93aWR0aCwKKwkJCQlJTlQzMiBlbGxfaGVpZ2h0ICk7CitleHRlcm4gQ09MT1JSRUYgWDExRFJWX1NldFBpeGVsKCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LAorCQkJCSBDT0xPUlJFRiBjb2xvciApOworZXh0ZXJuIENPTE9SUkVGIFgxMURSVl9HZXRQaXhlbCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeCwgSU5UMzIgeSk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9QYWludFJnbiggc3RydWN0IHRhZ0RDICpkYywgSFJHTjMyIGhyZ24gKTsKK2V4dGVybiBCT09MMzIgWDExRFJWX1BvbHlsaW5lKCBzdHJ1Y3QgdGFnREMgKmRjLGNvbnN0IExQUE9JTlQzMiBwdCxJTlQzMiBjb3VudCk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9Qb2x5Z29uKCBzdHJ1Y3QgdGFnREMgKmRjLCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9Qb2x5UG9seWdvbiggc3RydWN0IHRhZ0RDICpkYywgTFBQT0lOVDMyIHB0LAorCQkJCSAgTFBJTlQzMiBjb3VudHMsIFVJTlQzMiBwb2x5Z29ucyk7CisKK2V4dGVybiBCT09MMzIgWDExRFJWX0V4dEZsb29kRmlsbCggc3RydWN0IHRhZ0RDICpkYywgSU5UMzIgeCwgSU5UMzIgeSwKKwkJCQkgICBDT0xPUlJFRiBjb2xvciwgVUlOVDMyIGZpbGxUeXBlICk7CitleHRlcm4gQk9PTDMyIFgxMURSVl9FeHRUZXh0T3V0KCBzdHJ1Y3QgdGFnREMgKmRjLCBJTlQzMiB4LCBJTlQzMiB5LAorCQkJCSBVSU5UMzIgZmxhZ3MsIGNvbnN0IFJFQ1QzMiAqbHByZWN0LAorCQkJCSBMUENTVFIgc3RyLCBVSU5UMzIgY291bnQsIGNvbnN0IElOVDMyICpscER4ICk7CisKIAogI2VuZGlmICAvKiBfX1dJTkVfWDExRFJWX0ggKi8KZGlmZiAtLWdpdCBhL2xpYnJhcnkvbWlzY3N0dWJzLmMgYi9saWJyYXJ5L21pc2NzdHVicy5jCmluZGV4IGU5YzM3N2YuLjhiOTQ1NTQgMTAwNjQ0Ci0tLSBhL2xpYnJhcnkvbWlzY3N0dWJzLmMKKysrIGIvbGlicmFyeS9taXNjc3R1YnMuYwpAQCAtNDgsMTIgKzQ4LDEwIEBACiBleHRlcm4gTFJFU1VMVCBDb2xvckRsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBDb21ib0JveFduZFByb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBDb21ib0xCb3hXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwotZXh0ZXJuIExSRVNVTFQgRWRpdFduZFByb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaWxlT3BlbkRsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaWxlU2F2ZURsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBGaW5kVGV4dERsZ1Byb2MoSFdORCxVSU5ULFdQQVJBTTE2LExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBNRElDbGllbnRXbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwotZXh0ZXJuIExSRVNVTFQgUG9wdXBNZW51V25kUHJvYyhIV05ELFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIFByaW50RGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNMTYsTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIFByaW50U2V0dXBEbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwogZXh0ZXJuIExSRVNVTFQgUmVwbGFjZVRleHREbGdQcm9jKEhXTkQsVUlOVCxXUEFSQU0xNixMUEFSQU0pOwpAQCAtNzIsMTMgKzcwLDEwIEBACiAgIE1BUF9TVFJfVE9fUFJPQygiQ29sb3JEbGdQcm9jIixDb2xvckRsZ1Byb2MpOwogICBNQVBfU1RSX1RPX1BST0MoIkNvbWJvQm94V25kUHJvYyIsQ29tYm9Cb3hXbmRQcm9jKTsKICAgTUFQX1NUUl9UT19QUk9DKCJDb21ib0xCb3hXbmRQcm9jIixDb21ib0xCb3hXbmRQcm9jKTsKLSAgTUFQX1NUUl9UT19QUk9DKCJEZWZEbGdQcm9jIixEZWZEbGdQcm9jMTYpOwotICBNQVBfU1RSX1RPX1BST0MoIkVkaXRXbmRQcm9jIixFZGl0V25kUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiRmlsZU9wZW5EbGdQcm9jIixGaWxlT3BlbkRsZ1Byb2MpOwogICBNQVBfU1RSX1RPX1BST0MoIkZpbGVTYXZlRGxnUHJvYyIsRmlsZVNhdmVEbGdQcm9jKTsKICAgTUFQX1NUUl9UT19QUk9DKCJGaW5kVGV4dERsZ1Byb2MiLEZpbmRUZXh0RGxnUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiTURJQ2xpZW50V25kUHJvYyIsTURJQ2xpZW50V25kUHJvYyk7Ci0gIE1BUF9TVFJfVE9fUFJPQygiUG9wdXBNZW51V25kUHJvYyIsUG9wdXBNZW51V25kUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiUHJpbnREbGdQcm9jIixQcmludERsZ1Byb2MpOwogICBNQVBfU1RSX1RPX1BST0MoIlByaW50U2V0dXBEbGdQcm9jIixQcmludFNldHVwRGxnUHJvYyk7CiAgIE1BUF9TVFJfVE9fUFJPQygiUmVwbGFjZVRleHREbGdQcm9jIixSZXBsYWNlVGV4dERsZ1Byb2MpOwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IGQ0OWM3MDUuLmUwYjlmOWQgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTEyLDcgKzEyLDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY2xhc3MuaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgpAQCAtMjE0LDggKzIxMyw4IEBACiBpbnQgTU9EVUxFX09wZW5GaWxlKCBITU9EVUxFMTYgaE1vZHVsZSApCiB7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIGNoYXIgKm5hbWU7Ci0gICAgY29uc3QgY2hhciAqdW5peE5hbWU7CiAKICAgICBzdGF0aWMgaW50IGNhY2hlZGZkID0gLTE7CiAKQEAgLTIyNyw4ICsyMjYsOCBAQAogICAgIGNsb3NlKCBjYWNoZWRmZCApOwogICAgIGhDYWNoZWRNb2R1bGUgPSBoTW9kdWxlOwogICAgIG5hbWUgPSBORV9NT0RVTEVfTkFNRSggcE1vZHVsZSApOwotICAgIGlmICghKHVuaXhOYW1lID0gRE9TRlNfR2V0VW5peEZpbGVOYW1lKCBuYW1lLCBUUlVFICkpIHx8Ci0gICAgICAgIChjYWNoZWRmZCA9IG9wZW4oIHVuaXhOYW1lLCBPX1JET05MWSApKSA9PSAtMSkKKyAgICBpZiAoIURPU0ZTX0dldEZ1bGxOYW1lKCBuYW1lLCBUUlVFLCAmZnVsbF9uYW1lICkgfHwKKyAgICAgICAgKGNhY2hlZGZkID0gb3BlbiggZnVsbF9uYW1lLmxvbmdfbmFtZSwgT19SRE9OTFkgKSkgPT0gLTEpCiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIk1PRFVMRV9PcGVuRmlsZTogY2FuJ3Qgb3BlbiBmaWxlICclcycgZm9yIG1vZHVsZSAlMDR4XG4iLAogICAgICAgICAgICAgICAgICBuYW1lLCBoTW9kdWxlICk7CiAgICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIk1PRFVMRV9PcGVuRmlsZTogb3BlbmVkICclcycgLT4gJWRcbiIsCkBAIC03MDEsNyArNzAwLDcgQEAKICAgICAgIC8qIE5vdyBjb3B5IGFuZCB1cHBlcmNhc2UgdGhlIHN0cmluZyAqLwogCiAgICAgc3RyY3B5KCBidWZmZXIsIG5hbWUgKTsKLSAgICBBbnNpVXBwZXIoIGJ1ZmZlciApOworICAgIENoYXJVcHBlcjMyQSggYnVmZmVyICk7CiAgICAgbGVuID0gc3RybGVuKCBidWZmZXIgKTsKIAogICAgICAgLyogRmlyc3Qgc2VhcmNoIHRoZSByZXNpZGVudCBuYW1lcyAqLwpAQCAtMTAyMiw2ICsxMDIxLDcgQEAKICAgICBXT1JEICpwTW9kUmVmLCAqcERMTHM7CiAgICAgSEZJTEUzMiBoRmlsZTsKICAgICBpbnQgaTsKKyAgICBleHRlcm4gY2hhciAqIERFQlVHX2N1cnJfbW9kdWxlOwogCiAgICAgaE1vZHVsZSA9IE1PRFVMRV9GaW5kTW9kdWxlKCBuYW1lICk7CiAKQEAgLTEwNDEsNiArMTA0MSwxMiBAQAogICAgICAgICAgICAgcmV0dXJuIDI7ICAvKiBGaWxlIG5vdCBmb3VuZCAqLwogICAgICAgICB9CiAKKwkvKgorCSAqIFJlY29yZCB0aGlzIHNvIHRoYXQgdGhlIGludGVybmFsIGRlYnVnZ2VyIGdldHMgc29tZQorCSAqIHJlY29yZCBvZiB3aGF0IGl0IGlzIHRoYXQgd2UgYXJlIHdvcmtpbmcgd2l0aC4KKwkgKi8KKwlERUJVR19jdXJyX21vZHVsZSA9IG5hbWU7CisKICAgICAgICAgICAvKiBDcmVhdGUgdGhlIG1vZHVsZSBzdHJ1Y3R1cmUgKi8KIAogICAgICAgICBoTW9kdWxlID0gTU9EVUxFX0xvYWRFeGVIZWFkZXIoIGhGaWxlLCAmb2ZzICk7CkBAIC0xNDgyLDcgKzE0ODgsOCBAQAogICAgICAgICBpZiAoIWZvcmsoKSkKIAl7CiAgICAgICAgICAgICAvKiBDaGlsZCBwcm9jZXNzICovCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1bml4ZmlsZW5hbWU7CisgICAgICAgICAgICBET1NfRlVMTF9OQU1FIGZ1bGxfbmFtZTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVuaXhmaWxlbmFtZSA9IE5VTEw7CiAgICAgICAgICAgICBjb25zdCBjaGFyICphcmd2WzI1Nl0sICoqYXJncHRyOwogICAgICAgICAgICAgaW50IGljb25pYyA9IChuQ21kU2hvdyA9PSBTV19TSE9XTUlOSU1JWkVEIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG5DbWRTaG93ID09IFNXX1NIT1dNSU5OT0FDVElWRSk7CkBAIC0xNDkxLDcgKzE0OTgsMTAgQEAKICAgICAgICAgICAgIGlmIChzdHJjaHIoZmlsZW5hbWUsICcvJykgfHwKICAgICAgICAgICAgICAgICBzdHJjaHIoZmlsZW5hbWUsICc6JykgfHwKICAgICAgICAgICAgICAgICBzdHJjaHIoZmlsZW5hbWUsICdcXCcpKQotICAgICAgICAgICAgICAgIHVuaXhmaWxlbmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZShmaWxlbmFtZSwgMSk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKERPU0ZTX0dldEZ1bGxOYW1lKCBmaWxlbmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKQorICAgICAgICAgICAgICAgICAgICB1bml4ZmlsZW5hbWUgPSBmdWxsX25hbWUubG9uZ19uYW1lOworICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZSB1bml4ZmlsZW5hbWUgPSBmaWxlbmFtZTsKIAogICAgICAgICAgICAgaWYgKHVuaXhmaWxlbmFtZSkKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9yZXNvdXJjZS5jIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKaW5kZXggNWRhN2UzZC4uY2Y4ODVlOCAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKQEAgLTE0LDcgKzE0LDYgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiYXJjaC5oIgotI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgImdsb2JhbC5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgpkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA3ZjU4YjRkLi43M2M5Y2U5IDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtODcsNiArODcsNyBAQAogICBEQkdfQUREUglkYWRkcjsKIAogICBkYWRkci5zZWcgPSAwOworICBkYWRkci50eXBlID0gTlVMTDsKICAgTW9kdWxlID0gKChjaGFyKilsb2FkX2FkZHIpK3BlX2V4cG9ydHMtPk5hbWU7CiAgIGRwcmludGZfd2luMzIoc3RkZGViLCJcbioqKioqKipFWFBPUlQgREFUQSoqKioqKipcbk1vZHVsZSBuYW1lIGlzICVzLCAlbGQgZnVuY3Rpb25zLCAlbGQgbmFtZXNcbiIsIAogCSBNb2R1bGUsCkBAIC0xMTMsNyArMTE0LDcgQEAKIAkgIGRhZGRyLm9mZj1sb2FkX2FkZHIrKmZ1bmN0aW9uczsKIAkgIGZ1bmN0aW9uKys7CiAgICAgICB9Ci0gICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCk7CisgICAgICBERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwogICB9CiB9CiAKQEAgLTM3OSw3ICszODAsNyBAQAogICAgIERCR19BRERSCWRhZGRyOwogCiAJZGFkZHIuc2VnPTA7Ci0KKwlkYWRkci50eXBlID0gTlVMTDsKIAlwZSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwZV9kYXRhKSk7CiAJbWVtc2V0KHBlLDAsc2l6ZW9mKHN0cnVjdCBwZV9kYXRhKSk7CiAJcGUtPnBlX2hlYWRlciA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBwZV9oZWFkZXJfcykpOwpAQCAtNDEwLDE2ICs0MTEsMjMgQEAKIAlkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIkxvYWQgYWRkciBpcyAleFxuIixsb2FkX2FkZHIpOwogCWNhbGNfdm1hX3NpemUocGUpOwogCisjaWYgMAogCS8qIFdlIHVzZSBtYWxsb2MgaGVyZSwgd2hpbGUgYSBodWdlIHBhcnQgb2YgdGhhdCBhZGRyZXNzIHNwYWNlIGRvZXMKIAkgICBub3QgYmUgc3VwcG9ydGVkIGJ5IGFjdHVhbCBtZW1vcnkuIEl0IGhhcyB0byBiZSBjb250aWd1b3VzLCB0aG91Z2guCiAJICAgSSBkb24ndCBrbm93IGlmIG1tYXAoIi9kZXYvbnVsbCIpOyB3b3VsZCBkbyBhbnkgYmV0dGVyLgogCSAgIFdoYXQgSSdkIHJlYWxseSBsaWtlIHRvIGRvIGlzIGEgV2luMzIgc3R5bGUgVmlydHVhbEFsbG9jL01hcFZpZXdPZkZpbGUKIAkgICBzZXF1ZW5jZSAqLwogCWxvYWRfYWRkciA9IHBlLT5sb2FkX2FkZHIgPSAoaW50KXhtYWxsb2MocGUtPnZtYV9zaXplKTsKKwltZW1zZXQoIGxvYWRfYWRkciwgMCwgcGUtPnZtYV9zaXplKTsKKyNlbHNlCisJbG9hZF9hZGRyID0gIHBlLT5sb2FkX2FkZHIgPSBWaXJ0dWFsQWxsb2MoIE5VTEwsIHBlLT52bWFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FTV9DT01NSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CisjZW5kaWYKKwogCWRwcmludGZfd2luMzIoc3RkZGViLCAiTG9hZCBhZGRyIGlzIHJlYWxseSAleCwgcmFuZ2UgJXhcbiIsCiAJCXBlLT5sb2FkX2FkZHIsIHBlLT52bWFfc2l6ZSk7CiAJCi0JbWVtc2V0KCAodm9pZCAqKWxvYWRfYWRkciwgMCwgcGUtPnZtYV9zaXplKTsKIAogCWZvcihpPTA7IGkgPCBwZS0+cGVfaGVhZGVyLT5jb2ZmLk51bWJlck9mU2VjdGlvbnM7IGkrKykKIAl7CkBAIC00NTYsMTEgKzQ2NCwxNCBAQAogCX0KICNlbmRpZgogCisjaWYgMAorCS8qIG5vdCBuZWVkZWQsIG1lbW9yeSBpcyB6ZXJvICovCiAgICAgICAgIGlmKHN0cmNtcChwZS0+cGVfc2VnW2ldLk5hbWUsICIuYnNzIikgPT0gMCkKICAgICAgICAgICAgIG1lbXNldCgodm9pZCAqKXJlc3VsdCwgMCwgCiAgICAgICAgICAgICAgICAgICAgcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX1NpemUgPwogICAgICAgICAgICAgICAgICAgIHBlLT5wZV9zZWdbaV0uVmlydHVhbF9TaXplIDoKICAgICAgICAgICAgICAgICAgICBwZS0+cGVfc2VnW2ldLlNpemVfT2ZfUmF3X0RhdGEpOworI2VuZGlmCiAKIAlpZihzdHJjbXAocGUtPnBlX3NlZ1tpXS5OYW1lLCAiLmlkYXRhIikgPT0gMCkKIAkJcGUtPnBlX2ltcG9ydCA9IChzdHJ1Y3QgUEVfSW1wb3J0X0RpcmVjdG9yeSAqKSByZXN1bHQ7CkBAIC01NjAsMTYgKzU3MSwxNiBAQAogCQkJCXBlLT5wZV9zZWdbaV0uTmFtZQogCQkJKTsKIAkJCWRhZGRyLm9mZj1sb2FkX2FkZHIrcGUtPnBlX3NlZ1tpXS5WaXJ0dWFsX0FkZHJlc3M7Ci0JCQlERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCk7CisJCQlERUJVR19BZGRTeW1ib2woYnVmZmVyLCZkYWRkciwgTlVMTCwgU1lNX1dJTjMyIHwgU1lNX0ZVTkMpOwogCQl9CiAJCS8qIGFkZCBlbnRyeSBwb2ludCAqLwogCQlzcHJpbnRmKGJ1ZmZlciwiJXMuRW50cnlQb2ludCIsKChjaGFyKilsb2FkX2FkZHIpK3BlLT5wZV9leHBvcnQtPk5hbWUpOwogCQlkYWRkci5vZmY9bG9hZF9hZGRyK3BlLT5wZV9oZWFkZXItPm9wdF9jb2ZmLkFkZHJlc3NPZkVudHJ5UG9pbnQ7Ci0JCURFQlVHX0FkZFN5bWJvbChidWZmZXIsJmRhZGRyLCBOVUxMKTsKKwkJREVCVUdfQWRkU3ltYm9sKGJ1ZmZlciwmZGFkZHIsIE5VTEwsIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKIAkJLyogYWRkIHN0YXJ0IG9mIERMTCAqLwogCQlkYWRkci5vZmY9bG9hZF9hZGRyOwogCQlERUJVR19BZGRTeW1ib2woKChjaGFyKilsb2FkX2FkZHIpK3BlLT5wZV9leHBvcnQtPk5hbWUsJmRhZGRyLAotCQkJCU5VTEwpOworCQkJCU5VTEwsIFNZTV9XSU4zMiB8IFNZTV9GVU5DKTsKIAl9CiAgICAgICAgIHJldHVybiBwZTsKIH0KZGlmZiAtLWdpdCBhL2xvYWRlci9zaWduYWwuYyBiL2xvYWRlci9zaWduYWwuYwppbmRleCBlODhmYWRhLi5hMmVhOTc5IDEwMDY0NAotLS0gYS9sb2FkZXIvc2lnbmFsLmMKKysrIGIvbG9hZGVyL3NpZ25hbC5jCkBAIC05OSw3ICs5OSwxMSBAQAogICovCiBzdGF0aWMgdm9pZCBTSUdOQUxfY2hpbGQodm9pZCkKIHsKLSAgIHdhaXQ0KCAwLCBOVUxMLCBXTk9IQU5HLCBOVUxMKTsKKyNpZmRlZiBfX3N2cjRfXworICAgIHdhaXQoTlVMTCk7CisjZWxzZQorICAgIHdhaXQ0KCAwLCBOVUxMLCBXTk9IQU5HLCBOVUxMKTsKKyNlbmRpZgogfQogCiAKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDk0NDNkZmEuLjI3Y2ZjYmUgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMTEsNyArMTEsNiBAQAogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ0YXNrLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAiaW5zdGFuY2UuaCIKQEAgLTUwOCw2ICs1MDcsNyBAQAogICAgIHBUYXNrLT5wZGIuZmlsZUhhbmRsZXNQdHIgPQogICAgICAgICBQVFJfU0VHX09GRl9UT19TRUdQVFIoIEdsb2JhbEhhbmRsZVRvU2VsKHBUYXNrLT5oUERCKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KSYoKFBEQiAqKTApLT5maWxlSGFuZGxlcyApOworICAgIHBUYXNrLT5wZGIuaEZpbGVIYW5kbGVzID0gMDsKICAgICBtZW1zZXQoIHBUYXNrLT5wZGIuZmlsZUhhbmRsZXMsIDB4ZmYsIHNpemVvZihwVGFzay0+cGRiLmZpbGVIYW5kbGVzKSApOwogICAgIHBUYXNrLT5wZGIuZW52aXJvbm1lbnQgICAgPSBoRW52aXJvbm1lbnQ7CiAgICAgcFRhc2stPnBkYi5uYkZpbGVzICAgICAgICA9IDIwOwpAQCAtNTM1LDcgKzUzNSw3IEBACiAKICAgICAvKiBDcmVhdGUgdGhlIFdpbjMyIHBhcnQgb2YgdGhlIHRhc2sgKi8KIAotICAgIHBkYjMyID0gUFJPQ0VTU19DcmVhdGUoKTsKKyAgICBwZGIzMiA9IFBST0NFU1NfQ3JlYXRlKCBwVGFzayApOwogICAgIHBUYXNrLT50aGRiID0gVEhSRUFEX0NyZWF0ZSggcGRiMzIsIDAgKTsKIAogICAgIC8qIENyZWF0ZSB0aGUgMzItYml0IHN0YWNrIGZyYW1lICovCkBAIC01OTIsMTQgKzU5MiwxNCBAQAogICAgIHsKICAgICAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX1dJTjMyKQogICAgICAgICB7Ci0gICAgICAgICAgICBEQkdfQUREUiBhZGRyID0geyAwLCBwTW9kdWxlLT5wZV9tb2R1bGUtPmxvYWRfYWRkciArIAorICAgICAgICAgICAgREJHX0FERFIgYWRkciA9IHsgTlVMTCwgMCwgcE1vZHVsZS0+cGVfbW9kdWxlLT5sb2FkX2FkZHIgKyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBNb2R1bGUtPnBlX21vZHVsZS0+cGVfaGVhZGVyLT5vcHRfY29mZi5BZGRyZXNzT2ZFbnRyeVBvaW50IH07CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW4zMiB0YXNrICclcyc6ICIsIG5hbWUgKTsKICAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7Ci0gICAgICAgICAgICBEQkdfQUREUiBhZGRyID0geyBwU2VnVGFibGVbcE1vZHVsZS0+Y3MtMV0uc2VsZWN0b3IsIHBNb2R1bGUtPmlwIH07CisgICAgICAgICAgICBEQkdfQUREUiBhZGRyID0geyBOVUxMLCBwU2VnVGFibGVbcE1vZHVsZS0+Y3MtMV0uc2VsZWN0b3IsIHBNb2R1bGUtPmlwIH07CiAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXaW4xNiB0YXNrICclcyc6ICIsIG5hbWUgKTsKICAgICAgICAgICAgIERFQlVHX0FkZEJyZWFrcG9pbnQoICZhZGRyICk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCA3NDdkNjRjLi41YzM5OThmIDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC03NTksNyArNzU5LDExIEBACiAKICAgICBpZiAoaW5mby0+ZHdTaXplIDwgc2l6ZW9mKE1FTU1BTklORk8pKSByZXR1cm4gRkFMU0U7CiAgICAgR2xvYmFsTWVtb3J5U3RhdHVzKCAmc3RhdHVzICk7CisjaWZkZWYgX19zdnI0X18KKyAgICBpbmZvLT53UGFnZVNpemUgICAgICAgICAgICA9IHN5c2NvbmYoX1NDX1BBR0VTSVpFKTsKKyNlbHNlCiAgICAgaW5mby0+d1BhZ2VTaXplICAgICAgICAgICAgPSBnZXRwYWdlc2l6ZSgpOworI2VuZGlmCiAgICAgaW5mby0+ZHdMYXJnZXN0RnJlZUJsb2NrICAgPSBzdGF0dXMuZHdBdmFpbFZpcnR1YWw7CiAgICAgaW5mby0+ZHdNYXhQYWdlc0F2YWlsYWJsZSAgPSBpbmZvLT5kd0xhcmdlc3RGcmVlQmxvY2sgLyBpbmZvLT53UGFnZVNpemU7CiAgICAgaW5mby0+ZHdNYXhQYWdlc0xvY2thYmxlICAgPSBpbmZvLT5kd01heFBhZ2VzQXZhaWxhYmxlOwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2hlYXAuYyBiL21lbW9yeS9oZWFwLmMKaW5kZXggMzljZjg4NS4uNDk0YjExNSAxMDA2NDQKLS0tIGEvbWVtb3J5L2hlYXAuYworKysgYi9tZW1vcnkvaGVhcC5jCkBAIC05NTIsNyArOTUyLDcgQEAKICAgICBIRUFQX01ha2VJblVzZUJsb2NrRnJlZSggc3ViaGVhcCwgcEluVXNlICk7CiAKICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwotICAgIFNldExhc3RFcnJvciggMCApOworLyogICAgU2V0TGFzdEVycm9yKCAwICk7ICovCiAKICAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBGcmVlKCUwOHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgVFJVRVxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyICk7CmRpZmYgLS1naXQgYS9tZW1vcnkvc3RyaW5nLmMgYi9tZW1vcnkvc3RyaW5nLmMKaW5kZXggZmQ4ZDllYS4uYjJiMWU5MyAxMDA2NDQKLS0tIGEvbWVtb3J5L3N0cmluZy5jCisrKyBiL21lbW9yeS9zdHJpbmcuYwpAQCAtNDAxLDYgKzQwMSwxNSBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENvcHkgICAoR0RJLjI1MCkKKyAqLwordm9pZCBDb3B5KCBMUFZPSUQgc3JjLCBMUFZPSUQgZHN0LCBXT1JEIHNpemUgKQoreworICAgIG1lbWNweSggZHN0LCBzcmMsIHNpemUgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSdGxGaWxsTWVtb3J5ICAgKEtFUk5FTDMyLjQ0MSkKICAqLwogVk9JRCBSdGxGaWxsTWVtb3J5KCBMUFZPSUQgcHRyLCBVSU5UMzIgbGVuLCBVSU5UMzIgZmlsbCApCmRpZmYgLS1naXQgYS9taXNjL2NsaXBib2FyZC5jIGIvbWlzYy9jbGlwYm9hcmQuYwppbmRleCBlM2Q1YTYxLi5hYTdiYTRkIDEwMDY0NAotLS0gYS9taXNjL2NsaXBib2FyZC5jCisrKyBiL21pc2MvY2xpcGJvYXJkLmMKQEAgLTY0OCw5ICs2NDgsMTcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlDaGFuZ2VDbGlwYm9hcmRDaGFpbglbVVNFUi4xNDldCiAgKi8KLUJPT0wgQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oSFdORCBoV25kLCBIV05EIGhXbmROZXh0KQorQk9PTDE2IENoYW5nZUNsaXBib2FyZENoYWluMTYoSFdORDE2IGhXbmQsIEhXTkQxNiBoV25kTmV4dCkKIHsKLSAgICBCT09MIGJSZXQgPSAwOworICAgIHJldHVybiBDaGFuZ2VDbGlwYm9hcmRDaGFpbjMyKGhXbmQsaFduZE5leHQpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4JW1VTRVIzMi4yMV0KKyAqLworQk9PTDMyIENoYW5nZUNsaXBib2FyZENoYWluMzIoSFdORDMyIGhXbmQsIEhXTkQzMiBoV25kTmV4dCkKK3sKKyAgICBCT09MMzIgYlJldCA9IDA7CiAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRuaW1wLCAiQ2hhbmdlQ2xpcGJvYXJkQ2hhaW4oJTA0eCwgJTA0eClcbiIsIGhXbmQsIGhXbmROZXh0KTsKIApAQCAtNjYyLDEwICs2NzAsMTEgQEAKIAogICAgIGlmKCBoV25kID09IGhXbmRWaWV3ZXIgKSBoV25kVmlld2VyID0gaFduZE5leHQ7CiAKLSAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gYlJldDsKIH0KIAogCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJCQlJc0NsaXBib2FyZEZvcm1hdEF2YWlsYWJsZQlbVVNFUi4xOTNdCiAgKi8KZGlmZiAtLWdpdCBhL21pc2MvY29tbWRsZy5jIGIvbWlzYy9jb21tZGxnLmMKaW5kZXggMWI1NTQ2MC4uZTcyOWQ0MSAxMDA2NDQKLS0tIGEvbWlzYy9jb21tZGxnLmMKKysrIGIvbWlzYy9jb21tZGxnLmMKQEAgLTE2LDcgKzE2LDYgQEAKICNpbmNsdWRlICJkbGdzLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicmVzb3VyY2UuaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJkcml2ZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTE0ODYsOSArMTQ4NSw5IEBACiAgfQogIGlmIChyZXN1bHQpCiAgewotICBlZGl0cG9zPVNlbmRNZXNzYWdlMTYoaHduZCxFTV9HRVRTRUwsMCwwKTsKKyAgZWRpdHBvcz1TZW5kTWVzc2FnZTE2KGh3bmQsRU1fR0VUU0VMMTYsMCwwKTsKICAgU2V0V2luZG93VGV4dDMyQShod25kLGJ1ZmZlcik7Ci0gIFNlbmRNZXNzYWdlMTYoaHduZCxFTV9TRVRTRUwsMCxlZGl0cG9zKTsKKyAgU2VuZE1lc3NhZ2UxNihod25kLEVNX1NFVFNFTDE2LDAsZWRpdHBvcyk7CiAgfQogIHJldHVybiB2YWx1ZTsKIH0KQEAgLTE5NTMsNyArMTk1Miw3IEBACiAgICAgICBDQ19Td2l0Y2hUb0Z1bGxTaXplKGhEbGcsbHBwLT5scGNjLT5yZ2JSZXN1bHQsTlVMTCk7CiAgICByZXM9VFJVRTsKICAgIGZvciAoaT0weDJiZjtpPDB4MmM1O2krKykKLSAgICAgU2VuZE1lc3NhZ2UxNihHZXREbGdJdGVtKGhEbGcsaSksRU1fTElNSVRURVhULDMsMCk7ICAgICAgLyogbWF4IDMgZGlnaXRzOiAgeHl6ICAqLworICAgICBTZW5kTWVzc2FnZTE2KEdldERsZ0l0ZW0oaERsZyxpKSxFTV9MSU1JVFRFWFQxNiwzLDApOyAgICAgIC8qIG1heCAzIGRpZ2l0czogIHh5eiAgKi8KICAgIGlmIChDQ19Ib29rQ2FsbENoayhscHAtPmxwY2MpKQogICAgICAgcmVzPUNhbGxXaW5kb3dQcm9jMTYobHBwLT5scGNjLT5scGZuSG9vayxoRGxnLFdNX0lOSVRESUFMT0csd1BhcmFtLGxQYXJhbSk7CiAgICByZXR1cm4gcmVzOwpkaWZmIC0tZ2l0IGEvbWlzYy9jcnRkbGwuYyBiL21pc2MvY3J0ZGxsLmMKaW5kZXggMGQ4MzA5NC4uM2QyOWJjYSAxMDA2NDQKLS0tIGEvbWlzYy9jcnRkbGwuYworKysgYi9taXNjL2NydGRsbC5jCkBAIC0zOCw2ICszOCw5IEBACiBVSU5UMzIgQ1JURExMX3dpbm1pbm9yX2RsbDsgICAgIC8qIENSVERMTC4zMzAgKi8KIFVJTlQzMiBDUlRETExfd2ludmVyX2RsbDsgICAgICAgLyogQ1JURExMLjMzMSAqLwogCit0eXBlZGVmIFZPSUQgKCpuZXdfaGFuZGxlcl90eXBlKShWT0lEKTsKKworc3RhdGljIG5ld19oYW5kbGVyX3R5cGUgbmV3X2hhbmRsZXI7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgX0dldE1haW5BcmdzICAoQ1JURExMLjAyMikKQEAgLTY1NCw2ICs2NTcsMjcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICBuZXcgICAgICAgICAgIChDUlRETEwuMDAxKQorICovCitWT0lEKiBDUlRETExfbmV3KERXT1JEIHNpemUpCit7CisgICAgVk9JRCogcmVzdWx0OworICAgIGlmKCEocmVzdWx0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksMCxzaXplKSkgJiYgbmV3X2hhbmRsZXIpCisJKCpuZXdfaGFuZGxlcikoKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgICAgIHNldF9uZXdfaGFuZGxlcihDUlRETEwuMDAzKQorICovCituZXdfaGFuZGxlcl90eXBlIENSVERMTF9zZXRfbmV3X2hhbmRsZXIobmV3X2hhbmRsZXJfdHlwZSBmdW5jKQoreworICAgIG5ld19oYW5kbGVyX3R5cGUgb2xkX2hhbmRsZXIgPSBuZXdfaGFuZGxlcjsKKyAgICBuZXdfaGFuZGxlciA9IGZ1bmM7CisgICAgcmV0dXJuIG9sZF9oYW5kbGVyOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgIGNhbGxvYyAgICAgICAgKENSVERMTC4zNTApCiAgKi8KIFZPSUQqIENSVERMTF9jYWxsb2MoRFdPUkQgc2l6ZSwgRFdPUkQgY291bnQpCkBAIC02NzgsNiArNzAyLDE0IEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgZGVsZXRlICAgICAgIChDUlRETEwuMDAyKQorICovCitWT0lEIENSVERMTF9kZWxldGUoVk9JRCogcHRyKQoreworICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksMCxwdHIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgIF9zdHJkdXAgICAgICAgICAgKENSVERMTC4yODUpCiAgKi8KIExQU1RSIENSVERMTF9fc3RyZHVwKExQU1RSIHB0cikKZGlmZiAtLWdpdCBhL21pc2Mva2V5Ym9hcmQuYyBiL21pc2Mva2V5Ym9hcmQuYwppbmRleCA0YjU2MzhjLi4yNWM3NzcxIDEwMDY0NAotLS0gYS9taXNjL2tleWJvYXJkLmMKKysrIGIvbWlzYy9rZXlib2FyZC5jCkBAIC0xMzUsNiArMTM1LDkgQEAKIGludCBUb0FzY2lpKFdPUkQgd1ZpcnRLZXksIFdPUkQgd1NjYW5Db2RlLCBMUFNUUiBscEtleVN0YXRlLCAKIAlMUFZPSUQgbHBDaGFyLCBXT1JEIHdGbGFncykgCiB7CisjaWYgMQorCXJldHVybiBFVkVOVF9Ub0FzY2lpKHdWaXJ0S2V5LCB3U2NhbkNvZGUsIGxwS2V5U3RhdGUsIGxwQ2hhciwgd0ZsYWdzKTsKKyNlbHNlCiAJY2hhciBzaGlmdCA9IGxwS2V5U3RhdGVbVktfU0hJRlRdIDwgMDsKIAlpbnQgaTsKIApAQCAtMTg0LDYgKzE4Nyw3IEBACiAJICAqKEJZVEUqKWxwQ2hhciA9ICooQllURSopbHBDaGFyICYgMHgxZjsKIAlkcHJpbnRmX2tleWJvYXJkKHN0ZGRlYiwgIjEgKCV4KVxuIiwgKihCWVRFKilscENoYXIpOwogCXJldHVybiAxOworI2VuZGlmCiB9CiAKIERXT1JEIE9lbUtleVNjYW4oV09SRCB3T2VtQ2hhcikKZGlmZiAtLWdpdCBhL21pc2MvbHN0ci5jIGIvbWlzYy9sc3RyLmMKaW5kZXggNzMwYjU0MC4uZThhNjgzZCAxMDA2NDQKLS0tIGEvbWlzYy9sc3RyLmMKKysrIGIvbWlzYy9sc3RyLmMKQEAgLTEyLDEyICsxMiwxMiBAQAogI2luY2x1ZGUgPGN0eXBlLmg+CiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAid2lubnQuaCIJLyogSEVBUF8gbWFjcm9zICovCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAKICNkZWZpbmUgVG9VcHBlcihjKQl0b3VwcGVyKGMpCiAjZGVmaW5lIFRvTG93ZXIoYykJdG9sb3dlcihjKQpAQCAtNTAsMTEgKzUwLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQW5zaVVwcGVyICAgKFVTRVIuNDMxKQorICogICAgICAgICAgIEFuc2lVcHBlcjE2ICAgKFVTRVIuNDMxKQogICovCi0KLS8qIDE2LWJpdCB2ZXJzaW9uICovCi1TRUdQVFIgV0lOMTZfQW5zaVVwcGVyKCBTRUdQVFIgc3RyT3JDaGFyICkKK1NFR1BUUiBBbnNpVXBwZXIxNiggU0VHUFRSIHN0ck9yQ2hhciApCiB7CiAgIC8qIEkgYW0gbm90IHN1cmUgaWYgdGhlIGxvY2FsZSBzdHVmZiB3b3JrcyB3aXRoIHRvdXBwZXIsIGJ1dCB0aGVuIGFnYWluIAogICAgICBJIGFtIG5vdCBzdXJlIGlmIHRoZSBMaW51eCBsaWJjIGxvY2FsZSBzdHVmZnMgd29ya3MgYXQgYWxsICovCkBAIC02Miw1MCArNjAsMjggQEAKICAgICAvKiB1cHBlcmNhc2Ugb25seSBvbmUgY2hhciBpZiBzdHJPckNoYXIgPCAweDEwMDAwICovCiAgICAgaWYgKEhJV09SRChzdHJPckNoYXIpKQogICAgIHsKLSAgICAgICAgY2hhciAqcyA9IFBUUl9TRUdfVE9fTElOKHN0ck9yQ2hhcik7Ci0gICAgICAgIHdoaWxlICgqcykgewotCSAgICAqcyA9IFRvVXBwZXIoICpzICk7Ci0JICAgIHMrKzsKLQl9CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIGZvciAocyA9IFBUUl9TRUdfVE9fTElOKHN0ck9yQ2hhcik7ICpzOyBzKyspICpzID0gdG91cHBlcigqcyk7CiAgICAgICAgIHJldHVybiBzdHJPckNoYXI7CiAgICAgfQogICAgIGVsc2UgcmV0dXJuIChTRUdQVFIpVG9VcHBlciggKGludClzdHJPckNoYXIgKTsKIH0KIAotLyogMzItYml0IHZlcnNpb24gKi8KLUxQU1RSIEFuc2lVcHBlcihMUFNUUiBzdHJPckNoYXIpCi17Ci0gICAgY2hhciAqcyA9IHN0ck9yQ2hhcjsKLSAgLyogSSBhbSBub3Qgc3VyZSBpZiB0aGUgbG9jYWxlIHN0dWZmIHdvcmtzIHdpdGggdG91cHBlciwgYnV0IHRoZW4gYWdhaW4gCi0gICAgIEkgYW0gbm90IHN1cmUgaWYgdGhlIExpbnV4IGxpYmMgbG9jYWxlIHN0dWZmcyB3b3JrcyBhdCBhbGwgKi8KLQotICAgIHdoaWxlICgqcykgewotCSpzID0gVG9VcHBlciggKnMgKTsKLQlzKys7Ci0gICAgfQotICAgIHJldHVybiBzdHJPckNoYXI7Ci19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQW5zaVVwcGVyQnVmZiAgIChVU0VSLjQzNykKKyAqICAgICAgICAgICBBbnNpVXBwZXJCdWZmMTYgICAoVVNFUi40MzcpCiAgKi8KLVVJTlQgQW5zaVVwcGVyQnVmZihMUFNUUiBzdHIsVUlOVCBsZW4pCitVSU5UMTYgQW5zaVVwcGVyQnVmZjE2KCBMUFNUUiBzdHIsIFVJTlQxNiBsZW4gKQogewotICBpbnQgaTsKLSAgbGVuPShsZW49PTApPzY1NTM2OmxlbjsKLQotICBmb3IoaT0wO2k8bGVuO2krKykKLSAgICBzdHJbaV09dG91cHBlcihzdHJbaV0pOwotICByZXR1cm4gaTsJCisgICAgVUlOVDMyIGNvdW50ID0gbGVuID8gbGVuIDogNjU1MzY7CisgICAgZm9yICg7IGNvdW50OyBjb3VudC0tLCBzdHIrKykgKnN0ciA9IHRvdXBwZXIoKnN0cik7CisgICAgcmV0dXJuIGxlbjsKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQW5zaUxvd2VyICAgKFVTRVIuNDMyKQorICogICAgICAgICAgIEFuc2lMb3dlcjE2ICAgKFVTRVIuNDMyKQogICovCi0KLS8qIDE2LWJpdCB2ZXJzaW9uICovCi1TRUdQVFIgV0lOMTZfQW5zaUxvd2VyKFNFR1BUUiBzdHJPckNoYXIpCitTRUdQVFIgQW5zaUxvd2VyMTYoIFNFR1BUUiBzdHJPckNoYXIgKQogewogICAvKiBJIGFtIG5vdCBzdXJlIGlmIHRoZSBsb2NhbGUgc3R1ZmYgd29ya3Mgd2l0aCB0b3VwcGVyLCBidXQgdGhlbiBhZ2FpbiAKICAgICAgSSBhbSBub3Qgc3VyZSBpZiB0aGUgTGludXggbGliYyBsb2NhbGUgc3R1ZmZzIHdvcmtzIGF0IGFsbCAqLwpAQCAtMTEzLDU3ICs4OSw0MCBAQAogICAgIC8qIGxvd2VyY2FzZSBvbmx5IG9uZSBjaGFyIGlmIHN0ck9yQ2hhciA8IDB4MTAwMDAgKi8KICAgICBpZiAoSElXT1JEKHN0ck9yQ2hhcikpCiAgICAgewotICAgICAgICBjaGFyICpzID0gUFRSX1NFR19UT19MSU4oIHN0ck9yQ2hhciApOwotICAgICAgICB3aGlsZSAoKnMpIHsJICAgIAotCSAgICAqcyA9IFRvTG93ZXIoICpzICk7Ci0JICAgIHMrKzsKLQl9CisgICAgICAgIGNoYXIgKnM7CisgICAgICAgIGZvciAocyA9IFBUUl9TRUdfVE9fTElOKCBzdHJPckNoYXIgKTsgKnM7IHMrKykgKnMgPSB0b2xvd2VyKCAqcyApOwogICAgICAgICByZXR1cm4gc3RyT3JDaGFyOwogICAgIH0KLSAgICBlbHNlIHJldHVybiAoU0VHUFRSKVRvTG93ZXIoIChpbnQpc3RyT3JDaGFyICk7Ci19Ci0KLS8qIDMyLWJpdCB2ZXJzaW9uICovCi1MUFNUUiBBbnNpTG93ZXIoTFBTVFIgc3RyT3JDaGFyKQotewotICAgIGNoYXIgKnMgPSBzdHJPckNoYXI7Ci0gIC8qIEkgYW0gbm90IHN1cmUgaWYgdGhlIGxvY2FsZSBzdHVmZiB3b3JrcyB3aXRoIHRvdXBwZXIsIGJ1dCB0aGVuIGFnYWluIAotICAgICBJIGFtIG5vdCBzdXJlIGlmIHRoZSBMaW51eCBsaWJjIGxvY2FsZSBzdHVmZnMgd29ya3MgYXQgYWxsICovCi0KLSAgICB3aGlsZSAoKnMpIHsKLQkqcyA9IFRvTG93ZXIoICpzICk7Ci0JcysrOwotICAgIH0KLSAgICByZXR1cm4gc3RyT3JDaGFyOworICAgIGVsc2UgcmV0dXJuIChTRUdQVFIpdG9sb3dlciggKGludClzdHJPckNoYXIgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBBbnNpTG93ZXJCdWZmICAgKFVTRVIuNDM4KQorICogICAgICAgICAgIEFuc2lMb3dlckJ1ZmYxNiAgIChVU0VSLjQzOCkKICAqLwotVUlOVCBBbnNpTG93ZXJCdWZmKExQU1RSIHN0cixVSU5UIGxlbikKK1VJTlQxNiBBbnNpTG93ZXJCdWZmMTYoIExQU1RSIHN0ciwgVUlOVDE2IGxlbiApCiB7Ci0gIGludCBpOwotICBsZW49KGxlbj09MCk/NjU1MzY6bGVuOwotICBpPTA7Ci0KLSAgZm9yKGk9MDtpPGxlbjtpKyspCi0gICAgc3RyW2ldPXRvbG93ZXIoc3RyW2ldKTsKLSAKLSAgcmV0dXJuIGk7CQorICAgIFVJTlQzMiBjb3VudCA9IGxlbiA/IGxlbiA6IDY1NTM2OworICAgIGZvciAoOyBjb3VudDsgY291bnQtLSwgc3RyKyspICpzdHIgPSB0b2xvd2VyKCpzdHIpOworICAgIHJldHVybiBsZW47CiB9CiAKIAotLyogQW5zaU5leHQgVVNFUi40NzIgKi8KLVNFR1BUUiBBbnNpTmV4dChTRUdQVFIgY3VycmVudCkKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEFuc2lOZXh0MTYgICAoVVNFUi40NzIpCisgKi8KK1NFR1BUUiBBbnNpTmV4dDE2KFNFR1BUUiBjdXJyZW50KQogewogICAgIHJldHVybiAoKihjaGFyICopUFRSX1NFR19UT19MSU4oY3VycmVudCkpID8gY3VycmVudCArIDEgOiBjdXJyZW50OwogfQogCi0vKiBBbnNpUHJldiBVU0VSLjQ3MyAqLwotU0VHUFRSIEFuc2lQcmV2KCBTRUdQVFIgc3RhcnQsIFNFR1BUUiBjdXJyZW50KQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBBbnNpUHJldjE2ICAgKFVTRVIuNDczKQorICovCitTRUdQVFIgQW5zaVByZXYxNiggU0VHUFRSIHN0YXJ0LCBTRUdQVFIgY3VycmVudCApCiB7Ci0gICAgcmV0dXJuIChjdXJyZW50PT1zdGFydCk/c3RhcnQ6Y3VycmVudC0xOworICAgIHJldHVybiAoY3VycmVudCA9PSBzdGFydCkgPyBzdGFydCA6IGN1cnJlbnQgLSAxOwogfQogCiAKQEAgLTE4NCwyNSArMTQzLDI5IEBACiAgICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyTmV4dEEgICAoVVNFUjMyLjI4KQotICovCi1MUFNUUiBDaGFyTmV4dDMyQShMUENTVFIgeCkKLXsKLSAgICBpZiAoKngpIHJldHVybiAoTFBTVFIpKHgrMSk7Ci0gICAgZWxzZSByZXR1cm4gKExQU1RSKXg7Ci19CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENoYXJOZXh0RXhBICAgKFVTRVIzMi4yOSkKKyAqICAgICAgICAgICBDaGFyTmV4dDMyQSAgIChVU0VSMzIuMjgpCiAgKi8KLUxQU1RSIENoYXJOZXh0RXgzMkEoV09SRCBjb2RlcGFnZSxMUENTVFIgeCxEV09SRCBmbGFncykKK0xQU1RSIENoYXJOZXh0MzJBKCBMUENTVFIgcHRyICkKIHsKLSAgICAvKiBGSVhNRTogYWRkIERCQ1MgLyBjb2RlcGFnZSBzdHVmZiAqLwotICAgIGlmICgqeCkgcmV0dXJuIChMUFNUUikoeCsxKTsKLSAgICBlbHNlIHJldHVybiAoTFBTVFIpeDsKKyAgICBpZiAoISpwdHIpIHJldHVybiAoTFBTVFIpcHRyOworICAgIGlmIChJc0RCQ1NMZWFkQnl0ZTMyKCAqcHRyICkpIHJldHVybiAoTFBTVFIpKHB0ciArIDIpOworICAgIHJldHVybiAoTFBTVFIpKHB0ciArIDEpOwogfQogCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENoYXJOZXh0RXgzMkEgICAoVVNFUjMyLjI5KQorICovCitMUFNUUiBDaGFyTmV4dEV4MzJBKCBXT1JEIGNvZGVwYWdlLCBMUENTVFIgcHRyLCBEV09SRCBmbGFncyApCit7CisgICAgaWYgKCEqcHRyKSByZXR1cm4gKExQU1RSKXB0cjsKKyAgICBpZiAoSXNEQkNTTGVhZEJ5dGVFeCggY29kZXBhZ2UsICpwdHIgKSkgcmV0dXJuIChMUFNUUikocHRyICsgMik7CisgICAgcmV0dXJuIChMUFNUUikocHRyICsgMSk7Cit9CisKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ2hhck5leHRFeFcgICAoVVNFUjMyLjMwKQogICovCkBAIC0yMjMsMjQgKzE4NiwzNSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBDaGFyUHJldkEgICAoVVNFUjMyLjMyKQorICogICAgICAgICAgIENoYXJQcmV2MzJBICAgKFVTRVIzMi4zMikKICAqLwotTFBTVFIgQ2hhclByZXYzMkEoTFBDU1RSIHN0YXJ0LExQQ1NUUiB4KQorTFBTVFIgQ2hhclByZXYzMkEoIExQQ1NUUiBzdGFydCwgTFBDU1RSIHB0ciApCiB7Ci0gICAgaWYgKHg+c3RhcnQpIHJldHVybiAoTFBTVFIpKHgtMSk7Ci0gICAgZWxzZSByZXR1cm4gKExQU1RSKXg7CisgICAgd2hpbGUgKCpzdGFydCAmJiAoc3RhcnQgPCBwdHIpKQorICAgIHsKKyAgICAgICAgTFBDU1RSIG5leHQgPSBDaGFyTmV4dDMyQSggc3RhcnQgKTsKKyAgICAgICAgaWYgKG5leHQgPiBwdHIpIGJyZWFrOworICAgICAgICBzdGFydCA9IG5leHQ7CisgICAgfQorICAgIHJldHVybiAoTFBTVFIpc3RhcnQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2hhclByZXZFeEEgICAoVVNFUjMyLjMzKQorICogICAgICAgICAgIENoYXJQcmV2RXgzMkEgICAoVVNFUjMyLjMzKQogICovCi1MUFNUUiBDaGFyUHJldkV4MzJBKFdPUkQgY29kZXBhZ2UsTFBDU1RSIHN0YXJ0LExQQ1NUUiB4LERXT1JEIGZsYWdzKQorTFBTVFIgQ2hhclByZXZFeDMyQSggV09SRCBjb2RlcGFnZSwgTFBDU1RSIHN0YXJ0LCBMUENTVFIgcHRyLCBEV09SRCBmbGFncyApCiB7Ci0gICAgLyogRklYTUU6IGFkZCBEQkNTIC8gY29kZXBhZ2Ugc3R1ZmYgKi8KLSAgICBpZiAoeD5zdGFydCkgcmV0dXJuIChMUFNUUikoeC0xKTsKLSAgICBlbHNlIHJldHVybiAoTFBTVFIpeDsKKyAgICB3aGlsZSAoKnN0YXJ0ICYmIChzdGFydCA8IHB0cikpCisgICAgeworICAgICAgICBMUENTVFIgbmV4dCA9IENoYXJOZXh0RXgzMkEoIGNvZGVwYWdlLCBzdGFydCwgZmxhZ3MgKTsKKyAgICAgICAgaWYgKG5leHQgPiBwdHIpIGJyZWFrOworICAgICAgICBzdGFydCA9IG5leHQ7CisgICAgfQorICAgIHJldHVybiAoTFBTVFIpc3RhcnQ7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgQ2hhclByZXZFeFcgICAoVVNFUjMyLjM0KQogICovCkBAIC0zMzUsNyArMzA5LDcgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgQ2hhclVwcGVyQSAgIChVU0VSMzIuNDApCisgKiAgICAgICAgICAgQ2hhclVwcGVyMzJBICAgKFVTRVIzMi40MCkKICAqIEZJWE1FOiBoYW5kbGUgY3VycmVudCBsb2NhbGUKICAqLwogTFBTVFIgQ2hhclVwcGVyMzJBKExQU1RSIHgpCkBAIC01MjEsMTUgKzQ5NSwxNCBAQAogCQkJTG9hZE1lc3NhZ2UzMkEoMCxkd01lc3NhZ2VJZCxkd0xhbmd1YWdlSWQsZnJvbSxidWZzaXplKzEpOwogCQl9CiAJfQotCXRhcmdldAk9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgMTAwKTsKKwl0YXJnZXQJPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIDEwMCk7CiAJdAk9IHRhcmdldDsKIAl0YWxsb2NlZD0gMTAwOwotCSp0CT0gMDsKIAogI2RlZmluZSBBRERfVE9fVChjKSBcCiAJKnQrKz1jO1wKIAlpZiAodC10YXJnZXQgPT0gdGFsbG9jZWQpIHtcCi0JCXRhcmdldAk9IChjaGFyKil4cmVhbGxvYyh0YXJnZXQsdGFsbG9jZWQqMik7XAorCQl0YXJnZXQJPSAoY2hhciopSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHRhcmdldCx0YWxsb2NlZCoyKTtcCiAJCXQJPSB0YXJnZXQrdGFsbG9jZWQ7XAogCQl0YWxsb2NlZCo9MjtcCiAJfQpAQCAtNjEyLDcgKzU4NSw3IEBACiAJCUFERF9UT19UKCdcbicpOwogCXRhbGxvY2VkID0gc3RybGVuKHRhcmdldCkrMTsKIAlpZiAoblNpemUgJiYgdGFsbG9jZWQ8blNpemUpIHsKLQkJdGFyZ2V0ID0gKGNoYXIqKXhyZWFsbG9jKHRhcmdldCxuU2l6ZSk7CisJCXRhcmdldCA9IChjaGFyKilIZWFwUmVBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLEhFQVBfWkVST19NRU1PUlksdGFyZ2V0LG5TaXplKTsKIAl9CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpIHsKIAkJLyogblNpemUgaXMgdGhlIE1JTklNVU0gc2l6ZSAqLwpAQCAtNjI2LDYgKzU5OSw3IEBACiAJCQlzdHJsZW4oKihMUFNUUiopbHBCdWZmZXIpOgogCQkJc3RybGVuKGxwQnVmZmVyKTsKIH0KKyN1bmRlZiBBRERfVE9fVAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBGb3JtYXRNZXNzYWdlQSAgIChLRVJORUwzMi4xMzgpIEVtdWxhdG9yIFZlcnNpb24KQEAgLTcwNSwxNSArNjc5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIExvYWRNZXNzYWdlMzJBKDAsZHdNZXNzYWdlSWQsZHdMYW5ndWFnZUlkLGZyb20sYnVmc2l6ZSsxKTsKIAkJfQogCX0KLQl0YXJnZXQJPSBIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsIDEwMCApOworCXRhcmdldAk9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgSEVBUF9aRVJPX01FTU9SWSwgMTAwICk7CiAJdAk9IHRhcmdldDsKIAl0YWxsb2NlZD0gMTAwOwotCSp0CT0gMDsKIAogI2RlZmluZSBBRERfVE9fVChjKSBcCiAJKnQrKz1jO1wKIAlpZiAodC10YXJnZXQgPT0gdGFsbG9jZWQpIHtcCi0JCXRhcmdldAk9IChjaGFyKil4cmVhbGxvYyh0YXJnZXQsdGFsbG9jZWQqMik7XAorCQl0YXJnZXQJPSAoY2hhciopSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHRhcmdldCx0YWxsb2NlZCoyKTtcCiAJCXQJPSB0YXJnZXQrdGFsbG9jZWQ7XAogCQl0YWxsb2NlZCo9MjtcCiAJfQpAQCAtODA1LDcgKzc3OCw3IEBACiAJCUFERF9UT19UKCdcbicpOwogCXRhbGxvY2VkID0gc3RybGVuKHRhcmdldCkrMTsKIAlpZiAoblNpemUgJiYgdGFsbG9jZWQ8blNpemUpCi0JCXRhcmdldCA9IChjaGFyKil4cmVhbGxvYyh0YXJnZXQsblNpemUpOworCQl0YXJnZXQgPSAoY2hhciopSGVhcFJlQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSxIRUFQX1pFUk9fTUVNT1JZLHRhcmdldCxuU2l6ZSk7CiAJaWYgKGR3RmxhZ3MgJiBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIpIHsKIAkJLyogblNpemUgaXMgdGhlIE1JTklNVU0gc2l6ZSAqLwogCQkqKChMUFZPSUQqKWxwQnVmZmVyKSA9IChMUFZPSUQpTG9jYWxBbGxvYzMyKEdNRU1fWkVST0lOSVQsdGFsbG9jZWQqMisyKTsKQEAgLTgxOCw2ICs3OTEsNyBAQAogCQkJbHN0cmxlbjMyVygqKExQV1NUUiopbHBCdWZmZXIpOgogCQkJbHN0cmxlbjMyVyhscEJ1ZmZlcik7CiB9CisjdW5kZWYgQUREX1RPX1QKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRm9ybWF0TWVzc2FnZUEgICAoS0VSTkVMMzIuMTM4KSBFbXVsYXRvciBWZXJzaW9uCmRpZmYgLS1naXQgYS9taXNjL21haW4uYyBiL21pc2MvbWFpbi5jCmluZGV4IDViZTZkYmYuLmQxYTRkY2MzIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtMTA4LDcgKzEwOCw3IEBACiAgICAgRkFMU0UsICAgICAgICAgIC8qIGJhY2tpbmcgc3RvcmUgKi8KICAgICBTV19TSE9XTk9STUFMLCAgLyogY21kU2hvdyAqLwogICAgIEZBTFNFLAotICAgIEZBTFNFLCAgICAgICAgICAvKiBBbGxvd1JlYWRPbmx5ICovCisgICAgRkFMU0UsICAgICAgICAgIC8qIGZhaWxSZWFkT25seSAqLwogICAgIE1PREVfRU5IQU5DRUQsICAvKiBFbmhhbmNlZCBtb2RlICovCiAgICAgRkFMU0UsICAgICAgICAgIC8qIElQQyBlbmFibGVkICovCiAjaWZkZWYgREVGQVVMVF9MQU5HCkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICB7ICItZGVidWciLCAgICAgICAgICIuZGVidWciLCAgICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAoY2FkZHJfdCkib24iIH0sCiAgICAgeyAiLWRlYnVnbXNnIiwgICAgICAiLmRlYnVnbXNnIiwgICAgICAgIFhybW9wdGlvblNlcEFyZywgKGNhZGRyX3QpTlVMTCB9LAogICAgIHsgIi1kbGwiLCAgICAgICAgICAgIi5kbGwiLCAgICAgICAgICAgICBYcm1vcHRpb25TZXBBcmcsIChjYWRkcl90KU5VTEwgfSwKLSAgICB7ICItYWxsb3dyZWFkb25seSIsICIuYWxsb3dyZWFkb25seSIsICAgWHJtb3B0aW9uTm9BcmcsICAoY2FkZHJfdCkib24iIH0sCisgICAgeyAiLWZhaWxyZWFkb25seSIsICAiLmZhaWxyZWFkb25seSIsICAgIFhybW9wdGlvbk5vQXJnLCAgKGNhZGRyX3QpIm9uIiB9LAogICAgIHsgIi1tb2RlIiwgICAgICAgICAgIi5tb2RlIiwgICAgICAgICAgICBYcm1vcHRpb25TZXBBcmcsIChjYWRkcl90KU5VTEwgfSwKICAgICB7ICItbWFuYWdlZCIsICAgICAgICIubWFuYWdlZCIsICAgICAgICAgWHJtb3B0aW9uTm9BcmcsICAoY2FkZHJfdCkib2ZmIn0sCiAgICAgeyAiLXdpbnZlciIsICAgICAgICAiLndpbnZlciIsICAgICAgICAgIFhybW9wdGlvblNlcEFyZywgKGNhZGRyX3QpTlVMTCB9CkBAIC0xNTAsNyArMTUwLDYgQEAKICAgIlVzYWdlOiAgJXMgW29wdGlvbnNdIHByb2dyYW1fbmFtZSBbYXJndW1lbnRzXVxuIiBcCiAgICJcbiIgXAogICAiT3B0aW9uczpcbiIgXAotICAiICAgIC1hbGxvd3JlYWRvbmx5ICBSZWFkIG9ubHkgZmlsZXMgbWF5IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlXG4iIFwKICAgIiAgICAtYmFja2luZ3N0b3JlICAgVHVybiBvbiBiYWNraW5nIHN0b3JlXG4iIFwKICAgIiAgICAtZGVidWcgICAgICAgICAgRW50ZXIgZGVidWdnZXIgYmVmb3JlIHN0YXJ0aW5nIGFwcGxpY2F0aW9uXG4iIFwKICAgIiAgICAtZGVidWdtc2cgbmFtZSAgVHVybiBkZWJ1Z2dpbmctbWVzc2FnZXMgb24gb3Igb2ZmXG4iIFwKQEAgLTE1OCw2ICsxNTcsNyBAQAogICAiICAgIC1kZXNrdG9wIGdlb20gICBVc2UgYSBkZXNrdG9wIHdpbmRvdyBvZiB0aGUgZ2l2ZW4gZ2VvbWV0cnlcbiIgXAogICAiICAgIC1kaXNwbGF5IG5hbWUgICBVc2UgdGhlIHNwZWNpZmllZCBkaXNwbGF5XG4iIFwKICAgIiAgICAtZGxsIG5hbWUgICAgICAgRW5hYmxlIG9yIGRpc2FibGUgYnVpbHQtaW4gRExMc1xuIiBcCisgICIgICAgLWZhaWxyZWFkb25seSAgIFJlYWQgb25seSBmaWxlcyBtYXkgbm90IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlXG4iIFwKICAgIiAgICAtZml4ZWRtYXAgICAgICAgVXNlIGEgXCJzdGFuZGFyZFwiIGNvbG9yIG1hcFxuIiBcCiAgICIgICAgLWljb25pYyAgICAgICAgIFN0YXJ0IGFzIGFuIGljb25cbiIgXAogICAiICAgIC1pcGMgICAgICAgICAgICBFbmFibGUgSVBDIGZhY2lsaXRpZXNcbiIgXApAQCAtNDMzLDggKzQzMyw4IEBACiAJT3B0aW9ucy5iYWNraW5nc3RvcmUgPSBUUlVFOwkKICAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuZGVidWciLCAmdmFsdWUgKSkKIAlPcHRpb25zLmRlYnVnID0gVFJVRTsKLSAgICBpZiAoTUFJTl9HZXRSZXNvdXJjZSggZGIsICIuYWxsb3dyZWFkb25seSIsICZ2YWx1ZSApKQotICAgICAgICBPcHRpb25zLmFsbG93UmVhZE9ubHkgPSBUUlVFOworICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi5mYWlscmVhZG9ubHkiLCAmdmFsdWUgKSkKKyAgICAgICAgT3B0aW9ucy5mYWlsUmVhZE9ubHkgPSBUUlVFOwogICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi5pcGMiLCAmdmFsdWUgKSkKICAgICAgICAgT3B0aW9ucy5pcGMgPSBUUlVFOwogICAgIGlmIChNQUlOX0dldFJlc291cmNlKCBkYiwgIi5wZXJmZWN0IiwgJnZhbHVlICkpCkBAIC04NzAsMzIgKzg3MCw2IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEgICAoS0VSTkVMMzIuNDg0KQotICovCi1CT09MMzIgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBDU1RSIGxwTmFtZSwgTFBDU1RSIGxwVmFsdWUgKQotewotICAgIGludCByYzsKLQotICAgIHJjID0gU2V0RW52aXJvbm1lbnQobHBOYW1lLCBscFZhbHVlLCBscFZhbHVlPyhzdHJsZW4obHBWYWx1ZSkrMSk6MCk7Ci0gICAgcmV0dXJuIChyYz4wKT9UUlVFOkZBTFNFOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXICAgKEtFUk5FTDMyLjQ4NSkKLSAqLwotQk9PTDMyIFNldEVudmlyb25tZW50VmFyaWFibGUzMlcoIExQQ1dTVFIgbHBOYW1lLCBMUENXU1RSIGxwVmFsdWUgKQotewotICAgIExQU1RSIGxwTmFtZUEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTmFtZSApOwotICAgIExQU1RSIGxwVmFsdWVBID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscFZhbHVlICk7Ci0gICAgQk9PTDMyIHJldCA9IFNldEVudmlyb25tZW50VmFyaWFibGUzMkEobHBOYW1lQSxscFZhbHVlQSk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGxwTmFtZUEgKTsKLSAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbHBWYWx1ZUEgKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICoJR2V0RW52aXJvbm1lbnQgKEdESS4xMzQpCiAgKi8KIGludCBHZXRFbnZpcm9ubWVudChMUFNUUiBscFBvcnROYW1lLCBMUFNUUiBscEVudmlyb24sIFdPUkQgbk1heFNpeikKQEAgLTkxOSwxMzUgKzg5Myw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBICAgKEtFUk5FTDMyLjIxMykKLSAqLwotRFdPUkQgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBTVFIgbHBOYW1lLCBMUFNUUiBscFZhbHVlLCBEV09SRCBzaXplICkKLXsKLSAgICByZXR1cm4gR2V0RW52aXJvbm1lbnQobHBOYW1lLCBscFZhbHVlLCBzaXplKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgIEdldEVudmlyb25tZW50VmFyaWFibGUzMlcgICAoS0VSTkVMMzIuMjE0KQotICovCi1EV09SRCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXKCBMUFdTVFIgbmFtZVcsIExQV1NUUiB2YWxXLCBEV09SRCBzaXplICkKLXsKLSAgICBMUFNUUiBuYW1lID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBuYW1lVyApOwotICAgIExQU1RSIHZhbCAgPSB2YWxXID8gSGVhcEFsbG9jKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplICkgOiBOVUxMOwotICAgIERXT1JEIHJlcyAgPSBHZXRFbnZpcm9ubWVudCggbmFtZSwgdmFsLCBzaXplICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWUgKTsKLSAgICBpZiAodmFsKQotICAgIHsKLSAgICAgICAgbHN0cmNweUF0b1coIHZhbFcsIHZhbCApOwotICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdmFsICk7Ci0gICAgfQotICAgIHJldHVybiByZXM7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICBHZXRFbnZpcm9ubWVudFN0cmluZ3MgKEtFUk5FTDMyLjIxMCkKLSAqLwotTFBWT0lEIEdldEVudmlyb25tZW50U3RyaW5ncyh2b2lkKQotewotICAgIGludCBjb3VudDsKLSAgICBMUEVOVkVOVFJZIGxwRW52OwotICAgIGNoYXIgKmVudnRhYmxlLCAqZW52cHRyOwotCi0gICAgLyogQ291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3ZSdsbCBuZWVkIGZvciB0aGUgc3RyaW5nCi0gICAgICogdGFibGUuICBJbmNsdWRlIHRoZSB0cmFpbGluZyBudWxzIGFuZCB0aGUgZmluYWwgZG91YmxlIG51bC4KLSAgICAgKi8KLSAgICBjb3VudCA9IDE7Ci0gICAgbHBFbnYgPSBscEVudkxpc3Q7Ci0gICAgd2hpbGUobHBFbnYgIT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIGlmKGxwRW52LT5OYW1lICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvdW50ICs9IHN0cmxlbihscEVudi0+TmFtZSkgKyAxOwotICAgICAgICAgICAgY291bnQgKz0gc3RybGVuKGxwRW52LT5WYWx1ZSkgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGxwRW52ID0gbHBFbnYtPk5leHQ7Ci0gICAgfQotCi0gICAgZW52dGFibGUgPSBtYWxsb2MoY291bnQpOwotICAgIGlmKGVudnRhYmxlKQotICAgIHsKLSAgICAgICAgbHBFbnYgPSBscEVudkxpc3Q7Ci0gICAgICAgIGVudnB0ciA9IGVudnRhYmxlOwotCi0gICAgICAgIHdoaWxlKGxwRW52ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxwRW52LT5OYW1lICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBzcHJpbnRmKGVudnB0ciwgIiVzPSVzIiwgbHBFbnYtPk5hbWUsIGxwRW52LT5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgZW52cHRyICs9IGNvdW50ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxwRW52ID0gbHBFbnYtPk5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgKmVudnB0ciA9ICdcMCc7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVudnRhYmxlOwotfQotCi0KLUxQVk9JRCBHZXRFbnZpcm9ubWVudFN0cmluZ3NXKHZvaWQpCi17Ci0gICAgaW50IGNvdW50LGxlbjsKLSAgICBMUEVOVkVOVFJZIGxwRW52OwotICAgIGNoYXIgKmVudnRhYmxlLCAqZW52cHRyOwotCVdDSEFSICp3ZW52dGFibGU7Ci0KLSAgICAvKiBDb3VudCB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdlJ2xsIG5lZWQgZm9yIHRoZSBzdHJpbmcKLSAgICAgKiB0YWJsZS4gIEluY2x1ZGUgdGhlIHRyYWlsaW5nIG51bHMgYW5kIHRoZSBmaW5hbCBkb3VibGUgbnVsLgotICAgICAqLwotICAgIGNvdW50ID0gMTsKLSAgICBscEVudiA9IGxwRW52TGlzdDsKLSAgICB3aGlsZShscEVudiAhPSBOVUxMKQotICAgIHsKLSAgICAgICAgaWYobHBFbnYtPk5hbWUgIT0gTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgY291bnQgKz0gc3RybGVuKGxwRW52LT5OYW1lKSArIDE7Ci0gICAgICAgICAgICBjb3VudCArPSBzdHJsZW4obHBFbnYtPlZhbHVlKSArIDE7Ci0gICAgICAgIH0KLSAgICAgICAgbHBFbnYgPSBscEVudi0+TmV4dDsKLSAgICB9Ci0KLQlsZW49Y291bnQ7Ci0gICAgZW52dGFibGUgPSBtYWxsb2MoY291bnQpOwotICAgIGlmKGVudnRhYmxlKQotICAgIHsKLSAgICAgICAgbHBFbnYgPSBscEVudkxpc3Q7Ci0gICAgICAgIGVudnB0ciA9IGVudnRhYmxlOwotCi0gICAgICAgIHdoaWxlKGxwRW52ICE9IE5VTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGxwRW52LT5OYW1lICE9IE5VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSBzcHJpbnRmKGVudnB0ciwgIiVzPSVzIiwgbHBFbnYtPk5hbWUsIGxwRW52LT5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgZW52cHRyICs9IGNvdW50ICsgMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGxwRW52ID0gbHBFbnYtPk5leHQ7Ci0gICAgICAgIH0KLSAgICAgICAgKmVudnB0ciA9ICdcMCc7Ci0gICAgfQotCi0Jd2VudnRhYmxlID0gbWFsbG9jKDIqbGVuKTsKLQlmb3IoY291bnQ9MDtjb3VudDxsZW47Y291bnQrKykKLQkJd2VudnRhYmxlW2NvdW50XT0oV0NIQVIpZW52dGFibGVbY291bnRdOwotCWZyZWUoZW52dGFibGUpOwotCi0gICAgcmV0dXJuIHdlbnZ0YWJsZTsKLX0KLQotdm9pZCBGcmVlRW52aXJvbm1lbnRTdHJpbmdzQSh2b2lkICplKQotewotCWZyZWUoZSk7Ci19Ci0KLXZvaWQgRnJlZUVudmlyb25tZW50U3RyaW5nc1codm9pZCogZSkKLXsKLQlmcmVlKGUpOwotfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCUdldFRpbWVyUmVzb2x1dGlvbiAoVVNFUi4xNCkKQEAgLTEyOTEsMTQgKzExMzYsNiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotKglDT1BZIChHREkuMjUwKQotKi8KLXZvaWQgQ29weShMUFZPSUQgbHBTb3VyY2UsIExQVk9JRCBscERlc3QsIFdPUkQgbkJ5dGVzKQotewotCW1lbWNweShscERlc3QsIGxwU291cmNlLCBuQnl0ZXMpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJU1dBUE1PVVNFQlVUVE9OIChVU0VSLjE4NikKICovCiBCT09MIFN3YXBNb3VzZUJ1dHRvbihCT09MIGZTd2FwKQpkaWZmIC0tZ2l0IGEvbWlzYy9vbGUybmxzLmMgYi9taXNjL29sZTJubHMuYwppbmRleCBhNmIxZThiLi4zZGYwMTQ4IDEwMDY0NAotLS0gYS9taXNjL29sZTJubHMuYworKysgYi9taXNjL29sZTJubHMuYwpAQCAtMTE1NSw2ICsxMTU1LDExMiBAQAogCX0KICAgICBicmVhazsgLyogTEFORygweDA4MDkpIChVLksuIEVuZ2xpc2gpICovCiAKKyAgICBjYXNlIExBTkdfS286IC8qIHN0cmluZyB1c2luZyBjb2RlcGFnZSA5NDkgKi8KKyAgICAgICAgc3dpdGNoIChMQ1R5cGUpIHsKK0xPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIxOCIpCitMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiXDMwN1wzMjFcMjYxXDI3MVwyNzZcMzU2IikKK0xPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJLb3JlYW4iKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIktPUiIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiXDMwN1wzMjFcMjYxXDI3MVwyNzZcMzU2IikKK0xPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjgyIikKK0xPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIlwyNjRcMzUzXDMwN1wzMjFcMjcxXDMxNlwyNjFcMjcxIikKK0xPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIktvcmVhIChTb3V0aCkiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIktPUiIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiXDI2NFwzNTNcMzA3XDMyMVwyNzFcMzE2XDI2MVwyNzEiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIxOCIpCitMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiODIiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI5NDkiKQorTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiOTQ5IikKK0xPQ1ZBTChMT0NBTEVfU0xJU1QsIiwiKQorTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCitMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIuIikKK0xPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIsIikKK0xPQ1ZBTChMT0NBTEVfU0dST1VQSU5HLCIzOzAiKQorTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKK0xPQ1ZBTChMT0NBTEVfSUxaRVJPLCIwIikKK0xPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUiwiMSIpCitMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMsIjAxMjM0NTY3ODkiKQorTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIlxcIikKK0xPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsIldvbiIpCitMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCIuIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCIsIikKK0xPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HLCIzOzAiKQorTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCitMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywiMiIpCitMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCitMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKK0xPQ1ZBTChMT0NBTEVfU0RBVEUsIi8iKQorTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCitMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsInl5eXkvTU0vZGQiKQorTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsInl5eXkvTU0vZGQiKQorTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwiaDptbTpzcyB0dCIpCitMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKK0xPQ1ZBTChMT0NBTEVfSUxEQVRFLCIxIikKK0xPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQorTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOLCIwIikKK0xPQ1ZBTChMT0NBTEVfSUNFTlRVUlksIjAiKQorTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIwIikKK0xPQ1ZBTChMT0NBTEVfSURBWUxaRVJPLCIwIikKK0xPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPLCIwIikKK0xPQ1ZBTChMT0NBTEVfUzExNTksIlwyNzdcMzAwXDMwMFwzNzQiKQorTE9DVkFMKExPQ0FMRV9TMjM1OSwiXDI3N1wzMDBcMzEwXDMwNCIpCitMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUsIjEiKQorLyogS29yZWFuIFRhbmd1biBFcmEgY2FsZW5kYXIgKi8KK0xPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsIjUiKQorTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUssIjYiKQorTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSLCIwIikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJcMjc3XDM3MVwyNzdcMzQ0XDMwMFwzMTciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIlwzMTBcMjU1XDI3N1wzNDRcMzAwXDMxNyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiXDI3NFwzNjZcMjc3XDM0NFwzMDBcMzE3IikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU0LCJcMjcwXDM2MVwyNzdcMzQ0XDMwMFwzMTciKQorTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIlwyNjFcMzM1XDI3N1wzNDRcMzAwXDMxNyIpCitMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiXDMwNVwzNDRcMjc3XDM0NFwzMDBcMzE3IikKK0xPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJcMzAwXDMxN1wyNzdcMzQ0XDMwMFwzMTciKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIlwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJcMzEwXDI1NSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiXDI3NFwzNjYiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIlwyNzBcMzYxIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJcMjYxXDMzNSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiXDMwNVwzNDQiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlwzMDBcMzE3IikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIjFcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCIyXDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiM1wyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsIjRcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCI1XDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiNlwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIjdcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCI4XDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiOVwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCIxMFwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCIxMVwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCIxMlwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiMVwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIjJcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCIzXDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiNFwyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIjVcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCI2XDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiN1wyNzdcMzcxIikKK0xPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIjhcMjc3XDM3MSIpCitMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCI5XDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIjEwXDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIjExXDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIjEyXDI3N1wzNzEiKQorTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCitMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sIiIpCitMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sIi0iKQorTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sIjMiKQorTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sIjAiKQorTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsIjMiKQorTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwiMCIpCitMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywiMyIpCitMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCIwIikKKyAgICAgICAgZGVmYXVsdDogZm91bmQ9MDticmVhazsKKyAgICAgICAgfQorICAgIGJyZWFrOyAgLyogTEFORyhLbykgKi8KKwogLypJbnNlcnQgb3RoZXIgbGFuZ3VhZ2VzIGhlcmUqLwogCiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21pc2MvcmVnaXN0cnkuYyBiL21pc2MvcmVnaXN0cnkuYwppbmRleCA5YjdjMjA5Li40OGI1NzdmIDEwMDY0NAotLS0gYS9taXNjL3JlZ2lzdHJ5LmMKKysrIGIvbWlzYy9yZWdpc3RyeS5jCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgotI2luY2x1ZGUgImRvc19mcy5oIgogI2luY2x1ZGUgInN0cmluZzMyLmgiCQogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTEyMjgsOCArMTIyNyw4IEBACiAJLyogU1RFUCAyOiBrZXlkYXRhICYgdmFsdWVzICovCiAJaWYgKCFHZXRGaWxlSW5mb3JtYXRpb25CeUhhbmRsZShoZmQsJmhmZGluZm8pKQogCQlyZXR1cm47Ci0JZW5kCQk9IGhmZGluZm8ubkZpbGVTaXplTG93OwotCWxhc3Rtb2RpZmllZAk9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSgmKGhmZGluZm8uZnRMYXN0V3JpdGVUaW1lKSk7CisJZW5kID0gaGZkaW5mby5uRmlsZVNpemVMb3c7CisJbGFzdG1vZGlmaWVkID0gRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCZoZmRpbmZvLmZ0TGFzdFdyaXRlVGltZSxOVUxMKTsKIAogCWlmICgtMT09X2xsc2VlazMyKGhmZCxyZ2Ric2VjdGlvbixTRUVLX1NFVCkpCiAJCXJldHVybjsKQEAgLTE1MzIsNyArMTUzMSw3IEBACiAJCV9sY2xvc2UzMihoZik7CiAJCXJldHVybjsKIAl9Ci0JbGFzdG1vZGlmaWVkCT0gRE9TRlNfRmlsZVRpbWVUb1VuaXhUaW1lKCYoaGZpbmZvLmZ0TGFzdFdyaXRlVGltZSkpOworCWxhc3Rtb2RpZmllZCA9IERPU0ZTX0ZpbGVUaW1lVG9Vbml4VGltZSgmaGZpbmZvLmZ0TGFzdFdyaXRlVGltZSxOVUxMKTsKIAogCWlmIChSZWdDcmVhdGVLZXkxNihIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU09GVFdBUkVcXENsYXNzZXMiLCZoa2V5KSE9RVJST1JfU1VDQ0VTUykKIAkJcmV0dXJuOwpkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDQwYTQ1MzQuLjUwNmIxM2UgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTE3NiwxMiArMTc2LDggQEAKICAgICB9CiAKICAgICAvKiBNYWtlIGxvY2FsIGNvcHkgJiBsb3dlcmNhc2UgaXQgZm9yIHJlZyAmICdwcm9ncmFtcz0nIGxvb2t1cCAqLwotICAgIHN0cm5jcHkoIHRtcGV4dCwgZXh0ZW5zaW9uLCA1ICk7Ci0gICAgaWYgKHN0cmxlbihleHRlbnNpb24pPD00KQotCXRtcGV4dFtzdHJsZW4oZXh0ZW5zaW9uKV09J1wwJzsKLSAgICBlbHNlCi0JdG1wZXh0WzRdPSdcMCc7Ci0gICAgZm9yIChpPTA7aTxzdHJsZW4odG1wZXh0KTtpKyspIHRtcGV4dFtpXT10b2xvd2VyKHRtcGV4dFtpXSk7CisgICAgbHN0cmNweW4zMkEoIHRtcGV4dCwgZXh0ZW5zaW9uLCA1ICk7CisgICAgQ2hhckxvd2VyMzJBKCB0bXBleHQgKTsKICAgICBkcHJpbnRmX2V4ZWMoc3RkZGViLCAiU0hFTExfRmluZEV4ZWN1dGFibGU6ICVzIGZpbGVcbiIsIHRtcGV4dCk7CiAgICAgCiAgICAgLyogVGhyZWUgcGxhY2VzIHRvIGNoZWNrOiAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9zcHkuYyBiL21pc2Mvc3B5LmMKaW5kZXggMWIwMGQzOS4uMjQ5MDZhYiAxMDA2NDQKLS0tIGEvbWlzYy9zcHkuYworKysgYi9taXNjL3NweS5jCkBAIC0xMzYsMTUgKzEzNiw0OCBAQAogICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCiAKICAgICAvKiAweDAwQjAgLSBXaW4zMiBFZGl0IGNvbnRyb2xzICovCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICJFTV9HRVRTRUwzMiIsICAgICAgICAgICAgICAvKiAweDAwYjAgKi8KKyAgICAiRU1fU0VUU0VMMzIiLCAgICAgICAgICAgICAgLyogMHgwMGIxICovCisgICAgIkVNX0dFVFJFQ1QzMiIsICAgICAgICAgICAgIC8qIDB4MDBiMiAqLworICAgICJFTV9TRVRSRUNUMzIiLCAgICAgICAgICAgICAvKiAweDAwYjMgKi8KKyAgICAiRU1fU0VUUkVDVE5QMzIiLCAgICAgICAgICAgLyogMHgwMGI0ICovCisgICAgIkVNX1NDUk9MTDMyIiwgICAgICAgICAgICAgIC8qIDB4MDBiNSAqLworICAgICJFTV9MSU5FU0NST0xMMzIiLCAgICAgICAgICAvKiAweDAwYjYgKi8KKyAgICAiRU1fU0NST0xMQ0FSRVQzMiIsICAgICAgICAgLyogMHgwMGI3ICovCisgICAgIkVNX0dFVE1PRElGWTMyIiwgICAgICAgICAgIC8qIDB4MDBiOCAqLworICAgICJFTV9TRVRNT0RJRlkzMiIsICAgICAgICAgICAvKiAweDAwYjkgKi8KKyAgICAiRU1fR0VUTElORUNPVU5UMzIiLCAgICAgICAgLyogMHgwMGJhICovCisgICAgIkVNX0xJTkVJTkRFWDMyIiwgICAgICAgICAgIC8qIDB4MDBiYiAqLworICAgICJFTV9TRVRIQU5ETEUzMiIsICAgICAgICAgICAvKiAweDAwYmMgKi8KKyAgICAiRU1fR0VUSEFORExFMzIiLCAgICAgICAgICAgLyogMHgwMGJkICovCisgICAgIkVNX0dFVFRIVU1CMzIiLCAgICAgICAgICAgIC8qIDB4MDBiZSAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwYmYgKi8KIAotICAgIC8qIDB4MDBDMCAqLwotICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMGMwICovCisgICAgIkVNX0xJTkVMRU5HVEgzMiIsICAgICAgICAgIC8qIDB4MDBjMSAqLworICAgICJFTV9SRVBMQUNFU0VMMzIiLCAgICAgICAgICAvKiAweDAwYzIgKi8KKyAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMGMzICovCisgICAgIkVNX0dFVExJTkUzMiIsICAgICAgICAgICAgIC8qIDB4MDBjNCAqLworICAgICJFTV9MSU1JVFRFWFQzMiIsICAgICAgICAgICAvKiAweDAwYzUgKi8KKyAgICAiRU1fQ0FOVU5ETzMyIiwgICAgICAgICAgICAgLyogMHgwMGM2ICovCisgICAgIkVNX1VORE8zMiIsICAgICAgICAgICAgICAgIC8qIDB4MDBjNyAqLworICAgICJFTV9GTVRMSU5FUzMyIiwgICAgICAgICAgICAvKiAweDAwYzggKi8KKyAgICAiRU1fTElORUZST01DSEFSMzIiLCAgICAgICAgLyogMHgwMGM5ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDBjYSAqLworICAgICJFTV9TRVRUQUJTVE9QUzMyIiwgICAgICAgICAvKiAweDAwY2IgKi8KKyAgICAiRU1fU0VUUEFTU1dPUkRDSEFSMzIiLCAgICAgLyogMHgwMGNjICovCisgICAgIkVNX0VNUFRZVU5ET0JVRkZFUjMyIiwgICAgIC8qIDB4MDBjZCAqLworICAgICJFTV9HRVRGSVJTVFZJU0lCTEVMSU5FMzIiLCAvKiAweDAwY2UgKi8KKyAgICAiRU1fU0VUUkVBRE9OTFkzMiIsICAgICAgICAgLyogMHgwMGNmICovCiAKLSAgICAvKiAweDAwRDAgKi8KLSAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICJFTV9TRVRXT1JEQlJFQUtQUk9DMzIiLCAgICAvKiAweDAwZDAgKi8KKyAgICAiRU1fR0VUV09SREJSRUFLUFJPQzMyIiwgICAgLyogMHgwMGQxICovCisgICAgIkVNX0dFVFBBU1NXT1JEQ0hBUjMyIiwgICAgIC8qIDB4MDBkMiAqLworICAgICJFTV9TRVRNQVJHSU5TMzIiLCAgICAgICAgICAvKiAweDAwZDMgKi8KKyAgICAiRU1fR0VUTUFSR0lOUzMyIiwgICAgICAgICAgLyogMHgwMGQ0ICovCisgICAgIkVNX0dFVExJTUlUVEVYVDMyIiwgICAgICAgIC8qIDB4MDBkNSAqLworICAgICJFTV9QT1NGUk9NQ0hBUjMyIiwgICAgICAgICAvKiAweDAwZDYgKi8KKyAgICAiRU1fQ0hBUkZST01QT1MzMiIsICAgICAgICAgLyogMHgwMGQ3ICovCiAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKIAogICAgIC8qIDB4MDBFMCAtIFdpbjMyIFNjcm9sbGJhcnMgKi8KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29jay5jIGIvbWlzYy93aW5zb2NrLmMKaW5kZXggZTI2ZTg0Zi4uNWFjYWRjZCAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrLmMKKysrIGIvbWlzYy93aW5zb2NrLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpZiBkZWZpbmVkKF9fc3ZyNF9fKQogI2luY2x1ZGUgPHN5cy9maWxpby5oPgogI2luY2x1ZGUgPHN5cy9pb2Njb20uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2lvLmg+CiAjZW5kaWYKICNpbmNsdWRlIDxzeXMvbXNnLmg+CiAjaW5jbHVkZSA8c3lzL3dhaXQuaD4KZGlmZiAtLWdpdCBhL21pc2Mvd2luc29ja19hc3luYy5jIGIvbWlzYy93aW5zb2NrX2FzeW5jLmMKaW5kZXggNjA3YjljZi4uODYzZjJmZiAxMDA2NDQKLS0tIGEvbWlzYy93aW5zb2NrX2FzeW5jLmMKKysrIGIvbWlzYy93aW5zb2NrX2FzeW5jLmMKQEAgLTE0LDYgKzE0LDEwIEBACiAjaW5jbHVkZSA8c3lzL21zZy5oPgogI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpZmRlZiBfX3N2cjRfXworI2luY2x1ZGUgPHN5cy9maWxlLmg+CisjaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CisjZW5kaWYKIAogZXh0ZXJuIGludCBoX2Vycm5vOwogCkBAIC0xMTIsNyArMTE2LDcgQEAKICB3c19hc3luY19vcCoJCXBfYW9wOwogCiAgY2hlY2tfc2V0ID0gX19hc3luY19pb19mZHNldDsKLSBiemVybygmdGltZW91dCxzaXplb2YodGltZW91dCkpOworIG1lbXNldCgmdGltZW91dCwgMCwgc2l6ZW9mKHRpbWVvdXQpKTsKIAogIHdoaWxlKCBzZWxlY3QoX19hc3luY19pb19tYXhfZmQgKyAxLAogICAgICAgICAgICAgICAmY2hlY2tfc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCkgPiAwKQpkaWZmIC0tZ2l0IGEvbXNkb3MvaW50MjEuYyBiL21zZG9zL2ludDIxLmMKaW5kZXggNjA5YjkwOC4uNzljMGQ4NyAxMDA2NDQKLS0tIGEvbXNkb3MvaW50MjEuYworKysgYi9tc2Rvcy9pbnQyMS5jCkBAIC0xNiw5ICsxNiw5IEBACiAjaW5jbHVkZSA8dXRpbWUuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJkcml2ZS5oIgogI2luY2x1ZGUgImZpbGUuaCIKKyNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAibXNkb3MuaCIKICNpbmNsdWRlICJsZHQuaCIKICNpbmNsdWRlICJ0YXNrLmgiCkBAIC0yOTEsMzIgKzI5MSwyMSBAQAogCX0KIH0KIAotc3RhdGljIHZvaWQgR2V0U3lzdGVtRGF0ZSggQ09OVEVYVCAqY29udGV4dCApCitzdGF0aWMgdm9pZCBJTlQyMV9HZXRTeXN0ZW1EYXRlKCBDT05URVhUICpjb250ZXh0ICkKIHsKLQlzdHJ1Y3QgdG0gKm5vdzsKLQl0aW1lX3QgbHRpbWU7Ci0KLQlsdGltZSA9IHRpbWUoTlVMTCk7Ci0Jbm93ID0gbG9jYWx0aW1lKCZsdGltZSk7Ci0KLQlDWF9yZWcoY29udGV4dCkgPSBub3ctPnRtX3llYXIgKyAxOTAwOwotCURYX3JlZyhjb250ZXh0KSA9ICgobm93LT50bV9tb24gKyAxKSA8PCA4KSB8IG5vdy0+dG1fbWRheTsKLQlBWF9yZWcoY29udGV4dCkgPSBub3ctPnRtX3dkYXk7CisgICAgU1lTVEVNVElNRSBzeXN0aW1lOworICAgIEdldExvY2FsVGltZSggJnN5c3RpbWUgKTsKKyAgICBDWF9yZWcoY29udGV4dCkgPSBzeXN0aW1lLndZZWFyOworICAgIERYX3JlZyhjb250ZXh0KSA9IChzeXN0aW1lLndNb250aCA8PCA4KSB8IHN5c3RpbWUud0RheTsKKyAgICBBWF9yZWcoY29udGV4dCkgPSBzeXN0aW1lLndEYXlPZldlZWs7CiB9CiAKIHN0YXRpYyB2b2lkIElOVDIxX0dldFN5c3RlbVRpbWUoIENPTlRFWFQgKmNvbnRleHQgKQogewotCXN0cnVjdCB0bSAqbm93OwotCXN0cnVjdCB0aW1ldmFsIHR2OwotCXRpbWVfdCBzZWNvbmRzOwotCi0JZ2V0dGltZW9mZGF5KCZ0dixOVUxMKTsJCS8qIE5vdGUgdXNlIG9mIGdldHRpbWVvZmRheSgpLCBpbnN0ZWFkIG9mIHRpbWUoKSAqLwotCXNlY29uZHMgPSB0di50dl9zZWM7Ci0Jbm93ID0gbG9jYWx0aW1lKCZzZWNvbmRzKTsKLQkgCi0JQ1hfcmVnKGNvbnRleHQpID0gKG5vdy0+dG1faG91cjw8OCkgfCBub3ctPnRtX21pbjsKLQlEWF9yZWcoY29udGV4dCkgPSAobm93LT50bV9zZWM8PDgpIHwgdHYudHZfdXNlYy8xMDAwMDsKLQkJCQkJLyogTm90ZSBodW5kcmVkdGhzIG9mIHNlY29uZHMgKi8KKyAgICBTWVNURU1USU1FIHN5c3RpbWU7CisgICAgR2V0TG9jYWxUaW1lKCAmc3lzdGltZSApOworICAgIENYX3JlZyhjb250ZXh0KSA9IChzeXN0aW1lLndIb3VyIDw8IDgpIHwgc3lzdGltZS53TWludXRlOworICAgIERYX3JlZyhjb250ZXh0KSA9IChzeXN0aW1lLndTZWNvbmQgPDwgOCkgfCAoc3lzdGltZS53TWlsbGlzZWNvbmRzIC8gMTApOwogfQogCiBzdGF0aWMgdm9pZCBJTlQyMV9DcmVhdGVGaWxlKCBDT05URVhUICpjb250ZXh0ICkKQEAgLTM0NSwxMCArMzM0LDYgQEAKIAlpbnQgbW9kZTsKIAlpbnQgbG9jazsKIAkKLQlkcHJpbnRmX2ludCAoc3RkZGViLCAiaW50MjE6IG9wZW4gKCVzLCAlZCkgPSAlZFxuIiwKLQkJRE9TX0dldFVuaXhGaWxlTmFtZShQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFhfcmVnKGNvbnRleHQpKSksIG1vZGUsIGhhbmRsZSk7Ci0KICAgICAgICAgc3dpdGNoIChBWF9yZWcoY29udGV4dCkgJiAweDAwNzApCiAJewogCSAgY2FzZSAweDAwOiAgICAvKiBjb21wYXRhYmlsaXR5IG1vZGUgKi8KQEAgLTQyNCw4ICs0MDksNiBAQAogdm9pZCBFeHRlbmRlZE9wZW5DcmVhdGVGaWxlKENPTlRFWFQgKmNvbnRleHQgKQogewogICBCWVRFIGFjdGlvbj1ETF9yZWcoY29udGV4dCk7Ci0gIGRwcmludGZfaW50KHN0ZGRlYiwgImludDIxOiBleHRlbmRlZCBvcGVuL2NyZWF0ZTogZmlsZT0gJXMgXG4iLAotCSAgICAgIERPU0ZTX0dldFVuaXhGaWxlTmFtZShQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLFNJX3JlZyhjb250ZXh0KSksRkFMU0UpKTsKICAgLyogU2h1ZmZsZSBhcmd1bWVudHMgdG8gY2FsbCBPcGVuRXhpc3RpbmdGaWxlICovCiAgIEFMX3JlZyhjb250ZXh0KSA9IEJMX3JlZyhjb250ZXh0KTsKICAgRFhfcmVnKGNvbnRleHQpID0gU0lfcmVnKGNvbnRleHQpOwpAQCAtNDMzLDggKzQxNiw2IEBACiAgIE9wZW5FeGlzdGluZ0ZpbGUoY29udGV4dCk7CiAgIGlmICgoRUZMX3JlZyhjb250ZXh0KSAmIDB4MDAwMSk9PTApIAogICAgIHsgLyogSXQgZXhpc3RzICovCi0gICAgICBkcHJpbnRmX2ludChzdGRkZWIsICJpbnQyMTogZXh0ZW5kZWQgb3Blbi9jcmVhdGUgJXMgZXhpc3RzIFxuIiwKLQkJICBET1NGU19HZXRVbml4RmlsZU5hbWUoUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLFRSVUUpKTsKICAgICAgIC8qIE5vdyBkZWNpZGUgd2hhdCBkbyBkbyAqLwogICAgICAgaWYgKChhY3Rpb24gJiAweDA3KT09IDApCiAJewpAQCAtNDg3LDkgKzQ2OCw4IEBACiAgIGVsc2UgLyogZmlsZSBkb2VzIG5vdCBleGlzdCAqLwogICAgIHsKICAgICAgIFJFU0VUX0NGTEFHKGNvbnRleHQpOyAvKiB3YXMgc2V0IGJ5IE9wZW5FeGlzdGluZ0ZpbGUoY29udGV4dCkgKi8KLSAgICAgZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlICVzIGRvc2VuJ3QgZXhpc3RzIFxuIiwKLQkJICBET1NGU19HZXRVbml4RmlsZU5hbWUoUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxTSV9yZWcoY29udGV4dCkpLEZBTFNFKSk7Ci0gICAgICBpZiAoKGFjdGlvbiAmIDB4RjApPT0gMCkgeworICAgICAgaWYgKChhY3Rpb24gJiAweEYwKT09IDApCisgICAgICB7CiAJQ1hfcmVnKGNvbnRleHQpID0gMDsKIAlTRVRfQ0ZMQUcoY29udGV4dCk7CiAJZHByaW50Zl9pbnQoc3RkZGViLCAiaW50MjE6IGV4dGVuZGVkIG9wZW4vY3JlYXRlOiBmYWlsZWQsIGZpbGUgZG9zZW4ndCBleGlzdFxuIik7CkBAIC01MTEsMzkgKzQ5MSw2IEBACiB9CiAKIAotc3RhdGljIGludCBJTlQyMV9SZW5hbWVGaWxlKCBDT05URVhUICpjb250ZXh0ICkKLXsKLSAgICBjb25zdCBjaGFyICpuZXduYW1lLCAqb2xkbmFtZTsKLSAgICBjaGFyICpidWZmZXI7Ci0KLSAgICAvKiBGSVhNRTogc2hvdWxkIG5vdCByZW5hbWUgb3ZlciBhbiBleGlzdGluZyBmaWxlICovCi0gICAgZHByaW50Zl9pbnQoc3RkZGViLCJpbnQyMTogcmVuYW1pbmcgJXMgdG8gJXNcbiIsCi0gICAgICAgICAgICAgICAgKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLERYX3JlZyhjb250ZXh0KSksCi0gICAgICAgICAgICAgICAgKGNoYXIgKilQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLERJX3JlZyhjb250ZXh0KSkpOwotCQotICAgIG9sZG5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEWF9yZWcoY29udGV4dCkpLCBUUlVFICk7Ci0gICAgaWYgKCFvbGRuYW1lKSByZXR1cm4gMDsKLSAgICBidWZmZXIgPSB4c3RyZHVwKCBvbGRuYW1lICk7Ci0gICAgbmV3bmFtZSA9IERPU0ZTX0dldFVuaXhGaWxlTmFtZSggUFRSX1NFR19PRkZfVE9fTElOKEVTX3JlZyhjb250ZXh0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJX3JlZyhjb250ZXh0KSksIEZBTFNFICk7Ci0gICAgaWYgKCFuZXduYW1lKQotICAgIHsKLSAgICAgICAgZnJlZSggYnVmZmVyICk7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICAKLSAgICBpZiAocmVuYW1lKCBidWZmZXIsIG5ld25hbWUpID09IC0xKQotICAgIHsKLSAgICAgICAgRklMRV9TZXREb3NFcnJvcigpOwotICAgICAgICBmcmVlKCBidWZmZXIgKTsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGZyZWUoIGJ1ZmZlciApOwotICAgIHJldHVybiAxOwotfQotCi0KIHN0YXRpYyB2b2lkIElOVDIxX0NoYW5nZURpciggQ09OVEVYVCAqY29udGV4dCApCiB7CiAgICAgaW50IGRyaXZlOwpAQCAtNTY2LDIyICs1MTMsMjcgQEAKIAogc3RhdGljIGludCBJTlQyMV9GaW5kRmlyc3QoIENPTlRFWFQgKmNvbnRleHQgKQogewotICAgIGNvbnN0IGNoYXIgKnBhdGgsICp1bml4UGF0aCwgKm1hc2s7CiAgICAgY2hhciAqcDsKKyAgICBjb25zdCBjaGFyICpwYXRoOworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogICAgIEZJTkRGSUxFX0RUQSAqZHRhID0gKEZJTkRGSUxFX0RUQSAqKUdldEN1cnJlbnREVEEoKTsKIAogICAgIHBhdGggPSAoY29uc3QgY2hhciAqKVBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksIERYX3JlZyhjb250ZXh0KSk7CiAgICAgZHRhLT51bml4UGF0aCA9IE5VTEw7Ci0gICAgaWYgKCEodW5peFBhdGggPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIHBhdGgsIEZBTFNFICkpKQorICAgIGlmICghRE9TRlNfR2V0RnVsbE5hbWUoIHBhdGgsIEZBTFNFLCAmZnVsbF9uYW1lICkpCiAgICAgewogICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZHRhLT51bml4UGF0aCA9IHhzdHJkdXAoIHVuaXhQYXRoICk7CisgICAgZHRhLT51bml4UGF0aCA9IHhzdHJkdXAoIGZ1bGxfbmFtZS5sb25nX25hbWUgKTsKICAgICBwID0gc3RycmNociggZHRhLT51bml4UGF0aCwgJy8nICk7CiAgICAgKnAgPSAnXDAnOwotICAgIGlmICghKG1hc2sgPSBET1NGU19Ub0Rvc0ZDQkZvcm1hdCggcCArIDEgKSkpCisKKyAgICAvKiBOb3RlOiB0ZXJtaW5hdGluZyBOVUxMIGluIGR0YS0+bWFzayBvdmVyd3JpdGVzIGR0YS0+c2VhcmNoX2F0dHIKKyAgICAgKiAgICAgICAoZG9lc24ndCBtYXR0ZXIgYXMgaXQgaXMgc2V0IGJlbG93IGFueXdheSkKKyAgICAgKi8KKyAgICBpZiAoIURPU0ZTX1RvRG9zRkNCRm9ybWF0KCBwICsgMSwgZHRhLT5tYXNrICkpCiAgICAgewogICAgICAgICBmcmVlKCBkdGEtPnVuaXhQYXRoICk7CiAgICAgICAgIGR0YS0+dW5peFBhdGggPSBOVUxMOwpAQCAtNTkwLDcgKzU0Miw2IEBACiAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIG1lbWNweSggZHRhLT5tYXNrLCBtYXNrLCBzaXplb2YoZHRhLT5tYXNrKSApOwogICAgIGR0YS0+ZHJpdmUgPSAocGF0aFswXSAmJiAocGF0aFsxXSA9PSAnOicpKSA/IHRvdXBwZXIocGF0aFswXSkgLSAnQScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBEUklWRV9HZXRDdXJyZW50RHJpdmUoKTsKICAgICBkdGEtPmNvdW50ID0gMDsKQEAgLTcwOSwyNSArNjYwLDE5IEBACiB7CiAgICAgQllURSAqZmNiID0gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLCBEWF9yZWcoY29udGV4dCkpOwogICAgIEZJTkRGSUxFX0ZDQiAqcEZDQjsKLSAgICBCWVRFIGF0dHI7Ci0gICAgY2hhciBidWZmZXJbXSA9ICJBOi4iOwotICAgIGNvbnN0IGNoYXIgKnVuaXhQYXRoOworICAgIExQQ1NUUiByb290LCBjd2Q7CisgICAgaW50IGRyaXZlOwogCi0gICAgaWYgKCpmY2IgPT0gMHhmZikKLSAgICB7Ci0gICAgICAgIGF0dHIgPSBmY2JbNl07Ci0gICAgICAgIHBGQ0IgPSAoRklOREZJTEVfRkNCICopKGZjYiArIDcpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBhdHRyID0gMDsKLSAgICAgICAgcEZDQiA9IChGSU5ERklMRV9GQ0IgKilmY2I7Ci0gICAgfQotCi0gICAgYnVmZmVyWzBdICs9IERPU19HRVRfRFJJVkUoIHBGQ0ItPmRyaXZlICk7Ci0gICAgcEZDQi0+dW5peFBhdGggPSBOVUxMOwotICAgIGlmICghKHVuaXhQYXRoID0gRE9TRlNfR2V0VW5peEZpbGVOYW1lKCBidWZmZXIsIFRSVUUgKSkpIHJldHVybiAwOwotICAgIHBGQ0ItPnVuaXhQYXRoID0geHN0cmR1cCggdW5peFBhdGggKTsKKyAgICBpZiAoKmZjYiA9PSAweGZmKSBwRkNCID0gKEZJTkRGSUxFX0ZDQiAqKShmY2IgKyA3KTsKKyAgICBlbHNlIHBGQ0IgPSAoRklOREZJTEVfRkNCICopZmNiOworICAgIGRyaXZlID0gRE9TX0dFVF9EUklWRSggcEZDQi0+ZHJpdmUgKTsKKyAgICByb290ID0gRFJJVkVfR2V0Um9vdCggZHJpdmUgKTsKKyAgICBjd2QgID0gRFJJVkVfR2V0VW5peEN3ZCggZHJpdmUgKTsKKyAgICBwRkNCLT51bml4UGF0aCA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwgc3RybGVuKHJvb3QpK3N0cmxlbihjd2QpKzIgKTsKKyAgICBpZiAoIXBGQ0ItPnVuaXhQYXRoKSByZXR1cm4gMDsKKyAgICBzdHJjcHkoIHBGQ0ItPnVuaXhQYXRoLCByb290ICk7CisgICAgc3RyY2F0KCBwRkNCLT51bml4UGF0aCwgIi8iICk7CisgICAgc3RyY2F0KCBwRkNCLT51bml4UGF0aCwgY3dkICk7CiAgICAgcEZDQi0+Y291bnQgPSAwOwogICAgIHJldHVybiAxOwogfQpAQCAtNzU4LDcgKzcwMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9TX0dFVF9EUklWRSggcEZDQi0+ZHJpdmUgKSwgYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRkNCLT5jb3VudCwgJmVudHJ5ICkpKQogICAgIHsKLSAgICAgICAgZnJlZSggcEZDQi0+dW5peFBhdGggKTsKKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHBGQ0ItPnVuaXhQYXRoICk7CiAgICAgICAgIHBGQ0ItPnVuaXhQYXRoID0gTlVMTDsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtOTMzLDIxICs4NzgsNiBAQAogfSAKIAogCi1zdGF0aWMgaW50IElOVDIxX0dldEZpbGVBdHRyaWJ1dGUoIENPTlRFWFQgKiBjb250ZXh0ICkKLXsKLSAgICBjb25zdCBjaGFyICp1bml4TmFtZTsKLSAgICBCWV9IQU5ETEVfRklMRV9JTkZPUk1BVElPTiBpbmZvOwotCi0gICAgdW5peE5hbWUgPSBET1NGU19HZXRVbml4RmlsZU5hbWUoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksRFhfcmVnKGNvbnRleHQpKSwgVFJVRSApOwotICAgIGlmICghdW5peE5hbWUpIHJldHVybiAwOwotICAgIGlmICghRklMRV9TdGF0KCB1bml4TmFtZSwgJmluZm8gKSkgcmV0dXJuIDA7Ci0gICAgQ1hfcmVnKGNvbnRleHQpID0gaW5mby5kd0ZpbGVBdHRyaWJ1dGVzOwotICAgIGRwcmludGZfaW50KCBzdGRkZWIsICJJTlQyMV9HZXRGaWxlQXR0cmlidXRlcyglcykgPSAweCV4XG4iLAotICAgICAgICAgICAgICAgICB1bml4TmFtZSwgQ1hfcmVnKGNvbnRleHQpICk7Ci0gICAgcmV0dXJuIDE7Ci19Ci0KLQogZXh0ZXJuIHZvaWQgTE9DQUxfUHJpbnRIZWFwIChXT1JEIGRzKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0xMDg2LDcgKzEwMTYsNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgMHgyYTogLyogR0VUIFNZU1RFTSBEQVRFICovCi0gICAgICAgIEdldFN5c3RlbURhdGUoY29udGV4dCk7CisgICAgICAgIElOVDIxX0dldFN5c3RlbURhdGUoY29udGV4dCk7CiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDJiOiAvKiBTRVQgU1lTVEVNIERBVEUgKi8KQEAgLTEyODQsMTQgKzEyMTQsMjQgQEAKICAgICAgICAgc3dpdGNoIChBTF9yZWcoY29udGV4dCkpCiAgICAgICAgIHsKICAgICAgICAgY2FzZSAweDAwOgotICAgICAgICAgICAgaWYgKCFJTlQyMV9HZXRGaWxlQXR0cmlidXRlKGNvbnRleHQpKQorICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gKFdPUkQpR2V0RmlsZUF0dHJpYnV0ZXMzMkEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSkpOworICAgICAgICAgICAgaWYgKEFYX3JlZyhjb250ZXh0KSA9PSAweGZmZmYpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgQVhfcmVnKGNvbnRleHQpID0gRE9TX0V4dGVuZGVkRXJyb3I7CiAgICAgICAgICAgICAgICAgU0VUX0NGTEFHKGNvbnRleHQpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBDWF9yZWcoY29udGV4dCkgPSBBWF9yZWcoY29udGV4dCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAweDAxOgotICAgICAgICAgICAgUkVTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIVNldEZpbGVBdHRyaWJ1dGVzMzJBKCBQVFJfU0VHX09GRl9UT19MSU4oRFNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERYX3JlZyhjb250ZXh0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDWF9yZWcoY29udGV4dCkgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKKyAgICAgICAgICAgICAgICBTRVRfQ0ZMQUcoY29udGV4dCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTE0NjYsNyArMTQwNiw4IEBACiAgICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSAweDU2OiAvKiAiUkVOQU1FIiAtIFJFTkFNRSBGSUxFICovCi0gICAgICAgIGlmICghSU5UMjFfUmVuYW1lRmlsZShjb250ZXh0KSkKKyAgICAgICAgaWYgKCFNb3ZlRmlsZTMyQSggUFRSX1NFR19PRkZfVE9fTElOKERTX3JlZyhjb250ZXh0KSxEWF9yZWcoY29udGV4dCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLERJX3JlZyhjb250ZXh0KSkpKQogICAgICAgICB7CiAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSBET1NfRXh0ZW5kZWRFcnJvcjsKICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTE1NzYsMTkgKzE1MTcsMTUgQEAKIAogICAgIGNhc2UgMHg2MDogLyogIlRSVUVOQU1FIiAtIENBTk9OSUNBTElaRSBGSUxFTkFNRSBPUiBQQVRIICovCiAgICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRydWVuYW1lID0gRE9TRlNfR2V0RG9zVHJ1ZU5hbWUoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksU0lfcmVnKGNvbnRleHQpICksIEZBTFNFICk7Ci0gICAgICAgICAgICBpZiAoIXRydWVuYW1lKQorICAgICAgICAgICAgaWYgKCFHZXRGdWxsUGF0aE5hbWUzMkEoIFBUUl9TRUdfT0ZGX1RPX0xJTihEU19yZWcoY29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNJX3JlZyhjb250ZXh0KSksIDEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVFJfU0VHX09GRl9UT19MSU4oRVNfcmVnKGNvbnRleHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESV9yZWcoY29udGV4dCkpLE5VTEwpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIEFYX3JlZyhjb250ZXh0KSA9IERPU19FeHRlbmRlZEVycm9yOwogICAgICAgICAgICAgICAgIFNFVF9DRkxBRyhjb250ZXh0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsc3RyY3B5bjMyQSggUFRSX1NFR19PRkZfVE9fTElOKCBFU19yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElfcmVnKGNvbnRleHQpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVuYW1lLCAxMjggKTsKLSAgICAgICAgICAgICAgICBBWF9yZWcoY29udGV4dCkgPSAwOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBBWF9yZWcoY29udGV4dCkgPSAwOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL2F1ZGlvLmMgYi9tdWx0aW1lZGlhL2F1ZGlvLmMKaW5kZXggYjcxYjFkMi4uYTgyMjYzMiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9hdWRpby5jCisrKyBiL211bHRpbWVkaWEvYXVkaW8uYwpAQCAtMTM4LDcgKzEzOCw3IEBACiAJCQkJCQlscHN0ckVsZW1lbnROYW1lKTsKIAkJaWYgKHN0cmxlbihscHN0ckVsZW1lbnROYW1lKSA+IDApIHsKIAkJCXN0cmNweShzdHIsIGxwc3RyRWxlbWVudE5hbWUpOwotCQkJQW5zaVVwcGVyKHN0cik7CisJCQlDaGFyVXBwZXIzMkEoc3RyKTsKIAkJCU1DSVdhdkRldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKIAkJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7CiAJCQlpZiAoTUNJV2F2RGV2W3dEZXZJRF0uaEZpbGUgPT0gMCkgewpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lhbmltLmMgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwppbmRleCBlZjAyNjJkLi5jZWVmOGJmIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21jaWFuaW0uYworKysgYi9tdWx0aW1lZGlhL21jaWFuaW0uYwpAQCAtODUsNyArODUsNyBAQAogCQkJCQkJbHBzdHJFbGVtZW50TmFtZSk7CiAJCWlmIChzdHJsZW4obHBzdHJFbGVtZW50TmFtZSkgPiAwKSB7CiAJCQlzdHJjcHkoc3RyLCBscHN0ckVsZW1lbnROYW1lKTsKLQkJCUFuc2lVcHBlcihzdHIpOworCQkJQ2hhclVwcGVyMzJBKHN0cik7CiAJCQl9CiAJCX0KIAltZW1jcHkoJkFuaW1EZXZbd0RldklEXS5vcGVuUGFybXMsIGxwUGFybXMsIHNpemVvZihNQ0lfT1BFTl9QQVJNUykpOwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYyBiL211bHRpbWVkaWEvbWNpc3RyaW5nLmMKaW5kZXggMjE5YzNmOC4uOTNmYTA2MCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tY2lzdHJpbmcuYworKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC0yMTE1LDcgKzIxMTUsNyBAQAogCSpkZXYrKz0nXDAnOwogCWFyZ3M9c3RyY2hyKGRldiwnICcpOwogCWlmIChhcmdzIT1OVUxMKSAqYXJncysrPSdcMCc7Ci0JQW5zaVVwcGVyKGRldik7CisJQ2hhclVwcGVyMzJBKGRldik7CiAJaWYgKGFyZ3MhPU5VTEwpIHsKIAkJY2hhcgkqczsKIAkJaT0xOy8qIG5yb2ZrZXl3b3JkcyA9IG5yb2ZzcGFjZXMrMSAqLwpkaWZmIC0tZ2l0IGEvbXVsdGltZWRpYS9taWRpLmMgYi9tdWx0aW1lZGlhL21pZGkuYwppbmRleCBkZjQwNjVmLi5hZGRiZjE2IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21pZGkuYworKysgYi9tdWx0aW1lZGlhL21pZGkuYwpAQCAtMzAwLDcgKzMwMCw3IEBACiAJCWRwcmludGZfbWlkaShzdGRkZWIsICJNSURJX21jaU9wZW4gLy8gTUNJX09QRU5fRUxFTUVOVCAnJXMnICFcbiIsIGxwc3RyRWxlbWVudE5hbWUpOwogCQlpZiAoc3RybGVuKGxwc3RyRWxlbWVudE5hbWUpID4gMCkgewogCQkJc3RyY3B5KHN0ciwgbHBzdHJFbGVtZW50TmFtZSk7Ci0JCQlBbnNpVXBwZXIoc3RyKTsKKwkJCUNoYXJVcHBlcjMyQShzdHIpOwogCQkJTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID0gbW1pb09wZW4oc3RyLCBOVUxMLCAKIAkJCQlNTUlPX0FMTE9DQlVGIHwgTU1JT19SRUFEV1JJVEUgfCBNTUlPX0VYQ0xVU0lWRSk7CiAJCQlpZiAoTUNJTWlkaURldlt3RGV2SURdLmhGaWxlID09IDApIHsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbW1zeXN0ZW0uYyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwppbmRleCBhNjY5YTIzLi42Y2I2MjBjIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMKKysrIGIvbXVsdGltZWRpYS9tbXN5c3RlbS5jCkBAIC01ODcsNyArNTg3LDcgQEAKIAkJdD1zdHJyY2hyKHMsJy4nKTsKIAkJaWYgKHQpIHsKIAkJCUdldFByb2ZpbGVTdHJpbmczMkEoIm1jaSBleHRlbnNpb25zIix0KzEsIioiLHN0cixzaXplb2Yoc3RyKSk7Ci0JCQlBbnNpVXBwZXIoc3RyKTsKKwkJCUNoYXJVcHBlcjMyQShzdHIpOwogCQkJaWYgKHN0cmNtcChzdHIsICJDREFVRElPIikgPT0gMCkgewogCQkJCXVEZXZUeXAgPSBNQ0lfREVWVFlQRV9DRF9BVURJTzsKIAkJCX0gZWxzZQpAQCAtNjM2LDcgKzYzNiw3IEBACiAJCQkJKGNoYXIqKVBUUl9TRUdfVE9fTElOKGxwUGFybXMtPmxwc3RyRGV2aWNlVHlwZSkKIAkJCSk7CiAJCQlzdHJjcHkoc3RyLCBQVFJfU0VHX1RPX0xJTihscFBhcm1zLT5scHN0ckRldmljZVR5cGUpKTsKLQkJCUFuc2lVcHBlcihzdHIpOworCQkJQ2hhclVwcGVyMzJBKHN0cik7CiAJCQlpZiAoc3RyY21wKHN0ciwgIkNEQVVESU8iKSA9PSAwKSB7CiAJCQkJdURldlR5cCA9IE1DSV9ERVZUWVBFX0NEX0FVRElPOwogCQkJfSBlbHNlCkBAIC04MjksMTEgKzgyOSw4IEBACiB7CiAJY2hhcglzdHJbMTI4XTsKIAlkcHJpbnRmX21jaShzdGRkZWIsICJtY2lHZXREZXZpY2VJRCglcylcbiIsIGxwc3RyTmFtZSk7Ci0JaWYgKGxwc3RyTmFtZSAhPSBOVUxMKSB7Ci0JCXN0cmNweShzdHIsIGxwc3RyTmFtZSk7Ci0JCUFuc2lVcHBlcihzdHIpOwotCQlpZiAoc3RyY21wKHN0ciwgIkFMTCIpID09IDApIHJldHVybiBNQ0lfQUxMX0RFVklDRV9JRDsKLQkJfQorCWlmIChscHN0ck5hbWUgJiYgIWxzdHJjbXBpMzJBKGxwc3RyTmFtZSwgIkFMTCIpKQorICAgICAgICAgICAgcmV0dXJuIE1DSV9BTExfREVWSUNFX0lEOwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL2ZvbnQuYyBiL29iamVjdHMvZm9udC5jCmluZGV4IDk0NWIzODAuLjA3Yjk1YTYgMTAwNjQ0Ci0tLSBhL29iamVjdHMvZm9udC5jCisrKyBiL29iamVjdHMvZm9udC5jCkBAIC0yODAsNyArMjgwLDYgQEAKICAgICBpZiAoISpmb250LT5sZkZhY2VOYW1lKQogICAgICAgUGFyc2VGb250UGFybXMoKm5hbWVzLCAyLCBmb250LT5sZkZhY2VOYW1lICwgTEZfRkFDRVNJWkUtMSk7CiAgICAgLyogd2UgbmVlZCBhIGZvbnQgbmFtZSBmb3IgZnVuY3Rpb24gR2V0VGV4dEZhY2UoKSBldmVuIGlmIHRoZXJlIGlzbid0IG9uZSA7LSkgKi8gIAotICAgIC8qQW5zaVVwcGVyKGZvbnQtPmxmRmFjZU5hbWUpOyovCiAKICAgICBmb250U3RydWN0ID0gWExvYWRRdWVyeUZvbnQoIGRpc3BsYXksICpuYW1lcyApOwogICAgIFhGcmVlRm9udE5hbWVzKCBuYW1lcyApOwpAQCAtMTM3Miw3ICsxMzcxLDYgQEAKICAgICBkcHJpbnRmX2ZvbnQoc3RkZGViLCJJbml0Rm9udHNMaXN0IC8vIG5hbWVzWyVkXT0nJXMnIFxuIiwgaSwgbmFtZXNbaV0pOwogCiAgICAgUGFyc2VGb250UGFybXMobmFtZXNbaV0sIDIsIHN0ciwgc2l6ZW9mKHN0cikpOwotLyogICAgQW5zaVVwcGVyKHN0cik7Ki8KICAgICBzdHJjcHkobHBOZXdGb250LT5sZkZhY2VOYW1lLCBzdHIpOwogICAgIFBhcnNlRm9udFBhcm1zKG5hbWVzW2ldLCA4LCBzdHIsIHNpemVvZihzdHIpKTsKICAgICBscE5ld0ZvbnQtPmxmSGVpZ2h0ID0gYXRvaShzdHIpIC8gMTA7CkBAIC0xNTM1LDcgKzE1MzMsNiBAQAogICB9CiAgIGxwT2xkTmFtZSA9IE5VTEw7CiAgIHN0cmNweShGYWNlTmFtZSxscExGLT5sZkZhY2VOYW1lKTsKLS8qICBBbnNpVXBwZXIobHBMRi0+bGZGYWNlTmFtZSk7Ki8KIAogICBpZiAobHBMb2dGb250TGlzdFswXSA9PSBOVUxMKSBJbml0Rm9udHNMaXN0KCk7CiAgIGZvcihpID0gMDsgbHBMb2dGb250TGlzdFtpXSAhPSBOVUxMOyBpKyspIHsKQEAgLTE2MTYsNyArMTYxMyw2IEBACiAgIH0KICAgbHBPbGROYW1lID0gTlVMTDsKICAgc3RyY3B5KEZhY2VOYW1lLGxwTEYtPmxmRmFjZU5hbWUpOwotLyogIEFuc2lVcHBlcihscExGLT5sZkZhY2VOYW1lKTsqLwogCiAgIGlmIChscExvZ0ZvbnRMaXN0WzBdID09IE5VTEwpIEluaXRGb250c0xpc3QoKTsKICAgZm9yKGkgPSAwOyBscExvZ0ZvbnRMaXN0W2ldICE9IE5VTEw7IGkrKykgewpAQCAtMTY5NCw3ICsxNjkwLDYgQEAKICAgfQogICBscE9sZE5hbWUgPSBOVUxMOwogICBscHN6RmFtaWx5ID0gSEVBUF9zdHJkdXBXdG9BKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBscExGLT5sZkZhY2VOYW1lICk7Ci0gIEFuc2lVcHBlcihscHN6RmFtaWx5KTsKICAgaWYgKGxwTG9nRm9udExpc3RbMF0gPT0gTlVMTCkgSW5pdEZvbnRzTGlzdCgpOwogICBmb3IoaSA9IDA7IGxwTG9nRm9udExpc3RbaV0gIT0gTlVMTDsgaSsrKSB7CiAgICAgLyogbGZDaGFyU2V0ICovCmRpZmYgLS1naXQgYS9vYmplY3RzL21ldGFmaWxlLmMgYi9vYmplY3RzL21ldGFmaWxlLmMKaW5kZXggOTYxMGRjNi4uYzdlZTI1ZCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9tZXRhZmlsZS5jCisrKyBiL29iamVjdHMvbWV0YWZpbGUuYwpAQCAtMzM3LDQ3ICszMzcsNiBAQAogICAgIHJldHVybiBUUlVFOwogfQogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICBNRl9HZXRESUJpdHNQb2ludGVyICAgIFtpbnRlcm5hbCBoZWxwZXIgZm9yIGUuZy4gUGxheU1ldGFGaWxlUmVjb3JkXQotICoKLSAqIFJldHVybnMgb2Zmc2V0IHRvIERJQiBiaXRzIG9yIDAgaWYgZXJyb3IKLSAqIChwZXJoYXBzIHNob3VsZCBiZSBtb3ZlZCB0byAob2JqZWN0cy9kaWIuYyA/KQotICovCi1zdGF0aWMgTFBTVFIgTUZfR2V0RElCaXRzUG9pbnRlcihMUEJJVE1BUElORk8gaW5mbykKLXsKLSAgICAgIGludCBvZmZzZXQ7Ci0gICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSA9PSBzaXplb2YoQklUTUFQSU5GT0hFQURFUikpCi0JewotICAgICAgICBpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKLQkgIHsKLQkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQotCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogNDsKLSAgICAgICAgICBlbHNlCi0JICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDQ7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0JICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiA0OwotCX0KLSAgICAgIGVsc2UgaWYgKGluZm8tPmJtaUhlYWRlci5iaVNpemUgPT0gc2l6ZW9mKEJJVE1BUENPUkVIRUFERVIpKQotCXsKLQlpZiAoaW5mby0+Ym1pSGVhZGVyLmJpQ2xyVXNlZCkKLQkgIHsKLQkgIGlmIChpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkIDwgKDEgPDwgaW5mby0+Ym1pSGVhZGVyLmJpQml0Q291bnQpKQotCSAgICBvZmZzZXQgPSBpbmZvLT5ibWlIZWFkZXIuYmlDbHJVc2VkICogMzsKLSAgICAgICAgICBlbHNlCi0JICAgIG9mZnNldCA9ICgxIDw8IGluZm8tPmJtaUhlYWRlci5iaUJpdENvdW50KSAqIDM7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0JICBvZmZzZXQgPSAoMSA8PCBpbmZvLT5ibWlIZWFkZXIuYmlCaXRDb3VudCkgKiAzOwotCX0KLSAgICAgIGVsc2UKLQl7Ci0JZnByaW50ZihzdGRlcnIsIlVua25vd24gc2l6ZSBmb3IgQklUTUFQSEVBREVSIGluIE1ldGFGaWxlIVxuIik7Ci0JcmV0dXJuIE5VTEw7Ci0JfQotICAgICAgcmV0dXJuIChMUFNUUilpbmZvICsgaW5mby0+Ym1pSGVhZGVyLmJpU2l6ZSArIG9mZnNldDsgCi19Ci0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICBQbGF5TWV0YUZpbGVSZWNvcmQgICAgICBHREkuMTc2CkBAIC00MzEsNyArMzkwLDYgQEAKICAgICBjYXNlIE1FVEFfU0VUU1RSRVRDSEJMVE1PREU6CiAJU2V0U3RyZXRjaEJsdE1vZGUxNihoZGMsICoobXItPnJkUGFyYW0pKTsKIAlicmVhazsKLQogICAgIGNhc2UgTUVUQV9TRVRURVhUQ09MT1I6CiAJU2V0VGV4dENvbG9yKGhkYywgTUFLRUxPTkcoKihtci0+cmRQYXJhbSksICoobXItPnJkUGFyYW0gKyAxKSkpOwogCWJyZWFrOwpAQCAtNjc1LDkgKzYzMyw4IEBACiAgICAgY2FzZSBNRVRBX1NUUkVUQ0hESUI6CiAgICAgICB7CiAgICAgICAgTFBCSVRNQVBJTkZPIGluZm8gPSAoTFBCSVRNQVBJTkZPKSAmKG1yLT5yZFBhcmFtWzExXSk7Ci0gICAgICAgTFBTVFIgYml0cyA9IE1GX0dldERJQml0c1BvaW50ZXIoaW5mbyk7Ci0gICAgICAgaWYgKGJpdHMpCi0gICAgICAgIFN0cmV0Y2hESUJpdHMxNihoZGMsbXItPnJkUGFyYW1bMTBdLG1yLT5yZFBhcmFtWzldLG1yLT5yZFBhcmFtWzhdLAorICAgICAgIExQU1RSIGJpdHMgPSAoTFBTVFIpaW5mbyArIERJQl9CaXRtYXBJbmZvU2l6ZSggaW5mbywgbXItPnJkUGFyYW1bMl0gKTsKKyAgICAgICBTdHJldGNoRElCaXRzMTYoaGRjLG1yLT5yZFBhcmFtWzEwXSxtci0+cmRQYXJhbVs5XSxtci0+cmRQYXJhbVs4XSwKICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bN10sbXItPnJkUGFyYW1bNl0sbXItPnJkUGFyYW1bNV0sCiAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzRdLG1yLT5yZFBhcmFtWzNdLGJpdHMsaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgbXItPnJkUGFyYW1bMl0sTUFLRUxPTkcobXItPnJkUGFyYW1bMF0sbXItPnJkUGFyYW1bMV0pKTsKQEAgLTY4Nyw5ICs2NDQsOCBAQAogICAgIGNhc2UgTUVUQV9ESUJTVFJFVENIQkxUOgogICAgICAgewogICAgICAgIExQQklUTUFQSU5GTyBpbmZvID0gKExQQklUTUFQSU5GTykgJihtci0+cmRQYXJhbVsxMF0pOyAKLSAgICAgICBMUFNUUiBiaXRzID0gTUZfR2V0RElCaXRzUG9pbnRlcihpbmZvKTsKLSAgICAgICBpZiAoYml0cykKLSAgICAgICAgIFN0cmV0Y2hESUJpdHMxNihoZGMsbXItPnJkUGFyYW1bOV0sbXItPnJkUGFyYW1bOF0sbXItPnJkUGFyYW1bN10sCisgICAgICAgTFBTVFIgYml0cyA9IChMUFNUUilpbmZvICsgRElCX0JpdG1hcEluZm9TaXplKCBpbmZvLCBtci0+cmRQYXJhbVsyXSApOworICAgICAgIFN0cmV0Y2hESUJpdHMxNihoZGMsbXItPnJkUGFyYW1bOV0sbXItPnJkUGFyYW1bOF0sbXItPnJkUGFyYW1bN10sCiAgICAgICAgICAgICAgICAgICAgICAgIG1yLT5yZFBhcmFtWzZdLG1yLT5yZFBhcmFtWzVdLG1yLT5yZFBhcmFtWzRdLAogICAgICAgICAgICAgICAgICAgICAgICBtci0+cmRQYXJhbVszXSxtci0+cmRQYXJhbVsyXSxiaXRzLGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgIERJQl9SR0JfQ09MT1JTLE1BS0VMT05HKG1yLT5yZFBhcmFtWzBdLG1yLT5yZFBhcmFtWzFdKSk7CkBAIC03MjgsNiArNjg0LDMyIEBACiAgICAgICAgRGVsZXRlREMzMihoZGNTcmMpOwkJICAgIAogICAgICAgfQogICAgICAgYnJlYWs7CisjZGVmaW5lIE1FVEFfVU5JTVAoeCkgY2FzZSB4OiBmcHJpbnRmKHN0ZGVyciwiUGxheU1ldGFGaWxlUmVjb3JkOnJlY29yZCB0eXBlICIjeCIgbm90IGltcGxlbWVudGVkLlxuIik7YnJlYWs7CisgICAgTUVUQV9VTklNUChNRVRBX1NFVFRFWFRDSEFSRVhUUkEpCisgICAgTUVUQV9VTklNUChNRVRBX1NFVFRFWFRKVVNUSUZJQ0FUSU9OKQorICAgIE1FVEFfVU5JTVAoTUVUQV9GSUxMUkVHSU9OKQorICAgIE1FVEFfVU5JTVAoTUVUQV9GUkFNRVJFR0lPTikKKyAgICBNRVRBX1VOSU1QKE1FVEFfSU5WRVJUUkVHSU9OKQorICAgIE1FVEFfVU5JTVAoTUVUQV9QQUlOVFJFR0lPTikKKyAgICBNRVRBX1VOSU1QKE1FVEFfU0VMRUNUQ0xJUFJFR0lPTikKKyAgICBNRVRBX1VOSU1QKE1FVEFfRFJBV1RFWFQpCisgICAgTUVUQV9VTklNUChNRVRBX1NFVERJQlRPREVWKQorICAgIE1FVEFfVU5JTVAoTUVUQV9BTklNQVRFUEFMRVRURSkKKyAgICBNRVRBX1VOSU1QKE1FVEFfU0VUUEFMRU5UUklFUykKKyAgICBNRVRBX1VOSU1QKE1FVEFfUkVTSVpFUEFMRVRURSkKKyAgICBNRVRBX1VOSU1QKE1FVEFfRElCQklUQkxUKQorICAgIE1FVEFfVU5JTVAoTUVUQV9ESUJDUkVBVEVQQVRURVJOQlJVU0gpCisgICAgTUVUQV9VTklNUChNRVRBX0VYVEZMT09ERklMTCkKKyAgICBNRVRBX1VOSU1QKE1FVEFfUkVTRVREQykKKyAgICBNRVRBX1VOSU1QKE1FVEFfU1RBUlRET0MpCisgICAgTUVUQV9VTklNUChNRVRBX1NUQVJUUEFHRSkKKyAgICBNRVRBX1VOSU1QKE1FVEFfRU5EUEFHRSkKKyAgICBNRVRBX1VOSU1QKE1FVEFfQUJPUlRET0MpCisgICAgTUVUQV9VTklNUChNRVRBX0VORERPQykKKyAgICBNRVRBX1VOSU1QKE1FVEFfQ1JFQVRFQlJVU0gpCisgICAgTUVUQV9VTklNUChNRVRBX0NSRUFURUJJVE1BUElORElSRUNUKQorICAgIE1FVEFfVU5JTVAoTUVUQV9DUkVBVEVCSVRNQVApCisjdW5kZWYgTUVUQV9VTklNUAogCiAgICAgZGVmYXVsdDoKIAlmcHJpbnRmKHN0ZGRlYiwiUGxheU1ldGFGaWxlUmVjb3JkOiBVbmtub3duIHJlY29yZCB0eXBlICV4XG4iLApAQCAtMTI0Miw4ICsxMjI0LDkgQEAKICAgICBkcHJpbnRmX21ldGFmaWxlKHN0ZGRlYiwiTUZfU3RyZXRjaEJsdFZpYURJQi0+bGVuID0gJWxkICByb3A9JWx4ICBQaXhZUE09JWxkIENhcHM9JWRcbiIsCiAgICAgICAgICAgICAgICBsZW4scm9wLGxwQk1JLT5iaVlQZWxzUGVyTWV0ZXIsR2V0RGV2aWNlQ2FwcyhoZGNTcmMsTE9HUElYRUxTWSkpOwogICAgIGlmIChHZXRESUJpdHMoaGRjU3JjLGRjU3JjLT53LmhCaXRtYXAsMCwoVUlOVClscEJNSS0+YmlIZWlnaHQsCi0gICAgICAgICAgICAgIE1GX0dldERJQml0c1BvaW50ZXIoKExQQklUTUFQSU5GTylscEJNSSksICAgIC8qIERJQiBiaXRzICovCi0gICAgICAgICAgICAgIChMUEJJVE1BUElORk8pbHBCTUksRElCX1JHQl9DT0xPUlMpKSAgICAgICAgIC8qIERJQiBpbmZvIHN0cnVjdHVyZSAqLyAKKyAgICAgICAgICAgICAgICAgIChMUFNUUilscEJNSSArIERJQl9CaXRtYXBJbmZvU2l6ZSggKEJJVE1BUElORk8gKilscEJNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElCX1JHQl9DT0xPUlMgKSwKKyAgICAgICAgICAgICAgICAgIChMUEJJVE1BUElORk8pbHBCTUksIERJQl9SR0JfQ09MT1JTKSkKICNlbHNlCiAgICAgbGVuID0gc2l6ZW9mKE1FVEFSRUNPUkQpICsgMTUgKiBzaXplb2YoSU5UMTYpICsgQk0uYm1XaWR0aEJ5dGVzICogQk0uYm1IZWlnaHQ7CiAgICAgaWYgKCEoaG1yID0gR2xvYmFsQWxsb2MxNihHTUVNX01PVkVBQkxFLCBsZW4pKSkKZGlmZiAtLWdpdCBhL29iamVjdHMvcmVnaW9uLmMgYi9vYmplY3RzL3JlZ2lvbi5jCmluZGV4IDQwZGFlNTQxLi4xOGU4MDhkIDEwMDY0NAotLS0gYS9vYmplY3RzL3JlZ2lvbi5jCisrKyBiL29iamVjdHMvcmVnaW9uLmMKQEAgLTMyMiw4ICszMjIsNDYgQEAKIEhSR04xNiBDcmVhdGVQb2x5UG9seWdvblJnbjE2KCBjb25zdCBQT0lOVDE2ICogcG9pbnRzLCBjb25zdCBJTlQxNiAqIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IG5icG9seWdvbnMsIElOVDE2IG1vZGUgKQogeworICAgIGludAkJaSxucm9mcHRzOworICAgIExQSU5UMzIJY291bnQzMjsKKyAgICBMUFBPSU5UMzIJcG9pbnRzMzI7CisgICAgSFJHTjMyCXJldDsKKworICAgIG5yb2ZwdHM9MDsKKyAgICBmb3IgKGk9bmJwb2x5Z29ucztpLS07KQorCW5yb2ZwdHMrPWNvdW50W2ldOworICAgIHBvaW50czMyID0gKExQUE9JTlQzMilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnJvZnB0cypzaXplb2YoUE9JTlQzMikgKTsKKyAgICBmb3IgKGk9bnJvZnB0cztpLS07KQorICAgIAlDT05WX1BPSU5UMTZUTzMyKCAmKHBvaW50c1tpXSksICYocG9pbnRzMzJbaV0pICk7CisgICAgY291bnQzMiA9IChMUElOVDMyKUhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKElOVDMyKSpuYnBvbHlnb25zICk7CisgICAgZm9yIChpPW5icG9seWdvbnM7aS0tOykKKyAgICAJY291bnQzMltpXT1jb3VudFtpXTsKKyAgICByZXQgPSBDcmVhdGVQb2x5UG9seWdvblJnbjMyKHBvaW50czMyLGNvdW50MzIsbmJwb2x5Z29ucyxtb2RlKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY291bnQzMiApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwb2ludHMzMiApOworICAgIHJldHVybiByZXQ7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlUG9seWdvblJnbjMyICAgIChHREkzMi41OCkKKyAqLworSFJHTjMyIENyZWF0ZVBvbHlnb25SZ24zMiggY29uc3QgUE9JTlQzMiAqcG9pbnRzLCBJTlQzMiBjb3VudCwgSU5UMzIgbW9kZSApCit7CisgICAgcmV0dXJuIENyZWF0ZVBvbHlQb2x5Z29uUmduMzIoIHBvaW50cywgJmNvdW50LCAxLCBtb2RlICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQ3JlYXRlUG9seVBvbHlnb25SZ24zMiAgICAoR0RJMzIuNTcpCisgKi8KK0hSR04zMiBDcmVhdGVQb2x5UG9seWdvblJnbjMyKCBjb25zdCBQT0lOVDMyICogcG9pbnRzLCBjb25zdCBJTlQzMiAqIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIG5icG9seWdvbnMsIElOVDMyIG1vZGUgKQorewogICAgIFJHTk9CSiAqIG9iajsKLSAgICBIUkdOMTYgaHJnbjsKKyAgICBIUkdOMzIgaHJnbjsKICAgICBpbnQgaSwgaiwgbWF4UG9pbnRzOwogICAgIFhQb2ludCAqeHBvaW50cywgKnB0OwogICAgIFJlZ2lvbiB4cmduOwpAQCAtMzM0LDE0ICszNzIsMTUgQEAKICAgICBmb3IgKGkgPSBtYXhQb2ludHMgPSAwOyBpIDwgbmJwb2x5Z29uczsgaSsrKQogCWlmIChtYXhQb2ludHMgPCBjb3VudFtpXSkgbWF4UG9pbnRzID0gY291bnRbaV07CiAgICAgaWYgKCFtYXhQb2ludHMpIHJldHVybiAwOwotICAgIGlmICghKHhwb2ludHMgPSAoWFBvaW50ICopIG1hbGxvYyggc2l6ZW9mKFhQb2ludCkgKiBtYXhQb2ludHMgKSkpCi0JcmV0dXJuIDA7CisgICAgaWYgKCEoeHBvaW50cyA9IChYUG9pbnQgKilIZWFwQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihYUG9pbnQpICogbWF4UG9pbnRzICkpKQorICAgICAgICByZXR1cm4gMDsKIAogICAgICAgLyogQWxsb2NhdGUgcmVnaW9uICovCiAKICAgICBpZiAoIShocmduID0gR0RJX0FsbG9jT2JqZWN0KCBzaXplb2YoUkdOT0JKKSwgUkVHSU9OX01BR0lDICkpKQogICAgIHsKLQlmcmVlKCB4cG9pbnRzICk7CisJSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIHhwb2ludHMgKTsKIAlyZXR1cm4gMDsKICAgICB9CiAgICAgb2JqID0gKFJHTk9CSiAqKSBHRElfSEVBUF9MSU5fQUREUiggaHJnbiApOwpAQCAtMzYzLDcgKzQwMiw3IEBACiAJaWYgKCF4cmduKQogICAgICAgICB7CiAgICAgICAgICAgICBpZiAob2JqLT54cmduKSBYRGVzdHJveVJlZ2lvbiggb2JqLT54cmduICk7Ci0gICAgICAgICAgICBmcmVlKCB4cG9pbnRzICk7CisgICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgeHBvaW50cyApOwogICAgICAgICAgICAgR0RJX0ZyZWVPYmplY3QoIGhyZ24gKTsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC0zNzgsNyArNDE3LDcgQEAKIAllbHNlIG9iai0+eHJnbiA9IHhyZ247CiAgICAgfQogCi0gICAgZnJlZSggeHBvaW50cyApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB4cG9pbnRzICk7CiAgICAgcmV0dXJuIGhyZ247CiB9CiAKZGlmZiAtLWdpdCBhL29iamVjdHMvdGV4dC5jIGIvb2JqZWN0cy90ZXh0LmMKaW5kZXggZTU5NzdjNC4uZDE3OGEzNSAxMDA2NDQKLS0tIGEvb2JqZWN0cy90ZXh0LmMKKysrIGIvb2JqZWN0cy90ZXh0LmMKQEAgLTYsMTMgKzYsMTAgQEAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8WDExL1hhdG9tLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImRjLmgiCiAjaW5jbHVkZSAiZ2RpLmgiCi0jaW5jbHVkZSAiY2FsbGJhY2suaCIKICNpbmNsdWRlICJoZWFwLmgiCi0jaW5jbHVkZSAibWV0YWZpbGUuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogLyogI2RlZmluZSBERUJVR19URVhUICovCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTMxLDkgKzI4LDYgQEAKIHN0YXRpYyBpbnQgc3BhY2V3aWR0aDsKIHN0YXRpYyBpbnQgcHJlZml4X29mZnNldDsKIAotZXh0ZXJuIGludCBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggREMgKiBkYywgc2hvcnQgbGVmdCwgc2hvcnQgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCByaWdodCwgc2hvcnQgYm90dG9tLCBVSU5UMTYgZmxhZ3MpOwotCiBzdGF0aWMgY29uc3QgY2hhciAqVEVYVF9OZXh0TGluZSggSERDMTYgaGRjLCBjb25zdCBjaGFyICpzdHIsIGludCAqY291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgaW50ICpsZW4sIGludCB3aWR0aCwgV09SRCBmb3JtYXQpCiB7CkBAIC0zMjYsMjQwICszMjAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFQ1QxNiAqbHByZWN0LCBMUENTVFIgc3RyLCBVSU5UMTYgY291bnQsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJTlQxNiAqbHBEeCApCiB7Ci0gICAgSFJHTjMyCWhSZ25DbGlwID0gMDsKLSAgICBpbnQgCWRpciwgYXNjZW50LCBkZXNjZW50LCBpOwotICAgIFhDaGFyU3RydWN0IGluZm87Ci0gICAgWEZvbnRTdHJ1Y3QgKmZvbnQ7Ci0gICAgUkVDVDE2IAlyZWN0OworICAgIEJPT0wzMglyZXQ7CisgICAgaW50CQlpOworICAgIFJFQ1QzMglyZWN0MzI7CisgICAgTFBJTlQzMglscGR4MzIgPSBscER4PyhMUElOVDMyKXhtYWxsb2Moc2l6ZW9mKElOVDMyKSpjb3VudCk6TlVMTDsKIAotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoIGhkYywgTUVUQUZJTEVfRENfTUFHSUMgKTsKLQlpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0JTUZfRXh0VGV4dE91dCggZGMsIHgsIHksIGZsYWdzLCBscHJlY3QsIHN0ciwgY291bnQsIGxwRHggKTsKLQlyZXR1cm4gVFJVRTsKLSAgICB9CisgICAgaWYgKGxwcmVjdCkJQ09OVl9SRUNUMTZUTzMyKGxwcmVjdCwmcmVjdDMyKTsKKyAgICBpZiAobHBkeDMyKQlmb3IgKGk9Y291bnQ7aS0tOykgbHBkeDMyW2ldPWxwRHhbaV07CisgICAgcmV0ID0gRXh0VGV4dE91dDMyQShoZGMseCx5LGZsYWdzLGxwcmVjdD8mcmVjdDMyOk5VTEwsc3RyLGNvdW50LGxwZHgzMik7CisgICAgaWYgKGxwZHgzMikgZnJlZShscGR4MzIpOworICAgIHJldHVybiByZXQ7CiAKLSAgICBpZiAoIURDX1NldHVwR0NGb3JUZXh0KCBkYyApKSByZXR1cm4gVFJVRTsKLSAgICBmb250ID0gZGMtPnUueC5mb250LmZzdHJ1Y3Q7CiAKLSAgICBkcHJpbnRmX3RleHQoc3RkZGViLCJFeHRUZXh0T3V0OiBoZGM9JTA0eCAlZCwlZCAnJSouKnMnLCAlZCAgZmxhZ3M9JWRcbiIsCi0gICAgICAgICAgICBoZGMsIHgsIHksIGNvdW50LCBjb3VudCwgc3RyLCBjb3VudCwgZmxhZ3MpOwotICAgIGlmIChscHJlY3QgIT0gTlVMTCkgZHByaW50Zl90ZXh0KHN0ZGRlYiwgIlx0cmVjdD0oJWQsJWQtICVkLCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscHJlY3QtPmxlZnQsIGxwcmVjdC0+dG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwcmVjdC0+cmlnaHQsIGxwcmVjdC0+Ym90dG9tICk7Ci0KLSAgICAgIC8qIFNldHVwIGNvb3JkaW5hdGVzICovCi0KLSAgICBpZiAoZGMtPncudGV4dEFsaWduICYgVEFfVVBEQVRFQ1ApCi0gICAgewotCXggPSBkYy0+dy5DdXJzUG9zWDsKLQl5ID0gZGMtPncuQ3Vyc1Bvc1k7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgKEVUT19PUEFRVUUgfCBFVE9fQ0xJUFBFRCkpICAvKiB0aGVyZSdzIGEgcmVjdGFuZ2xlICovCi0gICAgewotICAgICAgICBpZiAoIWxwcmVjdCkgIC8qIG5vdCBhbHdheXMgKi8KLSAgICAgICAgewotICAgICAgICAgICAgU0laRTE2IHN6OwotICAgICAgICAgICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpICAvKiBDYW4ndCBjbGlwIHdpdGggbm8gcmVjdGFuZ2xlICovCi0JICAgICAgcmV0dXJuIEZBTFNFOwotCSAgICBpZiAoIUdldFRleHRFeHRlbnRQb2ludDE2KCBoZGMsIHN0ciwgY291bnQsICZzeiApKQotCSAgICAgIHJldHVybiBGQUxTRTsKLQkgICAgcmVjdC5sZWZ0ICAgPSBYTFBUT0RQKCBkYywgeCApOwotCSAgICByZWN0LnJpZ2h0ICA9IFhMUFRPRFAoIGRjLCB4K3N6LmN4ICk7Ci0JICAgIHJlY3QudG9wICAgID0gWUxQVE9EUCggZGMsIHkgKTsKLQkgICAgcmVjdC5ib3R0b20gPSBZTFBUT0RQKCBkYywgeStzei5jeSApOwotCX0KLQllbHNlCi0JewotCSAgICByZWN0LmxlZnQgICA9IFhMUFRPRFAoIGRjLCBscHJlY3QtPmxlZnQgKTsKLQkgICAgcmVjdC5yaWdodCAgPSBYTFBUT0RQKCBkYywgbHByZWN0LT5yaWdodCApOwotCSAgICByZWN0LnRvcCAgICA9IFlMUFRPRFAoIGRjLCBscHJlY3QtPnRvcCApOwotCSAgICByZWN0LmJvdHRvbSA9IFlMUFRPRFAoIGRjLCBscHJlY3QtPmJvdHRvbSApOwotCX0KLQlpZiAocmVjdC5yaWdodCA8IHJlY3QubGVmdCkgU1dBUF9JTlQoIHJlY3QubGVmdCwgcmVjdC5yaWdodCApOwotCWlmIChyZWN0LmJvdHRvbSA8IHJlY3QudG9wKSBTV0FQX0lOVCggcmVjdC50b3AsIHJlY3QuYm90dG9tICk7Ci0gICAgfQotCi0gICAgeCA9IFhMUFRPRFAoIGRjLCB4ICk7Ci0gICAgeSA9IFlMUFRPRFAoIGRjLCB5ICk7Ci0KLSAgICBkcHJpbnRmX3RleHQoc3RkZGViLCJcdHJlYWwgY29vcmQ6IHg9JWksIHk9JWksIHJlY3Q9KCVkLCVkLSVkLCVkKVxuIiwKLQkJCSAgeCwgeSwgcmVjdC5sZWZ0LCByZWN0LnRvcCwgcmVjdC5yaWdodCwgcmVjdC5ib3R0b20pOwotCi0gICAgICAvKiBEcmF3IHRoZSByZWN0YW5nbGUgKi8KLQotICAgIGlmIChmbGFncyAmIEVUT19PUEFRVUUpCi0gICAgewotICAgICAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgZGMtPncuYmFja2dyb3VuZFBpeGVsICk7Ci0gICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmVjdC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyByZWN0LnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QucmlnaHQtcmVjdC5sZWZ0LCByZWN0LmJvdHRvbS1yZWN0LnRvcCApOwotICAgIH0KLSAgICBpZiAoIWNvdW50KSByZXR1cm4gVFJVRTsgIC8qIE5vdGhpbmcgbW9yZSB0byBkbyAqLwotCi0gICAgICAvKiBDb21wdXRlIHRleHQgc3RhcnRpbmcgcG9zaXRpb24gKi8KLQotICAgIFhUZXh0RXh0ZW50cyggZm9udCwgc3RyLCBjb3VudCwgJmRpciwgJmFzY2VudCwgJmRlc2NlbnQsICZpbmZvICk7Ci0KLSAgICBpZiAobHBEeCkgLyogaGF2ZSBleHBsaWNpdCBjaGFyYWN0ZXIgY2VsbCB4IG9mZnNldHMgKi8KLSAgICB7Ci0JLyogc3VtIGxwRHggYXJyYXkgYW5kIGFkZCB0aGUgd2lkdGggb2YgbGFzdCBjaGFyYWN0ZXIgKi8KLQotICAgICAgICBpbmZvLndpZHRoID0gWFRleHRXaWR0aCggZm9udCwgc3RyICsgY291bnQgLSAxLCAxKSArIGRjLT53LmNoYXJFeHRyYTsKLSAgICAgICAgaWYgKHN0cltjb3VudC0xXSA9PSAoY2hhcilkYy0+dS54LmZvbnQubWV0cmljcy50bUJyZWFrQ2hhcikKLSAgICAgICAgICAgIGluZm8ud2lkdGggKz0gZGMtPncuYnJlYWtFeHRyYTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgaW5mby53aWR0aCArPSBscER4W2ldOwotICAgIH0KLSAgICBlbHNlCi0gICAgICAgaW5mby53aWR0aCArPSBjb3VudCpkYy0+dy5jaGFyRXh0cmEgKyBkYy0+dy5icmVha0V4dHJhKmRjLT53LmJyZWFrQ291bnQ7Ci0KLSAgICBzd2l0Y2goIGRjLT53LnRleHRBbGlnbiAmIChUQV9MRUZUIHwgVEFfUklHSFQgfCBUQV9DRU5URVIpICkKLSAgICB7Ci0gICAgICBjYXNlIFRBX0xFRlQ6Ci0gCSAgaWYgKGRjLT53LnRleHRBbGlnbiAmIFRBX1VQREFURUNQKQotCSAgICAgIGRjLT53LkN1cnNQb3NYID0gWERQVE9MUCggZGMsIHggKyBpbmZvLndpZHRoICk7Ci0JICBicmVhazsKLSAgICAgIGNhc2UgVEFfUklHSFQ6Ci0JICB4IC09IGluZm8ud2lkdGg7Ci0JICBpZiAoZGMtPncudGV4dEFsaWduICYgVEFfVVBEQVRFQ1ApIGRjLT53LkN1cnNQb3NYID0gWERQVE9MUCggZGMsIHggKTsKLQkgIGJyZWFrOwotICAgICAgY2FzZSBUQV9DRU5URVI6Ci0JICB4IC09IGluZm8ud2lkdGggLyAyOwotCSAgYnJlYWs7Ci0gICAgfQotCi0gICAgc3dpdGNoKCBkYy0+dy50ZXh0QWxpZ24gJiAoVEFfVE9QIHwgVEFfQk9UVE9NIHwgVEFfQkFTRUxJTkUpICkKLSAgICB7Ci0gICAgICBjYXNlIFRBX1RPUDoKLQkgIHkgKz0gZm9udC0+YXNjZW50OwotCSAgYnJlYWs7Ci0gICAgICBjYXNlIFRBX0JPVFRPTToKLQkgIHkgLT0gZm9udC0+ZGVzY2VudDsKLQkgIGJyZWFrOwotICAgICAgY2FzZSBUQV9CQVNFTElORToKLQkgIGJyZWFrOwotICAgIH0KLQotICAgICAgLyogU2V0IHRoZSBjbGlwIHJlZ2lvbiAqLwotCi0gICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpCi0gICAgewotICAgICAgICBoUmduQ2xpcCA9IGRjLT53LmhDbGlwUmduOwotICAgICAgICBDTElQUElOR19JbnRlcnNlY3RDbGlwUmVjdCggZGMsIHJlY3QubGVmdCwgcmVjdC50b3AsIHJlY3QucmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN0LmJvdHRvbSwgQ0xJUF9JTlRFUlNFQ1R8Q0xJUF9LRUVQUkdOICk7Ci0gICAgfQotCi0gICAgICAvKiBEcmF3IHRoZSB0ZXh0IGJhY2tncm91bmQgaWYgbmVjZXNzYXJ5ICovCi0KLSAgICBpZiAoZGMtPncuYmFja2dyb3VuZE1vZGUgIT0gVFJBTlNQQVJFTlQpCi0gICAgewotICAgICAgICAgIC8qIElmIHJlY3RhbmdsZSBpcyBvcGFxdWUgYW5kIGNsaXBwZWQsIGRvIG5vdGhpbmcgKi8KLSAgICAgICAgaWYgKCEoZmxhZ3MgJiBFVE9fQ0xJUFBFRCkgfHwgIShmbGFncyAmIEVUT19PUEFRVUUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAgIC8qIE9ubHkgZHJhdyBpZiByZWN0YW5nbGUgaXMgbm90IG9wYXF1ZSBvciBpZiBzb21lICovCi0gICAgICAgICAgICAgIC8qIHRleHQgaXMgb3V0c2lkZSB0aGUgcmVjdGFuZ2xlICovCi0gICAgICAgICAgICBpZiAoIShmbGFncyAmIEVUT19PUEFRVUUpIHx8Ci0gICAgICAgICAgICAgICAgKHggPCByZWN0LmxlZnQpIHx8Ci0gICAgICAgICAgICAgICAgKHggKyBpbmZvLndpZHRoID49IHJlY3QucmlnaHQpIHx8Ci0gICAgICAgICAgICAgICAgKHktZm9udC0+YXNjZW50IDwgcmVjdC50b3ApIHx8Ci0gICAgICAgICAgICAgICAgKHkrZm9udC0+ZGVzY2VudCA+PSByZWN0LmJvdHRvbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LmJhY2tncm91bmRQaXhlbCApOwotICAgICAgICAgICAgICAgIFhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyB4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB5IC0gZm9udC0+YXNjZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLndpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250LT5hc2NlbnQgKyBmb250LT5kZXNjZW50ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyogRHJhdyB0aGUgdGV4dCAoY291bnQgPiAwIHZlcmlmaWVkKSAqLwotCi0gICAgWFNldEZvcmVncm91bmQoIGRpc3BsYXksIGRjLT51LnguZ2MsIGRjLT53LnRleHRQaXhlbCApOwotICAgIGlmICghZGMtPncuY2hhckV4dHJhICYmICFkYy0+dy5icmVha0V4dHJhICYmICFscER4KQotICAgIHsKLSAgICAgICAgWERyYXdTdHJpbmcoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAotICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSwgc3RyLCBjb3VudCApOwotICAgIH0KLSAgICBlbHNlICAvKiBOb3cgdGhlIGZ1biBiZWdpbnMuLi4gKi8KLSAgICB7Ci0gICAgICAgIFhUZXh0SXRlbSAqaXRlbXMsICpwaXRlbTsKLQlpbnQgZGVsdGE7Ci0KLQkvKiBhbGxvY2F0ZSBtYXggaXRlbXMgKi8KLQotICAgICAgICBwaXRlbSA9IGl0ZW1zID0geG1hbGxvYyggY291bnQgKiBzaXplb2YoWFRleHRJdGVtKSApOwotICAgICAgICBkZWx0YSA9IGkgPSAwOwotICAgICAgICB3aGlsZSAoaSA8IGNvdW50KQotICAgICAgICB7Ci0JICAgIC8qIGluaXRpYWxpemUgdGV4dCBpdGVtIHdpdGggYWNjdW11bGF0ZWQgZGVsdGEgKi8KLQotICAgICAgICAgICAgcGl0ZW0tPmNoYXJzICA9IChjaGFyICopc3RyICsgaTsKLQkgICAgcGl0ZW0tPmRlbHRhICA9IGRlbHRhOyAKLSAgICAgICAgICAgIHBpdGVtLT5uY2hhcnMgPSAwOwotICAgICAgICAgICAgcGl0ZW0tPmZvbnQgICA9IE5vbmU7Ci0gICAgICAgICAgICBkZWx0YSA9IDA7Ci0KLQkgICAgLyogc3R1ZmYgY2hhcmFjdGVycyBpbnRvIHRoZSBzYW1lIFhUZXh0SXRlbSB1bnRpbCBuZXcgZGVsdGEgCi0JICAgICAqIGJlY29tZXMgIG5vbi16ZXJvICovCi0KLQkgICAgZG8KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobHBEeCkgZGVsdGEgKz0gbHBEeFtpXSAtIFhUZXh0V2lkdGgoIGZvbnQsIHN0ciArIGksIDEpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IGRjLT53LmNoYXJFeHRyYTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cltpXSA9PSAoY2hhcilkYy0+dS54LmZvbnQubWV0cmljcy50bUJyZWFrQ2hhcikKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9IGRjLT53LmJyZWFrRXh0cmE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBpdGVtLT5uY2hhcnMrKzsKLSAgICAgICAgICAgIH0gCi0JICAgIHdoaWxlICgoKytpIDwgY291bnQpICYmICFkZWx0YSk7Ci0gICAgICAgICAgICBwaXRlbSsrOwotICAgICAgICB9Ci0KLSAgICAgICAgWERyYXdUZXh0KCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHgsIGRjLT53LkRDT3JnWSArIHksIGl0ZW1zLCBwaXRlbSAtIGl0ZW1zICk7Ci0gICAgICAgIGZyZWUoIGl0ZW1zICk7Ci0gICAgfQotCi0gICAgICAvKiBEcmF3IHVuZGVybGluZSBhbmQgc3RyaWtlLW91dCBpZiBuZWVkZWQgKi8KLQotICAgIGlmIChkYy0+dS54LmZvbnQubWV0cmljcy50bVVuZGVybGluZWQpCi0gICAgewotCWxvbmcgbGluZVBvcywgbGluZVdpZHRoOyAgICAgICAKLQlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9QT1NJVElPTiwgJmxpbmVQb3MgKSkKLQkgICAgbGluZVBvcyA9IGZvbnQtPmRlc2NlbnQtMTsKLQlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1VOREVSTElORV9USElDS05FU1MsICZsaW5lV2lkdGggKSkKLQkgICAgbGluZVdpZHRoID0gMDsKLQllbHNlIGlmIChsaW5lV2lkdGggPT0gMSkgbGluZVdpZHRoID0gMDsKLQlYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVXaWR0aCwKLQkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCi0gICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJICAgZGMtPncuRENPcmdYICsgeCwgZGMtPncuRENPcmdZICsgeSArIGxpbmVQb3MsCi0JCSAgIGRjLT53LkRDT3JnWCArIHggKyBpbmZvLndpZHRoLCBkYy0+dy5EQ09yZ1kgKyB5ICsgbGluZVBvcyApOwotICAgIH0KLSAgICBpZiAoZGMtPnUueC5mb250Lm1ldHJpY3MudG1TdHJ1Y2tPdXQpCi0gICAgewotCWxvbmcgbGluZUFzY2VudCwgbGluZURlc2NlbnQ7Ci0JaWYgKCFYR2V0Rm9udFByb3BlcnR5KCBmb250LCBYQV9TVFJJS0VPVVRfQVNDRU5ULCAmbGluZUFzY2VudCApKQotCSAgICBsaW5lQXNjZW50ID0gZm9udC0+YXNjZW50IC8gMzsKLQlpZiAoIVhHZXRGb250UHJvcGVydHkoIGZvbnQsIFhBX1NUUklLRU9VVF9ERVNDRU5ULCAmbGluZURlc2NlbnQgKSkKLQkgICAgbGluZURlc2NlbnQgPSAtbGluZUFzY2VudDsKLQlYU2V0TGluZUF0dHJpYnV0ZXMoIGRpc3BsYXksIGRjLT51LnguZ2MsIGxpbmVBc2NlbnQgKyBsaW5lRGVzY2VudCwKLQkJCSAgICBMaW5lU29saWQsIENhcFJvdW5kLCBKb2luQmV2ZWwgKTsgCi0JWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICBkYy0+dy5EQ09yZ1ggKyB4LCBkYy0+dy5EQ09yZ1kgKyB5IC0gbGluZUFzY2VudCwKLQkJICAgZGMtPncuRENPcmdYICsgeCArIGluZm8ud2lkdGgsIGRjLT53LkRDT3JnWSArIHkgLSBsaW5lQXNjZW50ICk7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRVRPX0NMSVBQRUQpIFNlbGVjdENsaXBSZ24zMiggaGRjLCBoUmduQ2xpcCApOwotICAgIHJldHVybiBUUlVFOwogfQogCiAKQEAgLTU3MCwxNSArMzQyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSRUNUMzIgKmxwcmVjdCwgTFBDU1RSIHN0ciwgVUlOVDMyIGNvdW50LAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElOVDMyICpscER4ICkKIHsKLSAgICBSRUNUMTYgcmVjdDE2OwotCi0gICAgaWYgKGxwRHgpIGZwcmludGYoIHN0ZGVyciwgIkV4dFRleHRPdXQzMkE6IGxwRHggbm90IGltcGxlbWVudGVkXG4iICk7Ci0gICAgaWYgKCFscHJlY3QpCi0gICAgICAgIHJldHVybiBFeHRUZXh0T3V0MTYoIChIREMxNiloZGMsIChJTlQxNil4LCAoSU5UMTYpeSwgKFVJTlQxNilmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgc3RyLCAoVUlOVDE2KWNvdW50LCBOVUxMICk7Ci0gICAgQ09OVl9SRUNUMzJUTzE2KCBscHJlY3QsICZyZWN0MTYgKTsKLSAgICByZXR1cm4gRXh0VGV4dE91dDE2KCAoSERDMTYpaGRjLCAoSU5UMTYpeCwgKElOVDE2KXksIChVSU5UMTYpZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3QxNiwgc3RyLCAoVUlOVDE2KWNvdW50LCBOVUxMICk7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wRXh0VGV4dE91dCAmJiAKKyAgICAJICAgZGMtPmZ1bmNzLT5wRXh0VGV4dE91dChkYyx4LHksZmxhZ3MsbHByZWN0LHN0cixjb3VudCxscER4KTsKIH0KIAogCmRpZmYgLS1naXQgYS9yYy9NYWtlZmlsZS5pbiBiL3JjL01ha2VmaWxlLmluCmluZGV4IDdlMTlmOTkuLjM2ZjA0ZTIgMTAwNjQ0Ci0tLSBhL3JjL01ha2VmaWxlLmluCisrKyBiL3JjL01ha2VmaWxlLmluCkBAIC0zLDcgKzMsNyBAQAogVE9QT0JKRElSID0gLi4KIFNSQ0RJUiAgICA9IEBzcmNkaXJACiBWUEFUSCAgICAgPSBAc3JjZGlyQAotUFJPR1JBTVMgID0gd2luZXJjCitQUk9HUkFNUyAgPSB3aW5lcmNAUFJPR0VYVEAKIE1PRFVMRSAgICA9IG5vbmUKIAogQ19TUkNTICAgICA9IHdpbmVyYy5jCkBAIC0xNCw3ICsxNCw3IEBACiBATUFLRV9SVUxFU0AKIAogJChQUk9HUkFNUyk6ICQoT0JKUykKLQkkKENDKSAkKENGTEFHUykgLW8gd2luZXJjICQoT0JKUykgJChMRVhMSUIpCisJJChDQykgJChDRkxBR1MpIC1vIHdpbmVyY0BQUk9HRVhUQCAkKE9CSlMpICQoTEVYTElCKQogCiB5LnRhYi5jIHkudGFiLmg6IHBhcnNlci55CiAJJChZQUNDKSAtZCAtdCAkKFNSQ0RJUikvcGFyc2VyLnkKZGlmZiAtLWdpdCBhL3NjaGVkdWxlci9wcm9jZXNzLmMgYi9zY2hlZHVsZXIvcHJvY2Vzcy5jCmluZGV4IGMyMjU1MzEuLmE3ZTE5OTEgMTAwNjQ0Ci0tLSBhL3NjaGVkdWxlci9wcm9jZXNzLmMKKysrIGIvc2NoZWR1bGVyL3Byb2Nlc3MuYwpAQCAtNSw3ICs1LDExIEBACiAgKi8KIAogI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSAicHJvY2Vzcy5oIgorI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJoZWFwLmgiCiAjaW5jbHVkZSAidGFzay5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCkBAIC0yMzQsMTAgKzIzOCw1NCBAQAogfQogCiAKK3N0YXRpYyBpbnQgcHN0cl9jbXAoIGNvbnN0IHZvaWQgKnBzMSwgY29uc3Qgdm9pZCAqcHMyICkKK3sKKyAgICByZXR1cm4gbHN0cmNtcGkzMkEoICooTFBTVFIgKilwczEsICooTFBTVFIgKilwczIgKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgUFJPQ0VTU19GaWxsRW52REIKKyAqLworc3RhdGljIEJPT0wzMiBQUk9DRVNTX0ZpbGxFbnZEQiggUERCMzIgKnBkYiwgVERCICpwVGFzayApCit7CisgICAgTFBTVFIgcCwgZW52OworICAgIElOVDMyIGNvdW50ID0gMDsKKyAgICBMUFNUUiAqcHAsICphcnJheSA9IE5VTEw7CisKKyAgICAvKiBDb3B5IHRoZSBXaW4xNiBlbnZpcm9ubWVudCwgc29ydGluZyBpdCBpbiB0aGUgcHJvY2VzcyAqLworCisgICAgZW52ID0gcCA9IEdsb2JhbExvY2sxNiggcFRhc2stPnBkYi5lbnZpcm9ubWVudCApOworICAgIGZvciAocCA9IGVudjsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgY291bnQrKzsKKyAgICBwZGItPmVudl9kYi0+ZW52X3NpemUgPSAocCAtIGVudikgKyAxOworICAgIHBkYi0+ZW52X2RiLT5lbnZpcm9uID0gSGVhcEFsbG9jKCBwZGItPmhlYXAsIDAsIHBkYi0+ZW52X2RiLT5lbnZfc2l6ZSApOworICAgIGlmICghcGRiLT5lbnZfZGItPmVudmlyb24pIGdvdG8gZXJyb3I7CisgICAgaWYgKCEoYXJyYXkgPSBIZWFwQWxsb2MoIHBkYi0+aGVhcCwgMCwgY291bnQgKiBzaXplb2YoYXJyYXlbMF0pICkpKQorICAgICAgICBnb3RvIGVycm9yOworICAgIGZvciAocCA9IGVudiwgcHAgPSBhcnJheTsgKnA7IHAgKz0gc3RybGVuKHApICsgMSkgKnBwKysgPSBwOworICAgIHFzb3J0KCBhcnJheSwgY291bnQsIHNpemVvZihMUFNUUiksIHBzdHJfY21wICk7CisgICAgcCA9IHBkYi0+ZW52X2RiLT5lbnZpcm9uOworICAgIGZvciAocHAgPSBhcnJheTsgY291bnQ7IGNvdW50LS0sIHBwKyspCisgICAgeworICAgICAgICBzdHJjcHkoIHAsICpwcCApOworICAgICAgICBwICs9IHN0cmxlbihwKSArIDE7CisgICAgfQorICAgICpwID0gJ1wwJzsKKyAgICBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBhcnJheSApOworICAgIGFycmF5ID0gTlVMTDsKKworICAgIHJldHVybiBUUlVFOworCitlcnJvcjoKKyAgICBpZiAoYXJyYXkpIEhlYXBGcmVlKCBwZGItPmhlYXAsIDAsIGFycmF5ICk7CisgICAgaWYgKHBkYi0+ZW52X2RiLT5lbnZpcm9uKSBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBwZGItPmVudl9kYi0+ZW52aXJvbiApOworICAgIHJldHVybiBGQUxTRTsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBQUk9DRVNTX0NyZWF0ZQogICovCi1QREIzMiAqUFJPQ0VTU19DcmVhdGUodm9pZCkKK1BEQjMyICpQUk9DRVNTX0NyZWF0ZSggVERCICpwVGFzayApCiB7CiAgICAgUERCMzIgKnBkYiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgSEVBUF9aRVJPX01FTU9SWSwgc2l6ZW9mKFBEQjMyKSApOwogICAgIGlmICghcGRiKSByZXR1cm4gTlVMTDsKQEAgLTI1MSwxNiArMjk5LDE3IEBACiAgICAgcGRiLT5wYXJlbnQgICAgICAgICAgPSBwQ3VycmVudFByb2Nlc3M7CiAgICAgcGRiLT5ncm91cCAgICAgICAgICAgPSBwZGI7CiAgICAgcGRiLT5wcmlvcml0eSAgICAgICAgPSA4OyAgLyogTm9ybWFsICovCisgICAgcGRiLT5oZWFwX2xpc3QgICAgICAgPSBwZGItPmhlYXA7CiAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+Y3JpdF9zZWN0aW9uICk7CiAgICAgaWYgKCEocGRiLT5oZWFwID0gSGVhcENyZWF0ZSggSEVBUF9HUk9XQUJMRSwgMHgxMDAwMCwgMCApKSkgZ290byBlcnJvcjsKLSAgICBpZiAoIShwZGItPmVudl9EQiA9IEhlYXBBbGxvYyhwZGItPmhlYXAsIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihFTlZEQikpKSkKKyAgICBpZiAoIShwZGItPmVudl9kYiA9IEhlYXBBbGxvYyhwZGItPmhlYXAsIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihFTlZEQikpKSkKICAgICAgICAgZ290byBlcnJvcjsKICAgICBpZiAoIShwZGItPmhhbmRsZV90YWJsZSA9IFBST0NFU1NfQWxsb2NIYW5kbGVUYWJsZSggcGRiICkpKSBnb3RvIGVycm9yOwotICAgIHBkYi0+aGVhcF9saXN0ICAgICAgID0gcGRiLT5oZWFwOworICAgIGlmICghUFJPQ0VTU19GaWxsRW52REIoIHBkYiwgcFRhc2sgKSkgZ290byBlcnJvcjsKICAgICByZXR1cm4gcGRiOwogCiBlcnJvcjoKLSAgICBpZiAocGRiLT5lbnZfREIpIEhlYXBGcmVlKCBwZGItPmhlYXAsIDAsIHBkYi0+ZW52X0RCICk7CisgICAgaWYgKHBkYi0+ZW52X2RiKSBIZWFwRnJlZSggcGRiLT5oZWFwLCAwLCBwZGItPmVudl9kYiApOwogICAgIGlmIChwZGItPmhhbmRsZV90YWJsZSkgSGVhcEZyZWUoIHBkYi0+c3lzdGVtX2hlYXAsIDAsIHBkYi0+aGFuZGxlX3RhYmxlICk7CiAgICAgaWYgKHBkYi0+aGVhcCkgSGVhcERlc3Ryb3koIHBkYi0+aGVhcCApOwogICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJnBkYi0+Y3JpdF9zZWN0aW9uICk7CkBAIC0yODUsNyArMzM0LDcgQEAKICAgICAvKiBGcmVlIGV2ZXJ5dGhpbmcgKi8KIAogICAgIHB0ci0+dHlwZSA9IEszMk9CSl9VTktOT1dOOwotICAgIEhlYXBGcmVlKCBwZGItPmhlYXAsIDAsIHBkYi0+ZW52X0RCICk7CisgICAgSGVhcEZyZWUoIHBkYi0+aGVhcCwgMCwgcGRiLT5lbnZfZGIgKTsKICAgICBIZWFwRnJlZSggcGRiLT5zeXN0ZW1faGVhcCwgMCwgcGRiLT5oYW5kbGVfdGFibGUgKTsKICAgICBIZWFwRGVzdHJveSggcGRiLT5oZWFwICk7CiAgICAgRGVsZXRlQ3JpdGljYWxTZWN0aW9uKCAmcGRiLT5jcml0X3NlY3Rpb24gKTsKQEAgLTMyMSw2ICszNzAsMTc4IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgIEdldEVudmlyb25tZW50U3RyaW5nczMyQSAgIChLRVJORUwzMi4yMTApIChLRVJORUwzMi4yMTEpCisgKi8KK0xQU1RSIEdldEVudmlyb25tZW50U3RyaW5nczMyQSh2b2lkKQoreworICAgIGFzc2VydCggcEN1cnJlbnRQcm9jZXNzICk7CisgICAgcmV0dXJuIHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5lbnZpcm9uOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICBHZXRFbnZpcm9ubWVudFN0cmluZ3MzMlcgICAoS0VSTkVMMzIuMjEyKQorICovCitMUFdTVFIgR2V0RW52aXJvbm1lbnRTdHJpbmdzMzJXKHZvaWQpCit7CisgICAgSU5UMzIgc2l6ZTsKKyAgICBMUFdTVFIgcmV0LCBwVzsKKyAgICBMUFNUUiBwQTsKKworICAgIGFzc2VydCggcEN1cnJlbnRQcm9jZXNzICk7CisgICAgc2l6ZSA9IEhlYXBTaXplKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+ZW52aXJvbiApOworICAgIGlmICghKHJldCA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSAqIHNpemVvZihXQ0hBUikgKSkpCisgICAgICAgIHJldHVybiBOVUxMOworICAgIHBBID0gcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudmlyb247CisgICAgcFcgPSByZXQ7CisgICAgd2hpbGUgKCpwQSkKKyAgICB7CisgICAgICAgIGxzdHJjcHlBdG9XKCBwVywgcEEgKTsKKyAgICAgICAgc2l6ZSA9IHN0cmxlbihwQSk7CisgICAgICAgIHBBICs9IHNpemUgKyAxOworICAgICAgICBwVyArPSBzaXplICsgMTsKKyAgICB9CisgICAgKnBXID0gMDsKKyAgICByZXR1cm4gcmV0OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MzMkEgICAoS0VSTkVMMzIuMTQxKQorICovCitCT09MMzIgRnJlZUVudmlyb25tZW50U3RyaW5nczMyQSggTFBTVFIgcHRyICkKK3sKKyAgICBhc3NlcnQoIHBDdXJyZW50UHJvY2VzcyApOworICAgIGlmIChwdHIgIT0gcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudmlyb24pCisgICAgeworICAgICAgICBTZXRMYXN0RXJyb3IoIEVSUk9SX0lOVkFMSURfUEFSQU1FVEVSICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRnJlZUVudmlyb25tZW50U3RyaW5nczMyVyAgIChLRVJORUwzMi4xNDIpCisgKi8KK0JPT0wzMiBGcmVlRW52aXJvbm1lbnRTdHJpbmdzMzJXKCBMUFdTVFIgcHRyICkKK3sKKyAgICBhc3NlcnQoIHBDdXJyZW50UHJvY2VzcyApOworICAgIHJldHVybiBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgcHRyICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBICAgKEtFUk5FTDMyLjIxMykKKyAqLworRFdPUkQgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBDU1RSIG5hbWUsIExQU1RSIHZhbHVlLCBEV09SRCBzaXplICkKK3sKKyAgICBMUFNUUiBwOworICAgIElOVDMyIGxlbiwgcmVzOworCisgICAgYXNzZXJ0KCBwQ3VycmVudFByb2Nlc3MgKTsKKyAgICBwID0gcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudmlyb247CisgICAgaWYgKCFuYW1lIHx8ICEqbmFtZSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICB3aGlsZSAoKnApCisgICAgeworICAgICAgICByZXMgPSBsc3RybmNtcGkzMkEoIG5hbWUsIHAsIGxlbiApOworICAgICAgICBpZiAocmVzIDwgMCkgZ290byBub3RfZm91bmQ7CisgICAgICAgIGlmICghcmVzICYmIChwW2xlbl0gPT0gJz0nKSkgYnJlYWs7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICB9CisgICAgaWYgKCEqcCkgZ290byBub3RfZm91bmQ7CisgICAgaWYgKHZhbHVlKSBsc3RyY3B5bjMyQSggdmFsdWUsIHAgKyBsZW4gKyAxLCBzaXplICk7CisgICAgcmV0dXJuIHN0cmxlbihwKTsKK25vdF9mb3VuZDoKKyAgICByZXR1cm4gMDsgIC8qIEZJWE1FOiBTZXRMYXN0RXJyb3IgKi8KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJXICAgKEtFUk5FTDMyLjIxNCkKKyAqLworRFdPUkQgR2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyggTFBDV1NUUiBuYW1lVywgTFBXU1RSIHZhbFcsIERXT1JEIHNpemUgKQoreworICAgIExQU1RSIG5hbWUgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWVXICk7CisgICAgTFBTVFIgdmFsICA9IEhlYXBBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZSApOworICAgIERXT1JEIHJlcyAgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlMzJBKCBuYW1lLCB2YWwsIHNpemUgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZSApOworICAgIGlmICh2YWxXKSBsc3RyY3B5bkF0b1coIHZhbFcsIHZhbCwgc2l6ZSApOworICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCB2YWwgKTsKKyAgICByZXR1cm4gcmVzOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMkEgICAoS0VSTkVMMzIuNDg0KQorICovCitCT09MMzIgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyQSggTFBDU1RSIG5hbWUsIExQQ1NUUiB2YWx1ZSApCit7CisgICAgSU5UMzIgc2l6ZSwgbGVuLCByZXM7CisgICAgTFBTVFIgcCwgZW52LCBuZXdfZW52OworCisgICAgYXNzZXJ0KCBwQ3VycmVudFByb2Nlc3MgKTsKKyAgICBlbnYgPSBwID0gcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudmlyb247CisKKyAgICAvKiBGaW5kIGEgcGxhY2UgdG8gaW5zZXJ0IHRoZSBzdHJpbmcgKi8KKworICAgIHJlcyA9IC0xOworICAgIGxlbiA9IHN0cmxlbihuYW1lKTsKKyAgICB3aGlsZSAoKnApCisgICAgeworICAgICAgICByZXMgPSBsc3RybmNtcGkzMkEoIG5hbWUsIHAsIGxlbiApOworICAgICAgICBpZiAocmVzIDwgMCkgYnJlYWs7CisgICAgICAgIGlmICghcmVzICYmIChwW2xlbl0gPT0gJz0nKSkgYnJlYWs7CisgICAgICAgIHJlcyA9IDE7CisgICAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKKyAgICB9CisgICAgaWYgKCF2YWx1ZSAmJiByZXMpICAvKiBWYWx1ZSB0byByZW1vdmUgZG9lc24ndCBleGlzdCBhbHJlYWR5ICovCisgICAgICAgIHJldHVybiBGQUxTRTsKKworICAgIC8qIFJlYWxsb2MgdGhlIGJ1ZmZlciAqLworCisgICAgbGVuID0gdmFsdWUgPyBzdHJsZW4obmFtZSkgKyBzdHJsZW4odmFsdWUpICsgMiA6IDA7CisgICAgaWYgKCFyZXMpIGxlbiAtPSBzdHJsZW4ocCkgKyAxOyAgLyogVGhlIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KKyAgICBzaXplID0gcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudl9zaXplICsgbGVuOworICAgIGlmICghKG5ld19lbnYgPSBIZWFwUmVBbGxvYyggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgZW52LCBzaXplICkpKQorICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgcCA9IG5ld19lbnYgKyAocCAtIGVudik7CisKKyAgICAvKiBTZXQgdGhlIG5ldyBzdHJpbmcgKi8KKworICAgIG1lbW1vdmUoIHAgKyBsZW4sIHAsIHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5lbnZfc2l6ZSAtIChwLW5ld19lbnYpICk7CisgICAgaWYgKHZhbHVlKQorICAgIHsKKyAgICAgICAgc3RyY3B5KCBwLCBuYW1lICk7CisgICAgICAgIHN0cmNhdCggcCwgIj0iICk7CisgICAgICAgIHN0cmNhdCggcCwgdmFsdWUgKTsKKyAgICB9CisgICAgcEN1cnJlbnRQcm9jZXNzLT5lbnZfZGItPmVudl9zaXplID0gc2l6ZTsKKyAgICBwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+ZW52aXJvbiAgPSBuZXdfZW52OworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldEVudmlyb25tZW50VmFyaWFibGUzMlcgICAoS0VSTkVMMzIuNDg1KQorICovCitCT09MMzIgU2V0RW52aXJvbm1lbnRWYXJpYWJsZTMyVyggTFBDV1NUUiBuYW1lLCBMUENXU1RSIHZhbHVlICkKK3sKKyAgICBMUFNUUiBuYW1lQSAgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIG5hbWUgKTsKKyAgICBMUFNUUiB2YWx1ZUEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIHZhbHVlICk7CisgICAgQk9PTDMyIHJldCA9IFNldEVudmlyb25tZW50VmFyaWFibGUzMkEoIG5hbWVBLCB2YWx1ZUEgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgbmFtZUEgKTsKKyAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgdmFsdWVBICk7CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRQcm9jZXNzSGVhcCAgICAoS0VSTkVMMzIuMjU5KQogICovCiBIQU5ETEUzMiBHZXRQcm9jZXNzSGVhcCh2b2lkKQpAQCAtMzI4LDMgKzU0OSwxNDEgQEAKICAgICBpZiAoIXBDdXJyZW50UHJvY2VzcykgcmV0dXJuIFN5c3RlbUhlYXA7ICAvKiBGb3IgdGhlIGJvb3QtdXAgY29kZSAqLwogICAgIHJldHVybiBwQ3VycmVudFByb2Nlc3MtPmhlYXA7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VGhyZWFkTG9jYWxlICAgIChLRVJORUwzMi4yOTUpCisgKi8KK0xDSUQgR2V0VGhyZWFkTG9jYWxlKHZvaWQpCit7CisgICAgcmV0dXJuIHBDdXJyZW50UHJvY2Vzcy0+bG9jYWxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIFNldFByaW9yaXR5Q2xhc3MgICAoS0VSTkVMMzIuNTAzKQorICovCitCT09MMzIgU2V0UHJpb3JpdHlDbGFzcyggSEFORExFMzIgaHByb2Nlc3MsIERXT1JEIHByaW9yaXR5Y2xhc3MgKQoreworICAgIFBEQjMyCSpwZGI7CisKKyAgICBwZGIgPSAoUERCMzIqKVBST0NFU1NfR2V0T2JqUHRyKGhwcm9jZXNzLEszMk9CSl9QUk9DRVNTKTsKKyAgICBpZiAoIXBkYikgcmV0dXJuIEZBTFNFOworICAgIHN3aXRjaCAocHJpb3JpdHljbGFzcykKKyAgICB7CisgICAgY2FzZSBOT1JNQUxfUFJJT1JJVFlfQ0xBU1M6CisgICAgCXBkYi0+cHJpb3JpdHkgPSAweDAwMDAwMDA4OworCWJyZWFrOworICAgIGNhc2UgSURMRV9QUklPUklUWV9DTEFTUzoKKyAgICAJcGRiLT5wcmlvcml0eSA9IDB4MDAwMDAwMDQ7CisJYnJlYWs7CisgICAgY2FzZSBISUdIX1BSSU9SSVRZX0NMQVNTOgorICAgIAlwZGItPnByaW9yaXR5ID0gMHgwMDAwMDAwZDsKKwlicmVhazsKKyAgICBjYXNlIFJFQUxUSU1FX1BSSU9SSVRZX0NMQVNTOgorICAgIAlwZGItPnByaW9yaXR5ID0gMHgwMDAwMDAxODsKKyAgICAJYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAJZnByaW50ZihzdGRlcnIsIlNldFByaW9yaXR5Q2xhc3M6IHVua25vd24gcHJpb3JpdHkgY2xhc3MgJWxkXG4iLHByaW9yaXR5Y2xhc3MpOworCWJyZWFrOworICAgIH0KKyAgICBLMzJPQkpfRGVjQ291bnQoKEszMk9CSiopcGRiKTsKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRQcmlvcml0eUNsYXNzICAgKEtFUk5FTDMyLjI1MCkKKyAqLworRFdPUkQgR2V0UHJpb3JpdHlDbGFzcyhIQU5ETEUzMiBocHJvY2VzcykKK3sKKyAgICBQREIzMgkqcGRiOworICAgIERXT1JECXJldDsKKworICAgIHBkYiA9IChQREIzMiopUFJPQ0VTU19HZXRPYmpQdHIoaHByb2Nlc3MsSzMyT0JKX1BST0NFU1MpOworICAgIHJldCA9IDA7CisgICAgaWYgKHBkYikKKyAgICB7CisgICAgCXN3aXRjaCAocGRiLT5wcmlvcml0eSkKKyAgICAgICAgeworCWNhc2UgMHgwMDAwMDAwODoKKwkgICAgcmV0ID0gTk9STUFMX1BSSU9SSVRZX0NMQVNTOworCSAgICBicmVhazsKKwljYXNlIDB4MDAwMDAwMDQ6CisJICAgIHJldCA9IElETEVfUFJJT1JJVFlfQ0xBU1M7CisJICAgIGJyZWFrOworCWNhc2UgMHgwMDAwMDAwZDoKKwkgICAgcmV0ID0gSElHSF9QUklPUklUWV9DTEFTUzsKKwkgICAgYnJlYWs7CisJY2FzZSAweDAwMDAwMDE4OgorCSAgICByZXQgPSBSRUFMVElNRV9QUklPUklUWV9DTEFTUzsKKwkgICAgYnJlYWs7CisJZGVmYXVsdDoKKwkgICAgZnByaW50ZihzdGRlcnIsIkdldFByaW9yaXR5Q2xhc3M6IHVua25vd24gcHJpb3JpdHkgJWxkXG4iLHBkYi0+cHJpb3JpdHkpOworCX0KKwlLMzJPQkpfRGVjQ291bnQoKEszMk9CSiopcGRiKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBHZXRTdGRIYW5kbGUgICAgKEtFUk5FTDMyLjI3NikKKyAqCisgKiBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIGFsbG9jYXRlZCB3aGVuIGEgY29uc29sZSBpcyBjcmVhdGVkLCBvciBpbmhlcml0ZWQKKyAqICAgICAgICBmcm9tIHRoZSBwYXJlbnQuCisgKi8KK0hBTkRMRTMyIEdldFN0ZEhhbmRsZSggRFdPUkQgc3RkX2hhbmRsZSApCit7CisgICAgSEZJTEUzMiBoRmlsZTsKKyAgICBpbnQgZmQ7CisKKyAgICBhc3NlcnQoIHBDdXJyZW50UHJvY2VzcyApOworICAgIHN3aXRjaChzdGRfaGFuZGxlKQorICAgIHsKKyAgICBjYXNlIFNURF9JTlBVVF9IQU5ETEU6CisgICAgICAgIGlmIChwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+aFN0ZGluKQorICAgICAgICAgICAgcmV0dXJuIHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5oU3RkaW47CisgICAgICAgIGZkID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTVERfT1VUUFVUX0hBTkRMRToKKyAgICAgICAgaWYgKHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5oU3Rkb3V0KQorICAgICAgICAgICAgcmV0dXJuIHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5oU3Rkb3V0OworICAgICAgICBmZCA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU1REX0VSUk9SX0hBTkRMRToKKyAgICAgICAgaWYgKHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5oU3RkZXJyKQorICAgICAgICAgICAgcmV0dXJuIHBDdXJyZW50UHJvY2Vzcy0+ZW52X2RiLT5oU3RkZXJyOworICAgICAgICBmZCA9IDI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfSEFORExFX1ZBTFVFMzI7CisgICAgfQorICAgIGhGaWxlID0gRklMRV9EdXBVbml4SGFuZGxlKCBmZCApOworICAgIGlmIChoRmlsZSAhPSBIRklMRV9FUlJPUjMyKSBGSUxFX1NldEZpbGVUeXBlKCBoRmlsZSwgRklMRV9UWVBFX0NIQVIgKTsKKyAgICByZXR1cm4gaEZpbGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0U3RkSGFuZGxlICAgIChLRVJORUwzMi41MDYpCisgKi8KK0JPT0wzMiBTZXRTdGRIYW5kbGUoIERXT1JEIHN0ZF9oYW5kbGUsIEhBTkRMRTMyIGhhbmRsZSApCit7CisgICAgYXNzZXJ0KCBwQ3VycmVudFByb2Nlc3MgKTsKKyAgICBzd2l0Y2goc3RkX2hhbmRsZSkKKyAgICB7CisgICAgY2FzZSBTVERfSU5QVVRfSEFORExFOgorICAgICAgICBwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+aFN0ZGluID0gaGFuZGxlOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICBjYXNlIFNURF9PVVRQVVRfSEFORExFOgorICAgICAgICBwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+aFN0ZG91dCA9IGhhbmRsZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgY2FzZSBTVERfRVJST1JfSEFORExFOgorICAgICAgICBwQ3VycmVudFByb2Nlc3MtPmVudl9kYi0+aFN0ZGVyciA9IGhhbmRsZTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKKyAgICByZXR1cm4gRkFMU0U7Cit9CmRpZmYgLS1naXQgYS9zY2hlZHVsZXIvdGhyZWFkLmMgYi9zY2hlZHVsZXIvdGhyZWFkLmMKaW5kZXggNzhiNzFmOC4uYWNjNjRhMSAxMDA2NDQKLS0tIGEvc2NoZWR1bGVyL3RocmVhZC5jCisrKyBiL3NjaGVkdWxlci90aHJlYWQuYwpAQCAtODMsNiArODMsNyBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQgICAoS0VSTkVMMzIuMjAxKQorICogUmV0dXJucyBjcnlwdGVkICh4b3InZWQpIHBvaW50ZXIgdG8gVEhEQiBpbiBXaW45NS4KICAqLwogRFdPUkQgR2V0Q3VycmVudFRocmVhZElkKHZvaWQpCiB7CkBAIC0yMjksMyArMjMwLDM1IEBACiB7CiAgICAgRUFYX3JlZyhjb250ZXh0KSA9IEdldFNlbGVjdG9yQmFzZSggRlNfcmVnKGNvbnRleHQpICk7CiB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgR2V0VGhyZWFkUHJpb3JpdHkgICAoS0VSTkVMMzIuMjk2KQorICovCitJTlQzMgorR2V0VGhyZWFkUHJpb3JpdHkoSEFORExFMzIgaHRocmVhZCkgeworICAgIFRIREIgKnRocmVhZDsKKyAgICBJTlQzMiByZXQ7CisgICAgCisgICAgcmV0ID0gMDsKKyAgICB0aHJlYWQgPSAoVEhEQiopUFJPQ0VTU19HZXRPYmpQdHIoaHRocmVhZCxLMzJPQkpfVEhSRUFEKTsKKyAgICBpZiAodGhyZWFkKSB7CisgICAgCXJldCA9IHRocmVhZC0+ZGVsdGFfcHJpb3JpdHk7CisJSzMyT0JKX0RlY0NvdW50KChLMzJPQkoqKXRocmVhZCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0VGhyZWFkUHJpb3JpdHkgICAoS0VSTkVMMzIuNTE0KQorICovCitCT09MMzIKK1NldFRocmVhZFByaW9yaXR5KEhBTkRMRTMyIGh0aHJlYWQsSU5UMzIgcHJpb3JpdHkpIHsKKyAgICBUSERCICp0aHJlYWQ7CisgICAgCisgICAgdGhyZWFkID0gKFRIREIqKVBST0NFU1NfR2V0T2JqUHRyKGh0aHJlYWQsSzMyT0JKX1RIUkVBRCk7CisgICAgaWYgKHRocmVhZCkgeworCXRocmVhZC0+ZGVsdGFfcHJpb3JpdHkgPSBwcmlvcml0eTsKKwlLMzJPQkpfRGVjQ291bnQoKEszMk9CSiopdGhyZWFkKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5pbiBiL3Rvb2xzL01ha2VmaWxlLmluCmluZGV4IGMxZDNmMTQuLjAxMTZjOTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlLmluCisrKyBiL3Rvb2xzL01ha2VmaWxlLmluCkBAIC00LDcgKzQsNyBAQAogU1JDRElSICAgID0gQHNyY2RpckAKIFZQQVRIICAgICA9IEBzcmNkaXJACiAKLVBST0dSQU1TID0gYnVpbGQgbWFrZWRlcCBmbnQyYmRmCitQUk9HUkFNUyA9IGJ1aWxkQFBST0dFWFRAIG1ha2VkZXBAUFJPR0VYVEAgZm50MmJkZkBQUk9HRVhUQAogTU9EVUxFICAgPSBub25lCiAKIENfU1JDUyA9IGJ1aWxkLmMgbWFrZWRlcC5jIGZudDJiZGYuYwpAQCAtMTMsMTMgKzEzLDEzIEBACiAKIEBNQUtFX1JVTEVTQAogCi1idWlsZDogYnVpbGQubwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyBidWlsZCBidWlsZC5vCitidWlsZEBQUk9HRVhUQDogYnVpbGQubworCSQoQ0MpICQoQ0ZMQUdTKSAtbyBidWlsZEBQUk9HRVhUQCBidWlsZC5vCiAKLW1ha2VkZXA6IG1ha2VkZXAubwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyBtYWtlZGVwIG1ha2VkZXAubworbWFrZWRlcEBQUk9HRVhUQDogbWFrZWRlcC5vCisJJChDQykgJChDRkxBR1MpIC1vIG1ha2VkZXBAUFJPR0VYVEAgbWFrZWRlcC5vCiAKLWZudDJiZGY6IGZudDJiZGYubwotCSQoQ0MpICQoQ0ZMQUdTKSAtbyBmbnQyYmRmIGZudDJiZGYubworZm50MmJkZkBQUk9HRVhUQDogZm50MmJkZi5vCisJJChDQykgJChDRkxBR1MpIC1vIGZudDJiZGZAUFJPR0VYVEAgZm50MmJkZi5vCiAKICMjIyBEZXBlbmRlbmNpZXM6CmRpZmYgLS1naXQgYS90b29scy9idWlsZC5jIGIvdG9vbHMvYnVpbGQuYwppbmRleCA5NTgxMmQ5Li44OTRiNzNjIDEwMDY0NAotLS0gYS90b29scy9idWlsZC5jCisrKyBiL3Rvb2xzL2J1aWxkLmMKQEAgLTIsNiArMiw3IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBSb2JlcnQgSi4gQW1zdGFkdAogICogQ29weXJpZ2h0IDE5OTUgTWFydGluIHZvbiBMb2V3aXMKICAqIENvcHlyaWdodCAxOTk1LCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICogQ29weXJpZ2h0IDE5OTcgRXJpYyBZb3VuZ2RhbGUKICAqLwogCiAjaWZuZGVmIFdJTkVMSUIKQEAgLTExLDYgKzEyLDcgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbm50LmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIgIC8qIGZvciBFUlJPUl9DQUxMX05PVF9JTVBMRU1FTlRFRCAqLwpAQCAtMTA1LDYgKzEwNyw3IEBACiB7CiAgICAgT1JEX1RZUEUgICAgdHlwZTsKICAgICBpbnQgICAgICAgICBvZmZzZXQ7CisgICAgaW50CQlsaW5lbm87CiAgICAgY2hhciAgICAgICAgbmFtZVs4MF07CiAgICAgdW5pb24KICAgICB7CkBAIC01MTksNiArNTIyLDcgQEAKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICBzdHJjcHkoIG9kcC0+bmFtZSwgdG9rZW4gKTsKKyAgICBvZHAtPmxpbmVubyA9IExpbmU7CiAKICAgICBzd2l0Y2gob2RwLT50eXBlKQogICAgIHsKQEAgLTk2OCwxMyArOTcyLDI1IEBACiAgKgogICogQnVpbGQgYSBXaW4zMiBhc3NlbWJseSBmaWxlIGZyb20gYSBzcGVjIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQgQnVpbGRTcGVjMzJGaWxlKCBGSUxFICpvdXRmaWxlICkKK3N0YXRpYyBpbnQgQnVpbGRTcGVjMzJGaWxlKCBjaGFyICogc3BlY2ZpbGUsIEZJTEUgKm91dGZpbGUgKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIGludCBpLCBtb2R1bGVfc2l6ZSwgbGVuOwogICAgIGNoYXIgYnVmZmVyWzEwMjRdOwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHk7IGRvIG5vdCBlZGl0ISAqL1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5maWxlXHRcIiVzXCJcbiIsIHNwZWNmaWxlICk7CisjaWZkZWYgX19HTlVDX18KKyAgICBnZXRjd2QoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisKKyAgICAvKgorICAgICAqIFRoZSBzdGFicyBoZWxwIHRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBhcyB0aGV5IGFyZSBhbiBpbmRpY2F0aW9uIHRoYXQgaXQKKyAgICAgKiBpcyBzZW5zaWJsZSB0byBzdGVwIGludG8gYSB0aHVuay90cmFtcG9saW5lLgorICAgICAqLworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlcy9cIiwxMDAsMCwwLENvZGVfU3RhcnRcbiIsIGJ1ZmZlcik7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzXCIsMTAwLDAsMCxDb2RlX1N0YXJ0XG4iLCBzcGVjZmlsZSk7CisjZW5kaWYKKwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFsaWduIDRcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiQ29kZV9TdGFydDpcblxuIiApOwpAQCAtOTkyLDcgKzEwMDgsMTcgQEAKICAgICAgICAgY2FzZSBUWVBFX1NUVUI6CiAgICAgICAgIGNhc2UgVFlQRV9SRUdJU1RFUjoKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIvKiAlcy4lZCAoJXMpICovXG4iLCBETExOYW1lLCBpLCBvZHAtPm5hbWUpOworI2lmZGVmIF9fR05VQ19fCisJICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlc18lZDpGMVwiLDM2LDAsJWQsJXNfJWRcbiIsIAorCQkgICAgIERMTE5hbWUsIGksCisJCSAgICAgb2RwLT5saW5lbm8sIERMTE5hbWUsIGkpOworI2VuZGlmCisKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICIlc18lZDpcbiIsIERMTE5hbWUsIGkgKTsKKyNpZmRlZiBfX0dOVUNfXworCSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJuIDY4LDAsJWQsMFxuIiwgb2RwLT5saW5lbm8pOworI2VuZGlmCisKICAgICAgICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWJwXG4iICk7CiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAkIiBQUkVGSVggIiVzXG4iLG9kcC0+dS5mdW5jLmxpbmtfbmFtZSk7CiAgICAgICAgICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRjYWxsICIgUFJFRklYICJDYWxsRnJvbTMyXyVzXyVkXG4iLApAQCAtMTExMiw2ICsxMTM4LDExIEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgQ29kZV9TdGFydFxuIiApOyAgICAgICAvKiBDb2RlIHN0YXJ0ICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmxvbmcgRnVuY3Rpb25zXG4iICk7ICAgICAgICAvKiBGdW5jdGlvbnMgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQubG9uZyBGdW5jTmFtZXNcbiIgKTsgICAgICAgIC8qIEZ1bmN0aW9uIG5hbWVzICovCisjaWZkZWYgX19HTlVDX18KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIik7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnN0YWJzIFwiXCIsMTAwLDAsMCwuTGV0ZXh0XG4iKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLkxldGV4dDpcbiIpOworI2VuZGlmCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTExMjEsNyArMTE1Miw3IEBACiAgKgogICogQnVpbGQgYSBXaW4xNiBhc3NlbWJseSBmaWxlIGZyb20gYSBzcGVjIGZpbGUuCiAgKi8KLXN0YXRpYyBpbnQgQnVpbGRTcGVjMTZGaWxlKCBGSUxFICpvdXRmaWxlICkKK3N0YXRpYyBpbnQgQnVpbGRTcGVjMTZGaWxlKCBjaGFyICogc3BlY2ZpbGUsIEZJTEUgKm91dGZpbGUgKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIGludCBpOwpAQCAtMTI1OSw5ICsxMjkwLDkgQEAKICAgICBzd2l0Y2goU3BlY1R5cGUpCiAgICAgewogICAgIGNhc2UgU1BFQ19XSU4xNjoKLSAgICAgICAgcmV0dXJuIEJ1aWxkU3BlYzE2RmlsZSggb3V0ZmlsZSApOworICAgICAgICByZXR1cm4gQnVpbGRTcGVjMTZGaWxlKCBzcGVjbmFtZSwgb3V0ZmlsZSApOwogICAgIGNhc2UgU1BFQ19XSU4zMjoKLSAgICAgICAgcmV0dXJuIEJ1aWxkU3BlYzMyRmlsZSggb3V0ZmlsZSApOworICAgICAgICByZXR1cm4gQnVpbGRTcGVjMzJGaWxlKCBzcGVjbmFtZSwgb3V0ZmlsZSApOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVzOiBNaXNzaW5nICd0eXBlJyBkZWNsYXJhdGlvblxuIiwgc3BlY25hbWUgKTsKICAgICAgICAgcmV0dXJuIC0xOwpAQCAtMTI5Myw2ICsxMzI0LDkgQEAKICAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKKyNpZmRlZiBfX0dOVUNfXworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsVG8zMl9MYXJnZVN0YWNrOkYxXCIsMzYsMCwwLENhbGxUbzMyX0xhcmdlU3RhY2tcbiIpOworI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDYWxsVG8zMl9MYXJnZVN0YWNrXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDYWxsVG8zMl9MYXJnZVN0YWNrOlxuIiApOwogICAgIApAQCAtMTQ1NCw2ICsxNDg4LDcgQEAKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVzaSkgLSBzaXplb2YoQ09OVEVYVCkgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWRpLCVkKCUlZWJ4KVxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVkaSkgLSBzaXplb2YoQ09OVEVYVCkgKTsKKwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAtMTAoJSVlYnApLCUlZWF4XG4iICk7IC8qIEdldCAlZHMgZnJvbSBzdGFjayovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdEcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKQEAgLTE0NjMsNyArMTQ5OCw2IEBACiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGZsXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChFRmxhZ3MpIC0gc2l6ZW9mKENPTlRFWFQpICk7Ci0jaWYgMAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdnp3bCAwKCUlZWJwKSwlJWVheFxuIiApOyAvKiBHZXQgJWJwIGZyb20gc3RhY2sgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCVkKCUlZWJ4KVxuIiwKICAgICAgICAgICAgICBDT05URVhUT0ZGU0VUKEVicCkgLSBzaXplb2YoQ09OVEVYVCkgKTsKQEAgLTE0NzMsMTIgKzE1MDcsMTYgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z6d2wgNCglJWVicCksJSVlYXhcbiIgKTsgLyogR2V0ICVjcyBmcm9tIHN0YWNrICovCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdDcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZnMsJWQoJSVlYngpXG4iLAorICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVmcywlJWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdGcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZ3MsJWQoJSVlYngpXG4iLAorICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVncywlJWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdHcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlc3MsJWQoJSVlYngpXG4iLAorICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVzcywlJWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVieClcbiIsCiAgICAgICAgICAgICAgQ09OVEVYVE9GRlNFVChTZWdTcykgLSBzaXplb2YoQ09OVEVYVCkgKTsKKyNpZiAwCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZnNhdmUgJWQoJSVlYngpXG4iLAogICAgICAgICAgICAgIENPTlRFWFRPRkZTRVQoRmxvYXRTYXZlKSAtIHNpemVvZihDT05URVhUKSApOwogI2VuZGlmCkBAIC0xNTY1LDYgKzE2MDMsMTAgQEAKICAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKKyNpZmRlZiBfX0dOVUNfXworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsRnJvbTE2XyVzOkYxXCIsMzYsMCwwLENhbGxGcm9tMTZfJXNcbiIsIAorCSAgICAgcHJvZmlsZSwgcHJvZmlsZSk7CisjZW5kaWYKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNhbGxGcm9tMTZfJXNcbiIsIHByb2ZpbGUgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNhbGxGcm9tMTZfJXM6XG4iLCBwcm9maWxlICk7CiAKQEAgLTE3ODAsNiArMTgyMiwxMCBAQAogICAgIC8qIEZ1bmN0aW9uIGhlYWRlciAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxuXHQuYWxpZ24gNFxuIiApOworI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNhbGxUbzE2XyVzOkYxXCIsMzYsMCwwLENhbGxUbzE2XyVzXG4iLCAKKwkgICAgIHByb2ZpbGUsIHByb2ZpbGUpOworI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDYWxsVG8xNl8lc1xuIiwgcHJvZmlsZSApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ2FsbFRvMTZfJXM6XG4iLCBwcm9maWxlICk7CiAKQEAgLTE4MTMsOCArMTg1OSw3IEBACiAgICAgaWYgKGRlYnVnZ2luZykKICAgICB7CiAgICAgICAgIC8qIFB1c2ggdGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IGFyZ3VtZW50ICovCi0gICAgICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYngsJSVlYXhcbiIgKTsKLSAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkMTIsJSVlYXhcbiIgKTsKKyAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bGVhbCAxMiglJWVieCksJSVlYXhcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJCVkXG4iLCByZWdfZnVuYyA/IDggOiBzdHJsZW4oYXJncykgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Y2FsbCAiIFBSRUZJWCAiUkVMQVlfRGVidWdDYWxsVG8xNlxuIiApOwpAQCAtMTk2OSwzMCArMjAxNCw0MCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgQnVpbGRDb250ZXh0MzIKICAqCi0gKiBCdWlsZCB0aGUgY29udGV4dCBzdHJ1Y3R1cmUgb24gdGhlIHN0YWNrLgorICogQnVpbGQgdGhlIENPTlRFWFQgc3RydWN0dXJlIG9uIHRoZSBzdGFjay4KICAqLwogc3RhdGljIHZvaWQgQnVpbGRDb250ZXh0MzIoIEZJTEUgKm91dGZpbGUgKQogewogICAgIC8qIEJ1aWxkIHRoZSBjb250ZXh0IHN0cnVjdHVyZSAqLwogCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlJXNzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsgIC8qICVlc3AgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNoZmxcbiIgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRzdWJsICQlZCwlJWVzcFxuIiwgc2l6ZW9mKENPTlRFWFQpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwlZCglJWVzcClcbiIsIENPTlRFWFRPRkZTRVQoRWF4KSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYngsJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKEVieCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWN4LCVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChFY3gpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVkeCwlZCglJWVzcClcbiIsIENPTlRFWFRPRkZTRVQoRWR4KSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlc2ksJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKEVzaSkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWRpLCVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChFZGkpICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaHcgJDBcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNodyAlJWNzXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0c3VibCAkOCwlJWVzcFxuIiApOyAgLyogJWVpcCArICVlYnAgKi8KIAotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWF4XG4iLCBzaXplb2YoQ09OVEVYVCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChFRmxhZ3MpICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVjeFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWR4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYnhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVzaVxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWRpXG4iICk7CiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlY3MsJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKFNlZ0NzKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVkcywlZCglJWVzcClcbiIsIENPTlRFWFRPRkZTRVQoU2VnRHMpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVzLCVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChTZWdFcykgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZnMsJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKFNlZ0ZzKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVncywlZCglJWVzcClcbiIsIENPTlRFWFRPRkZTRVQoU2VnR3MpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJXNzLCVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChTZWdTcykgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHR4b3JsICUlZWF4LCUlZWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWRzLCUlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVheFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdncgJSVlcywlJWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlZnMsJSVheFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHB1c2hsICUlZWF4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92dyAlJWdzLCUlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwdXNobCAlJWVheFxuIiApOworCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0c3VibCAkJWQsJSVlc3BcbiIsCisgICAgICAgICAgICAgc2l6ZW9mKEZMT0FUSU5HX1NBVkVfQVJFQSkgKyA2ICogc2l6ZW9mKERXT1JEKSAvKiBEUiByZWdzICovICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cHVzaGwgJDB4MDAwMTAwMWZcbiIgKTsgIC8qIENvbnRleHRGbGFncyAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZnNhdmUgJWQoJSVlc3ApXG4iLCBDT05URVhUT0ZGU0VUKEZsb2F0U2F2ZSkgKTsKIApAQCAtMjAyMSwzMiArMjA3NiwzMyBAQAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdGxlYWwgJWQoJSVlYnApLCUlZXNwXG4iLCAtc2l6ZW9mKENPTlRFWFQpLTEyICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0ZnJzdG9yICVkKCUlZXNwKVxuIiwgQ09OVEVYVE9GRlNFVChGbG9hdFNhdmUpICk7CiAKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVieFxuIiwgQ09OVEVYVE9GRlNFVChFYngpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlY3hcbiIsIENPTlRFWFRPRkZTRVQoRWN4KSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWR4XG4iLCBDT05URVhUT0ZGU0VUKEVkeCkgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVzaVxuIiwgQ09OVEVYVE9GRlNFVChFc2kpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlZGlcbiIsIENPTlRFWFRPRkZTRVQoRWRpKSApOwotCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRUZsYWdzKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsJWQoJSVlc3ApXG4iLCBzaXplb2YoQ09OVEVYVCkgKTsKLQotLyogICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVjc1xuIiwgQ09OVEVYVE9GRlNFVChTZWdDcykgKTsgKi8KLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWRzXG4iLCBDT05URVhUT0ZGU0VUKFNlZ0RzKSApOwotICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZXNcbiIsIENPTlRFWFRPRkZTRVQoU2VnRXMpICk7Ci0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVmc1xuIiwgQ09OVEVYVE9GRlNFVChTZWdGcykgKTsKLSAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWdzXG4iLCBDT05URVhUT0ZGU0VUKFNlZ0dzKSApOwotCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRWlwKSApOwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJSVlYXgsNCglJWVicClcbiIgKTsgLyogJWVpcCBhdCB0aW1lIG9mIGNhbGwgKi8KICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFYnApICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlJWVheCwwKCUlZWJwKVxuIiApOyAvKiAlZWJwIGF0IHRpbWUgb2YgY2FsbCAqLworICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlZWF4XG4iLCBDT05URVhUT0ZGU0VUKEVGbGFncykgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICUlZWF4LCVkKCUlZXNwKVxuIiwgc2l6ZW9mKENPTlRFWFQpICk7CiAKLS8qICAgIGZwcmludGYoIG91dGZpbGUsICJcdG1vdmwgJWQoJSVlc3ApLCUlc3NcbiIsIENPTlRFWFRPRkZTRVQoU2VnU3MpICk7ICovCi0vKiAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3ZsICVkKCUlZXNwKSwlJWVheFxuIiwgQ09OVEVYVE9GRlNFVChFc3ApICk7ICovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkJWQsJSVlc3BcbiIsCisgICAgICAgICAgICAgc2l6ZW9mKEZMT0FUSU5HX1NBVkVfQVJFQSkgKyA3ICogc2l6ZW9mKERXT1JEKSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVnc1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVmc1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVlc1xuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlYXhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRtb3Z3ICUlYXgsJSVkc1xuIiApOwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0bW92bCAlZCglJWVzcCksJSVlYXhcbiIsIENPTlRFWFRPRkZTRVQoRWF4KSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlZGlcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZXNpXG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVieFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdHBvcGwgJSVlZHhcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BsICUlZWN4XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0cG9wbCAlJWVheFxuIiApOwogCi0gICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0YWRkbCAkJWQsJSVlc3BcbiIsIHNpemVvZihDT05URVhUKSApOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdGFkZGwgJCVkLCUlZXNwXG4iLAorICAgICAgICAgICAgIDYgKiBzaXplb2YoRFdPUkQpIC8qICVlYnAgKyAlZWlwICsgJWNzICsgJWVmbCArICVlc3AgKyAlc3MgKi8gKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHRwb3BmbFxuIiApOwogfQogCkBAIC0yMDk1LDYgKzIxNTEsMTAgQEAKICAgICAvKiBGdW5jdGlvbiBoZWFkZXIgKi8KIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcblx0LmFsaWduIDRcbiIgKTsKKyNpZmRlZiBfX0dOVUNfXworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCJDYWxsRnJvbTMyXyVzOkYxXCIsMzYsMCwwLENhbGxGcm9tMzJfJXNcbiIsIAorCSAgICAgcHJvZmlsZSwgcHJvZmlsZSk7CisjZW5kaWYKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZ2xvYmwgIiBQUkVGSVggIkNhbGxGcm9tMzJfJXNcbiIsIHByb2ZpbGUgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNhbGxGcm9tMzJfJXM6XG4iLCBwcm9maWxlICk7CiAKQEAgLTIxODIsNiArMjI0MiwxMCBAQAogICAgIC8qIEZ1bmN0aW9uIGhlYWRlciAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlxuXHQuYWxpZ24gNFxuIiApOworI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIkNhbGxUbzMyXyVkOkYxXCIsMzYsMCwwLENhbGxUbzMyXyVkXG4iLCAKKwkgICAgIGFyZ3MsIGFyZ3MpOworI2VuZGlmCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0Lmdsb2JsICIgUFJFRklYICJDYWxsVG8zMl8lZFxuIiwgYXJncyApOwogICAgIGZwcmludGYoIG91dGZpbGUsIFBSRUZJWCAiQ2FsbFRvMzJfJWQ6XG4iLCBhcmdzICk7CiAKQEAgLTIyNDAsMTUgKzIzMDQsMzEgQEAKICAqCiAgKiBCdWlsZCB0aGUgMTYtYml0LXRvLVdpbmUgY2FsbGJhY2tzCiAgKi8KLXN0YXRpYyBpbnQgQnVpbGRDYWxsRnJvbTE2KCBGSUxFICpvdXRmaWxlLCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3N0YXRpYyBpbnQgQnVpbGRDYWxsRnJvbTE2KCBGSUxFICpvdXRmaWxlLCBjaGFyICogb3V0bmFtZSwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCiB7CiAgICAgaW50IGk7CisgICAgY2hhciBidWZmZXJbMTAyNF07CiAKICAgICAvKiBGaWxlIGhlYWRlciAqLwogCiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIi8qIEZpbGUgZ2VuZXJhdGVkIGF1dG9tYXRpY2FsbHkuIERvIG5vdCBlZGl0ISAqL1xuXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKIAorI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmZpbGVcdFwiJXNcIlxuIiwgb3V0bmFtZSApOworICAgIGdldGN3ZChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKworICAgIC8qCisgICAgICogVGhlIHN0YWJzIGhlbHAgdGhlIGludGVybmFsIGRlYnVnZ2VyIGFzIHRoZXkgYXJlIGFuIGluZGljYXRpb24gdGhhdCBpdAorICAgICAqIGlzIHNlbnNpYmxlIHRvIHN0ZXAgaW50byBhIHRodW5rL3RyYW1wb2xpbmUuCisgICAgICovCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5zdGFicyBcIiVzL1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgYnVmZmVyKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXNcIiwxMDAsMCwwLENvZGVfU3RhcnRcbiIsIG91dG5hbWUpOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iICk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFsaWduIDRcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiQ29kZV9TdGFydDpcblxuIiApOworI2VuZGlmCisKICAgICAvKiBCdWlsZCB0aGUgMzItYml0IGxhcmdlIHN0YWNrIGNhbGxiYWNrICovCiAKICAgICBCdWlsZENhbGwzMkxhcmdlU3RhY2soIG91dGZpbGUgKTsKQEAgLTIyNjgsNiArMjM0OCwxMyBAQAogICAgICAgICAgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LmFzY2lpIFwiJXNcXDBcIlxuIiwgYXJndltpXSArIDUgKTsKICAgICAgICAgfQogICAgIH0KKworI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKKyNlbmRpZgorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIyNzcsMTQgKzIzNjQsMzEgQEAKICAqCiAgKiBCdWlsZCB0aGUgV2luZS10by0xNi1iaXQgY2FsbGJhY2tzCiAgKi8KLXN0YXRpYyBpbnQgQnVpbGRDYWxsVG8xNiggRklMRSAqb3V0ZmlsZSwgaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSApCitzdGF0aWMgaW50IEJ1aWxkQ2FsbFRvMTYoIEZJTEUgKm91dGZpbGUsIGNoYXIgKiBvdXRuYW1lLCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKIHsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKICAgICBpbnQgaTsKIAogICAgIC8qIEZpbGUgaGVhZGVyICovCiAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gRG8gbm90IGVkaXQhICovXG5cbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOworCisjaWZkZWYgX19HTlVDX18KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZmlsZVx0XCIlc1wiXG4iLCBvdXRuYW1lICk7CisgICAgZ2V0Y3dkKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgLyoKKyAgICAgKiBUaGUgc3RhYnMgaGVscCB0aGUgaW50ZXJuYWwgZGVidWdnZXIgYXMgdGhleSBhcmUgYW4gaW5kaWNhdGlvbiB0aGF0IGl0CisgICAgICogaXMgc2Vuc2libGUgdG8gc3RlcCBpbnRvIGEgdGh1bmsvdHJhbXBvbGluZS4KKyAgICAgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXMvXCIsMTAwLDAsMCxDb2RlX1N0YXJ0XG4iLCBidWZmZXIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlc1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgb3V0bmFtZSk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYWxpZ24gNFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJDb2RlX1N0YXJ0OlxuXG4iICk7CisjZW5kaWYKKwogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfU3RhcnRcbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCBQUkVGSVggIkNBTExUTzE2X1N0YXJ0OlxuIiApOwogCkBAIC0yMjk4LDYgKzI0MDIsMTMgQEAKIAogICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5nbG9ibCAiIFBSRUZJWCAiQ0FMTFRPMTZfRW5kXG4iICk7CiAgICAgZnByaW50Ziggb3V0ZmlsZSwgUFJFRklYICJDQUxMVE8xNl9FbmQ6XG4iICk7CisKKyNpZmRlZiBfX0dOVUNfXworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuc3RhYnMgXCJcIiwxMDAsMCwwLC5MZXRleHRcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuTGV0ZXh0OlxuIik7CisjZW5kaWYKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yMzA3LDggKzI0MTgsOSBAQAogICoKICAqIEJ1aWxkIHRoZSAzMi1iaXQtdG8tV2luZSBjYWxsYmFja3MKICAqLwotc3RhdGljIGludCBCdWlsZENhbGxGcm9tMzIoIEZJTEUgKm91dGZpbGUsIGludCBhcmdjLCBjaGFyICphcmd2W10gKQorc3RhdGljIGludCBCdWlsZENhbGxGcm9tMzIoIEZJTEUgKm91dGZpbGUsIGNoYXIgKiBvdXRuYW1lLCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKIHsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKICAgICBpbnQgaTsKIAogICAgIC8qIEZpbGUgaGVhZGVyICovCkBAIC0yMzE2LDkgKzI0MjgsMzEgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gRG8gbm90IGVkaXQhICovXG5cbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogCisjaWZkZWYgX19HTlVDX18KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZmlsZVx0XCIlc1wiXG4iLCBvdXRuYW1lICk7CisgICAgZ2V0Y3dkKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgLyoKKyAgICAgKiBUaGUgc3RhYnMgaGVscCB0aGUgaW50ZXJuYWwgZGVidWdnZXIgYXMgdGhleSBhcmUgYW4gaW5kaWNhdGlvbiB0aGF0IGl0CisgICAgICogaXMgc2Vuc2libGUgdG8gc3RlcCBpbnRvIGEgdGh1bmsvdHJhbXBvbGluZS4KKyAgICAgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXMvXCIsMTAwLDAsMCxDb2RlX1N0YXJ0XG4iLCBidWZmZXIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlc1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgb3V0bmFtZSk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYWxpZ24gNFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJDb2RlX1N0YXJ0OlxuXG4iICk7CisjZW5kaWYKKwogICAgIC8qIEJ1aWxkIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KIAogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbEZyb20zMkZ1bmMoIG91dGZpbGUsIGFyZ3ZbaV0gKTsKKworI2lmZGVmIF9fR05VQ19fCisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC5zdGFicyBcIlwiLDEwMCwwLDAsLkxldGV4dFxuIik7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIi5MZXRleHQ6XG4iKTsKKyNlbmRpZgorCiAgICAgcmV0dXJuIDA7CiB9CiAKQEAgLTIzMjgsOCArMjQ2MiwxMCBAQAogICoKICAqIEJ1aWxkIHRoZSBXaW5lLXRvLTMyLWJpdCBjYWxsYmFja3MKICAqLwotc3RhdGljIGludCBCdWlsZENhbGxUbzMyKCBGSUxFICpvdXRmaWxlLCBpbnQgYXJnYywgY2hhciAqYXJndltdICkKK3N0YXRpYyBpbnQgQnVpbGRDYWxsVG8zMiggRklMRSAqb3V0ZmlsZSwgY2hhciAqIG91dG5hbWUsIAorCQkJICBpbnQgYXJnYywgY2hhciAqYXJndltdICkKIHsKKyAgICBjaGFyIGJ1ZmZlclsxMDI0XTsKICAgICBpbnQgaTsKIAogICAgIC8qIEZpbGUgaGVhZGVyICovCkBAIC0yMzM3LDkgKzI0NzMsMzcgQEAKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLyogRmlsZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseS4gRG8gbm90IGVkaXQhICovXG5cbiIgKTsKICAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQudGV4dFxuIiApOwogCisgICAgLyoKKyAgICAgKiBUaHJvdyBpbiBhIGNvdXBsZSBvZiBzdGFicy4gIFRoZSBpbnRlcm5hbCBkZWJ1Z2dlciBkb2Vzbid0IHJlYWxseQorICAgICAqIGNhcmUgYWJvdXQgdHJ5aW5nIHRvIHN0ZXAgdGhyb3VnaCB0aGlzIGNyYXAsIGJ1dCB3ZSB1c2UgdGhlIGZpbGUKKyAgICAgKiBuYW1lcyBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgd2Ugc2hvdWxkIGp1c3Qgc3RlcCB0aHJvdWdoIGl0IHRvIHdoYXRldmVyCisgICAgICogaXMgb24gdGhlIG90aGVyIHNpZGUuCisgICAgICovCisjaWZkZWYgX19HTlVDX18KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuZmlsZVx0XCIlc1wiXG4iLCBvdXRuYW1lICk7CisgICAgZ2V0Y3dkKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworCisgICAgLyoKKyAgICAgKiBUaGUgc3RhYnMgaGVscCB0aGUgaW50ZXJuYWwgZGVidWdnZXIgYXMgdGhleSBhcmUgYW4gaW5kaWNhdGlvbiB0aGF0IGl0CisgICAgICogaXMgc2Vuc2libGUgdG8gc3RlcCBpbnRvIGEgdGh1bmsvdHJhbXBvbGluZS4KKyAgICAgKi8KKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiLnN0YWJzIFwiJXMvXCIsMTAwLDAsMCxDb2RlX1N0YXJ0XG4iLCBidWZmZXIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuc3RhYnMgXCIlc1wiLDEwMCwwLDAsQ29kZV9TdGFydFxuIiwgb3V0bmFtZSk7CisgICAgZnByaW50Ziggb3V0ZmlsZSwgIlx0LnRleHRcbiIgKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuYWxpZ24gNFxuIiApOworICAgIGZwcmludGYoIG91dGZpbGUsICJDb2RlX1N0YXJ0OlxuXG4iICk7CisjZW5kaWYKKwogICAgIC8qIEJ1aWxkIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgKi8KIAogICAgIGZvciAoaSA9IDI7IGkgPCBhcmdjOyBpKyspIEJ1aWxkQ2FsbFRvMzJGdW5jKCBvdXRmaWxlLCBhdG9pKGFyZ3ZbaV0pICk7CisKKyNpZmRlZiBfX0dOVUNfXworICAgIGZwcmludGYoIG91dGZpbGUsICJcdC50ZXh0XG4iKTsKKyAgICBmcHJpbnRmKCBvdXRmaWxlLCAiXHQuc3RhYnMgXCJcIiwxMDAsMCwwLC5MZXRleHRcbiIpOworICAgIGZwcmludGYoIG91dGZpbGUsICIuTGV0ZXh0OlxuIik7CisjZW5kaWYKKwogICAgIHJldHVybiAwOwogfQogCkBAIC0yMzg1LDEzICsyNTQ5LDEzIEBACiAgICAgaWYgKCFzdHJjbXAoIGFyZ3ZbMV0sICItc3BlYyIgKSkKICAgICAgICAgcmVzID0gQnVpbGRTcGVjKCBvdXRmaWxlLCBhcmdjLCBhcmd2ICk7CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsZnJvbTE2IiApKQotICAgICAgICByZXMgPSBCdWlsZENhbGxGcm9tMTYoIG91dGZpbGUsIGFyZ2MsIGFyZ3YgKTsKKyAgICAgICAgcmVzID0gQnVpbGRDYWxsRnJvbTE2KCBvdXRmaWxlLCBvdXRuYW1lLCBhcmdjLCBhcmd2ICk7CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsdG8xNiIgKSkKLSAgICAgICAgcmVzID0gQnVpbGRDYWxsVG8xNiggb3V0ZmlsZSwgYXJnYywgYXJndiApOworICAgICAgICByZXMgPSBCdWlsZENhbGxUbzE2KCBvdXRmaWxlLCBvdXRuYW1lLCBhcmdjLCBhcmd2ICk7CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsZnJvbTMyIiApKQotICAgICAgICByZXMgPSBCdWlsZENhbGxGcm9tMzIoIG91dGZpbGUsIGFyZ2MsIGFyZ3YgKTsKKyAgICAgICAgcmVzID0gQnVpbGRDYWxsRnJvbTMyKCBvdXRmaWxlLCBvdXRuYW1lLCBhcmdjLCBhcmd2ICk7CiAgICAgZWxzZSBpZiAoIXN0cmNtcCggYXJndlsxXSwgIi1jYWxsdG8zMiIgKSkKLSAgICAgICAgcmVzID0gQnVpbGRDYWxsVG8zMiggb3V0ZmlsZSwgYXJnYywgYXJndiApOworICAgICAgICByZXMgPSBCdWlsZENhbGxUbzMyKCBvdXRmaWxlLCBvdXRuYW1lLCBhcmdjLCBhcmd2ICk7CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgZmNsb3NlKCBvdXRmaWxlICk7CmRpZmYgLS1naXQgYS90b29scy9mbnQyYmRmLmMgYi90b29scy9mbnQyYmRmLmMKaW5kZXggZjM5MWI3OS4uOGU4ODllNiAxMDA2NDQKLS0tIGEvdG9vbHMvZm50MmJkZi5jCisrKyBiL3Rvb2xzL2ZudDJiZGYuYwpAQCAtMTIxLDcgKzEyMSw3IEBACiAgIGZudF9mb250UwljcGVfZm9udF9zdHJ1Y3Q7IAogICBpbnQgICAgIAlpYz0wLCB0OwogCi0gIGJjb3B5KGZpbGVfYnVmZmVyLCAoY2hhciAqKSAmY3BlX2ZvbnRfc3RydWN0Lmhkciwgc2l6ZW9mKGZudF9oZHJTKSk7CisgIG1lbWNweSgoY2hhciAqKSAmY3BlX2ZvbnRfc3RydWN0LmhkciwgZmlsZV9idWZmZXIsIHNpemVvZihmbnRfaGRyUykpOwogCiAgIC8qIGNoZWNrIGZvbnQgaGVhZGVyICovCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL21ha2Vfb3MyLnNoIGIvdG9vbHMvbWFrZV9vczIuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2NGM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL21ha2Vfb3MyLnNoCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9zaAorIyBHQ0NMT0FEIG5vdCBuZWVkZWQsIGJ1dCByZWNvbW1lbmRlZC4uLgorI0dDQ0xPQUQ9NQorQ0M9Z2NjCitZQUNDPSJiaXNvbiAteSIKK0xFWD0iZmxleCAtb2xleC55eS5jIgorUkFOTElCPSJhciAtcyIKK1BST0dFWFQ9Ii5leGUiCitleHBvcnQgQ0MgWUFDQyBMRVggUkFOTElCIFBST0dFWFQKKy4vY29uZmlndXJlIC0teC1pbmNsdWRlcz0kWDExUk9PVC9YRnJlZTg2L2luY2x1ZGUgLXgtbGlicmFyaWVzPSRYMTFST09UL1hGcmVlODYvbGliCmRpZmYgLS1naXQgYS93aW4zMi9jb2RlX3BhZ2UuYyBiL3dpbjMyL2NvZGVfcGFnZS5jCmluZGV4IDQ2MzUwNWYuLjYwNjczZGIgMTAwNjQ0Ci0tLSBhL3dpbjMyL2NvZGVfcGFnZS5jCisrKyBiL3dpbjMyL2NvZGVfcGFnZS5jCkBAIC04Miw4ICs4MiwxMCBAQAogCWludCBkb250X2NvcHk9IChkc3RsZW49PTApOwogCWlmKHBhZ2UhPUdldEFDUCgpICYmIHBhZ2UhPUNQX09FTUNQICYmIHBhZ2UhPUNQX0FDUCkKIAkJZnByaW50ZihzdGRuaW1wLCJDb252ZXJzaW9uIGluIENQICVkIG5vdCBzdXBwb3J0ZWRcbiIscGFnZSk7CisjaWYgMAogCWlmKGZsYWdzKQogCQlmcHJpbnRmKHN0ZG5pbXAsIldpZGVDaGFyVG9NdWx0aUJ5dGUgZmxhZ3MgJWx4IG5vdCBzdXBwb3J0ZWRcbiIsZmxhZ3MpOworI2VuZGlmCiAJaWYodXNlZCkKIAkJKnVzZWQ9MDsKIAl3aGlsZShzcmNsZW4gJiYgKGRvbnRfY29weSB8fCBkc3RsZW4pKQpAQCAtMTEyLDcgKzExNCwxMCBAQAogfQogCiAKLUJPT0wzMiBJc0RCQ1NMZWFkQnl0ZUV4KFVJTlQzMiBjb2RlcGFnZSwgQllURSB0ZXN0Y2hhcikKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzREJDU0xlYWRCeXRlRXggICAoS0VSTkVMMzIuMzU5KQorICovCitCT09MMzIgSXNEQkNTTGVhZEJ5dGVFeCggVUlOVDMyIGNvZGVwYWdlLCBCWVRFIHRlc3RjaGFyICkKIHsKICAgICBDUElORk8gY3BpbmZvOwogICAgIGludCBpOwpAQCAtMTI4LDcgKzEzMywyMCBAQAogICAgIHJldHVybiBGQUxTRTsKIH0KIAotQk9PTDMyIElzREJDU0xlYWRCeXRlKEJZVEUgdGVzdGNoYXIpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElzREJDU0xlYWRCeXRlMTYgICAoS0VSTkVMLjIwNykKKyAqLworQk9PTDE2IElzREJDU0xlYWRCeXRlMTYoIEJZVEUgdGVzdGNoYXIgKQoreworICAgIHJldHVybiBJc0RCQ1NMZWFkQnl0ZUV4KEdldEFDUCgpLCB0ZXN0Y2hhcik7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSXNEQkNTTGVhZEJ5dGUzMiAgIChLRVJORUwzMi4zNTgpCisgKi8KK0JPT0wzMiBJc0RCQ1NMZWFkQnl0ZTMyKCBCWVRFIHRlc3RjaGFyICkKIHsKICAgICByZXR1cm4gSXNEQkNTTGVhZEJ5dGVFeChHZXRBQ1AoKSwgdGVzdGNoYXIpOwogfQpkaWZmIC0tZ2l0IGEvd2luMzIvZmlsZS5jIGIvd2luMzIvZmlsZS5jCmluZGV4IDE2NWJlOWEuLmMwNTk1MzEgMTAwNjQ0Ci0tLSBhL3dpbjMyL2ZpbGUuYworKysgYi93aW4zMi9maWxlLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgImhhbmRsZTMyLmgiCi0jaW5jbHVkZSAiZG9zX2ZzLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjZGVmaW5lIERFQlVHX1dJTjMyCkBAIC02Niw3ICs2NSw4IEBACiAgICAgICAgIFNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX0hBTkRMRV9WQUxVRTMyOwogICAgIH0KLSAgICBmaWxlbWFwX29iaj0oRklMRU1BUF9PQkpFQ1QgKilDcmVhdGVLZXJuZWxPYmplY3Qoc2l6ZW9mKEZJTEVNQVBfT0JKRUNUKSk7CisgICAgZmlsZW1hcF9vYmo9KEZJTEVNQVBfT0JKRUNUICopSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEZJTEVNQVBfT0JKRUNUKSApOwogICAgIGlmKGZpbGVtYXBfb2JqID09IE5VTEwpIHsKICAgICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX1VOS05PV04pOwogICAgICAgICByZXR1cm4gMDsKQEAgLTEyOSw2OCArMTI5LDYgQEAKIH0KIAogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdldFN0ZEhhbmRsZSAgICAgICAgICAgICAoS0VSTkVMMzIuMjc2KQotICogRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSBhbGxvY2F0ZSBmaWxlaGFuZGxlcyBmb3Igc3RkaW4vc3Rkb3V0L3N0ZGVycgotICoJICBhdCB0YXNrIGNyZWF0aW9uICh3aXRoIEhGSUxFLWhhbmRsZSAwLDEsMiByZXNwZWN0aXZlbHkpIGFuZAotICoJICByZXR1cm4gdGhlbSBoZXJlLiBPciBhdCBsZWFzdCBsb29rLCBpZiB3ZSBjcmVhdGVkIHRoZW0gYWxyZWFkeS4KLSAqLwotSEZJTEUzMiBHZXRTdGRIYW5kbGUoRFdPUkQgblN0ZEhhbmRsZSkKLXsKLSAgICBIRklMRTMyIGhmaWxlOwotICAgIGludAl1bml4ZmQ7Ci0KLSAgICBzd2l0Y2goblN0ZEhhbmRsZSkKLSAgICB7Ci0gICAgICAgIGNhc2UgU1REX0lOUFVUX0hBTkRMRToKLQkgICAgdW5peGZkID0gMDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1REX09VVFBVVF9IQU5ETEU6Ci0JICAgIHVuaXhmZCA9IDE7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNURF9FUlJPUl9IQU5ETEU6Ci0JICAgIHVuaXhmZCA9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlZBTElEX0hBTkRMRSk7Ci0gICAgICAgICAgICByZXR1cm4gSEZJTEVfRVJST1IzMjsKLSAgICB9Ci0gICAgaGZpbGUgPSBGSUxFX0R1cFVuaXhIYW5kbGUodW5peGZkKTsKLSAgICBpZiAoaGZpbGUgPT0gSEZJTEVfRVJST1IzMikKLSAgICAJcmV0dXJuIEhGSUxFX0VSUk9SMzI7Ci0gICAgRklMRV9TZXRGaWxlVHlwZSggaGZpbGUsIEZJTEVfVFlQRV9DSEFSICk7Ci0gICAgcmV0dXJuIGhmaWxlOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIFNldEZpbGVQb2ludGVyICAgICAgICAgIChLRVJORUwzMi40OTIpCi0gKgotICogTHVja2lseSBlbm91Z2gsIHRoaXMgZnVuY3Rpb24gbWFwcyBhbG1vc3QgZGlyZWN0bHkgaW50byBhbiBsc2VlawotICogY2FsbCwgdGhlIGV4Y2VwdGlvbiBiZWluZyB0aGUgdXNlIG9mIDY0LWJpdCBvZmZzZXRzLgotICovCi1EV09SRCBTZXRGaWxlUG9pbnRlcihIRklMRTMyIGhGaWxlLCBMT05HIGRpc3RhbmNlLCBMT05HICpoaWdod29yZCwKLSAgICAgICAgICAgICAgICAgICAgIERXT1JEIG1ldGhvZCkKLXsKLSAgICBMT05HIHJjOwotICAgIGlmKGhpZ2h3b3JkICE9IE5VTEwpCi0gICAgewotICAgICAgICBpZigqaGlnaHdvcmQgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgZHByaW50Zl9maWxlKHN0ZGRlYiwgIlNldEZpbGVQb2ludGVyOiA2NC1iaXQgb2Zmc2V0cyBub3QgeWV0IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmMgPSBfbGxzZWVrMzIoaEZpbGUsIGRpc3RhbmNlLCBtZXRob2QpOwotICAgIGlmKHJjID09IC0xKQotICAgICAgICBTZXRMYXN0RXJyb3IoRXJybm9Ub0xhc3RFcnJvcihlcnJubykpOwotICAgIHJldHVybiByYzsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICBXcml0ZUZpbGUgICAgICAgICAgICAgICAoS0VSTkVMMzIuNTc4KQogICovCkBAIC0zNTQsMjYgKzI5MiwzMiBAQAogICovCiBCT09MMzIgU2V0RmlsZUF0dHJpYnV0ZXMzMkEoTFBDU1RSIGxwRmlsZU5hbWUsIERXT1JEIGF0dHJpYnV0ZXMpCiB7Ci0Jc3RydWN0IHN0YXQgYnVmOwotCUxQU1RSCWZuPShMUFNUUilET1NGU19HZXRVbml4RmlsZU5hbWUobHBGaWxlTmFtZSxGQUxTRSk7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIERPU19GVUxMX05BTUUgZnVsbF9uYW1lOwogCi0JZHByaW50Zl9maWxlKHN0ZGRlYiwiU2V0RmlsZUF0dHJpYnV0ZXMoJXMsJWx4KVxuIixscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOwotCWlmKHN0YXQoZm4sJmJ1Zik9PS0xKSB7Ci0JCVNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JaWYgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkgewotCQlidWYuc3RfbW9kZSAmPSB+MDIyMjsgLyogb2N0YWwhLCBjbGVhciB3cml0ZSBwZXJtaXNzaW9uIGJpdHMgKi8KLQkJYXR0cmlidXRlcyAmPSB+RklMRV9BVFRSSUJVVEVfUkVBRE9OTFk7Ci0JfQotCWF0dHJpYnV0ZXMgJj0gfihGSUxFX0FUVFJJQlVURV9ISURERU58RklMRV9BVFRSSUJVVEVfU1lTVEVNKTsKLQlpZiAoYXR0cmlidXRlcykKLQkJZnByaW50ZihzdGRuaW1wLCJTZXRGaWxlQXR0cmlidXRlc0EoJXMpOiVseCBhdHRyaWJ1dGUocykgbm90IGltcGxlbWVudGVkLlxuIixscEZpbGVOYW1lLGF0dHJpYnV0ZXMpOwotCWlmICgtMT09Y2htb2QoZm4sYnVmLnN0X21vZGUpKSB7Ci0JCVNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7Ci0JCXJldHVybiBGQUxTRTsKLQl9Ci0JcmV0dXJuIFRSVUU7CisgICAgaWYgKCFET1NGU19HZXRGdWxsTmFtZSggbHBGaWxlTmFtZSwgVFJVRSwgJmZ1bGxfbmFtZSApKQorICAgICAgICByZXR1cm4gRkFMU0U7CisKKyAgICBkcHJpbnRmX2ZpbGUoc3RkZGViLCJTZXRGaWxlQXR0cmlidXRlcyglcywlbHgpXG4iLGxwRmlsZU5hbWUsYXR0cmlidXRlcyk7CisgICAgaWYoc3RhdChmdWxsX25hbWUubG9uZ19uYW1lLCZidWYpPT0tMSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYgKGF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9SRUFET05MWSkKKyAgICB7CisgICAgICAgIGJ1Zi5zdF9tb2RlICY9IH4wMjIyOyAvKiBvY3RhbCEsIGNsZWFyIHdyaXRlIHBlcm1pc3Npb24gYml0cyAqLworICAgICAgICBhdHRyaWJ1dGVzICY9IH5GSUxFX0FUVFJJQlVURV9SRUFET05MWTsKKyAgICB9CisgICAgYXR0cmlidXRlcyAmPSB+KEZJTEVfQVRUUklCVVRFX0hJRERFTnxGSUxFX0FUVFJJQlVURV9TWVNURU0pOworICAgIGlmIChhdHRyaWJ1dGVzKQorICAgICAgICBmcHJpbnRmKHN0ZG5pbXAsIlNldEZpbGVBdHRyaWJ1dGVzQSglcyk6JWx4IGF0dHJpYnV0ZShzKSBub3QgaW1wbGVtZW50ZWQuXG4iLGxwRmlsZU5hbWUsYXR0cmlidXRlcyk7CisgICAgaWYgKC0xPT1jaG1vZChmdWxsX25hbWUubG9uZ19uYW1lLGJ1Zi5zdF9tb2RlKSkKKyAgICB7CisgICAgICAgIFNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKGVycm5vKSk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtMzg3LDUxICszMzEsNiBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIE1vdmVGaWxlQQkJKEtFUk5FTDMyLjM4NykKLSAqLwotQk9PTDMyIE1vdmVGaWxlMzJBKExQQ1NUUiBmbjEsTFBDU1RSIGZuMikKLXsKLQlMUFNUUgl1Zm4xOwotCUxQU1RSCXVmbjI7Ci0KLQlkcHJpbnRmX2ZpbGUoc3RkZGViLCJNb3ZlRmlsZUEoJXMsJXMpXG4iLGZuMSxmbjIpOwotCXVmbjEgPSAoTFBTVFIpRE9TRlNfR2V0VW5peEZpbGVOYW1lKGZuMSxGQUxTRSk7Ci0JaWYgKCF1Zm4xKSB7Ci0JCVNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKEVOT0VOVCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXVmbjEgPSB4c3RyZHVwKHVmbjEpOwotCXVmbjIgPSAoTFBTVFIpRE9TRlNfR2V0VW5peEZpbGVOYW1lKGZuMixGQUxTRSk7Ci0JaWYgKCF1Zm4yKSB7Ci0JCVNldExhc3RFcnJvcihFcnJub1RvTGFzdEVycm9yKEVOT0VOVCkpOwotCQlyZXR1cm4gRkFMU0U7Ci0JfQotCXVmbjIgPSB4c3RyZHVwKHVmbjIpOwotCWlmICgtMT09cmVuYW1lKHVmbjEsdWZuMikpIHsKLQkJU2V0TGFzdEVycm9yKEVycm5vVG9MYXN0RXJyb3IoZXJybm8pKTsKLQkJZnJlZSh1Zm4xKTsKLQkJZnJlZSh1Zm4yKTsKLQkJcmV0dXJuIEZBTFNFOwotCX0KLQlmcmVlKHVmbjEpOwotCWZyZWUodWZuMik7Ci0JcmV0dXJuIFRSVUU7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIE1vdmVGaWxlVwkJKEtFUk5FTDMyLjM5MCkKLSAqLwotQk9PTDMyIE1vdmVGaWxlMzJXKExQQ1dTVFIgZm4xLExQQ1dTVFIgZm4yKQotewotICAgIExQU1RSIGFmbjEgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGZuMSApOwotICAgIExQU1RSIGFmbjIgPSBIRUFQX3N0cmR1cFd0b0EoIEdldFByb2Nlc3NIZWFwKCksIDAsIGZuMiApOwotICAgIEJPT0wzMiByZXMgPSBNb3ZlRmlsZTMyQSggYWZuMSwgYWZuMiApOwotICAgIEhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBhZm4xICk7Ci0gICAgSGVhcEZyZWUoIEdldFByb2Nlc3NIZWFwKCksIDAsIGFmbjIgKTsKLSAgICByZXR1cm4gcmVzOwotfQotCiBWT0lEIFNldEZpbGVBcGlzVG9PRU0oKQogewogICAgIGZwcmludGYoc3RkbmltcCwiU2V0RmlsZUFwaXNUb09FTSgpLHN0dWIhXG4iKTsKQEAgLTQ0OSwzOCArMzQ4LDYgQEAKIH0KIAogCi1CT09MMzIgQ29weUZpbGUzMkEoTFBDU1RSIHNvdXJjZWZuLExQQ1NUUiBkZXN0Zm4sQk9PTDMyIGZhaWxpZmV4aXN0cykKLXsKLQlPRlNUUlVDVAlvZjsKLQlIRklMRTMyCQloZjEsaGYyOwotCWNoYXIJCWJ1ZmZlclsyMDQ4XTsKLQlpbnQJCWxhc3RyZWFkLGN1cmxlbjsKLQotCWZwcmludGYoc3RkZGViLCJDb3B5RmlsZTogJXMgLT4gJXNcbiIsc291cmNlZm4sZGVzdGZuKTsKLQloZjEgPSBPcGVuRmlsZTMyKHNvdXJjZWZuLCZvZixPRl9SRUFEKTsKLQlpZiAoaGYxPT1IRklMRV9FUlJPUjMyKSByZXR1cm4gVFJVRTsKLQlpZiAoZmFpbGlmZXhpc3RzKQotICAgICAgICB7Ci0JCWhmMiA9IE9wZW5GaWxlMzIoc291cmNlZm4sJm9mLE9GX1dSSVRFKTsKLQkJaWYgKGhmMiAhPSBIRklMRV9FUlJPUjMyKSByZXR1cm4gRkFMU0U7Ci0JCV9sY2xvc2UzMihoZjIpOwotCX0KLQloZjIgPSBPcGVuRmlsZTMyKHNvdXJjZWZuLCZvZixPRl9XUklURSk7Ci0JaWYgKGhmMiA9PSBIRklMRV9FUlJPUjMyKSByZXR1cm4gRkFMU0U7Ci0JY3VybGVuID0gMDsKLQl3aGlsZSAoKGxhc3RyZWFkPV9scmVhZDMyKGhmMSxidWZmZXIsc2l6ZW9mKGJ1ZmZlcikpKT4wKSB7Ci0JCWN1cmxlbj0wOwotCQl3aGlsZSAoY3VybGVuPGxhc3RyZWFkKSB7Ci0JCQlpbnQgcmVzID0gX2x3cml0ZTMyKGhmMixidWZmZXIrY3VybGVuLGxhc3RyZWFkLWN1cmxlbik7Ci0JCQlpZiAocmVzPD0wKSBicmVhazsKLQkJCWN1cmxlbis9cmVzOwotCQl9Ci0JfQotCV9sY2xvc2UzMihoZjEpOwotCV9sY2xvc2UzMihoZjIpOwotCXJldHVybiBjdXJsZW4gPiAwOwotfQotCiBCT09MMzIKIExvY2tGaWxlKAogCUhGSUxFMzIgaEZpbGUsRFdPUkQgZHdGaWxlT2Zmc2V0TG93LERXT1JEIGR3RmlsZU9mZnNldEhpZ2gsCmRpZmYgLS1naXQgYS93aW4zMi9tZW1vcnkuYyBiL3dpbjMyL21lbW9yeS5jCmluZGV4IGU4ZDA1NWMuLjlhMjI2MTUgMTAwNjQ0Ci0tLSBhL3dpbjMyL21lbW9yeS5jCisrKyBiL3dpbjMyL21lbW9yeS5jCkBAIC0xNSw3ICsxNSw3IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAid2luYmFzZS5oIgotI2luY2x1ZGUgImhhbmRsZTMyLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIApAQCAtMTM4LDcgKzEzOCw3IEBACiAKIFZSQU5HRV9PQkpFQ1QgKk1FTU9SWV9BbGxvY1ZyYW5nZShpbnQgc3RhcnQsaW50IHNpemUpCiB7Ci0JVlJBTkdFX09CSkVDVCAqcmV0PUNyZWF0ZUtlcm5lbE9iamVjdChzaXplb2YoVlJBTkdFX09CSkVDVCkpOworCVZSQU5HRV9PQkpFQ1QgKnJldD1IZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemVvZihWUkFOR0VfT0JKRUNUKSk7CiAJTUVNT1JZX0luc2VydFZyYW5nZShyZXQpOwogCXJldHVybiByZXQ7CiB9CkBAIC0xNDksNyArMTQ5LDcgQEAKIAlpZihNRU1PUllfcmFuZ2VzPT1yKQogCXsKIAkJTUVNT1JZX3Jhbmdlcz1yLT5uZXh0OwotCQlSZWxlYXNlS2VybmVsT2JqZWN0KHIpOworCQlIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgciApOwogCQlyZXR1cm47CiAJfQogCWZvcihpdD1NRU1PUllfcmFuZ2VzO2l0O2l0PWl0LT5uZXh0KQpAQCAtMTYwLDcgKzE2MCw3IEBACiAJCXJldHVybjsKIAl9CiAJaXQtPm5leHQ9ci0+bmV4dDsKLQlSZWxlYXNlS2VybmVsT2JqZWN0KHIpOworCUhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCByICk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpkaWZmIC0tZ2l0IGEvd2luMzIvc3RydWN0MzIuYyBiL3dpbjMyL3N0cnVjdDMyLmMKaW5kZXggNjI5YTc1YS4uNzc5NWM5ZSAxMDA2NDQKLS0tIGEvd2luMzIvc3RydWN0MzIuYworKysgYi93aW4zMi9zdHJ1Y3QzMi5jCkBAIC0xMSwyNSArMTEsNiBAQAogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKIAotdm9pZCBTVFJVQ1QzMl9QT0lOVDMydG8xNihjb25zdCBQT0lOVDMyKiBwMzIsIFBPSU5UMTYqIHAxNikKLXsKLQlwMTYtPnggPSBwMzItPng7Ci0JcDE2LT55ID0gcDMyLT55OwotfQotCi12b2lkIFNUUlVDVDMyX1BPSU5UMTZ0bzMyKGNvbnN0IFBPSU5UMTYqIHAxNiwgUE9JTlQzMiogcDMyKQotewotCXAzMi0+eCA9IHAxNi0+eDsKLQlwMzItPnkgPSBwMTYtPnk7Ci19Ci0KLXZvaWQgU1RSVUNUMzJfU0laRTE2dG8zMihjb25zdCBTSVpFMTYqIHAxNiwgU0laRTMyKiBwMzIpIAotICAKLXsKLSAgICAgICAgcDMyLT5jeCA9IHAxNi0+Y3g7Ci0gICAgICAgIHAzMi0+Y3kgPSBwMTYtPmN5OwotfQotCiB2b2lkIFNUUlVDVDMyX01TRzE2dG8zMihjb25zdCBNU0cxNiAqbXNnMTYsTVNHMzIgKm1zZzMyKQogewogCW1zZzMyLT5od25kPShEV09SRCltc2cxNi0+aHduZDsKQEAgLTUyLDIyICszMyw2IEBACiAJbXNnMTYtPnB0Lnk9bXNnMzItPnB0Lnk7CiB9CiAKLXZvaWQgU1RSVUNUMzJfUkVDVDMydG8xNihjb25zdCBSRUNUMzIqIHIzMiwgUkVDVDE2ICpyMTYpCi17Ci0JcjE2LT5sZWZ0ID0gcjMyLT5sZWZ0OwotCXIxNi0+cmlnaHQgPSByMzItPnJpZ2h0OwotCXIxNi0+dG9wID0gcjMyLT50b3A7Ci0JcjE2LT5ib3R0b20gPSByMzItPmJvdHRvbTsKLX0KLQotdm9pZCBTVFJVQ1QzMl9SRUNUMTZ0bzMyKGNvbnN0IFJFQ1QxNiogcjE2LCBSRUNUMzIgKnIzMikKLXsKLQlyMzItPmxlZnQgPSByMTYtPmxlZnQ7Ci0JcjMyLT5yaWdodCA9IHIxNi0+cmlnaHQ7Ci0JcjMyLT50b3AgPSByMTYtPnRvcDsKLQlyMzItPmJvdHRvbSA9IHIxNi0+Ym90dG9tOwotfQotCiB2b2lkIFNUUlVDVDMyX01JTk1BWElORk8zMnRvMTYoIGNvbnN0IE1JTk1BWElORk8zMiAqZnJvbSwgTUlOTUFYSU5GTzE2ICp0byApCiB7CiAgICAgQ09OVl9QT0lOVDMyVE8xNiggJmZyb20tPnB0UmVzZXJ2ZWQsICAgICAmdG8tPnB0UmVzZXJ2ZWQgKTsKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZGVmZGxnLmMgYi93aW5kb3dzL2RlZmRsZy5jCmluZGV4IDJjNmUxZTkuLmE0ODA4ZTkgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvZGVmZGxnLmMKKysrIGIvd2luZG93cy9kZWZkbGcuYwpAQCAtMjQsMTAgKzI0LDEwIEBACiAgICAgaWYgKElzQ2hpbGQoIGh3bmREbGcsIGh3bmRQcmV2ICkpCiAgICAgewogICAgICAgICBpZiAoU2VuZE1lc3NhZ2UxNiggaHduZFByZXYsIFdNX0dFVERMR0NPREUsIDAsIDAgKSAmIERMR0NfSEFTU0VUU0VMKQotICAgICAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZFByZXYsIEVNX1NFVFNFTCwgVFJVRSwgTUFLRUxPTkcoIC0xLCAwICkgKTsKKyAgICAgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRQcmV2LCBFTV9TRVRTRUwxNiwgVFJVRSwgTUFLRUxPTkcoIC0xLCAwICkgKTsKICAgICB9CiAgICAgaWYgKFNlbmRNZXNzYWdlMTYoIGh3bmRDdHJsLCBXTV9HRVRETEdDT0RFLCAwLCAwICkgJiBETEdDX0hBU1NFVFNFTCkKLSAgICAgICAgU2VuZE1lc3NhZ2UxNiggaHduZEN0cmwsIEVNX1NFVFNFTCwgRkFMU0UsIE1BS0VMT05HKCAwLCAtMSApICk7CisgICAgICAgIFNlbmRNZXNzYWdlMTYoIGh3bmRDdHJsLCBFTV9TRVRTRUwxNiwgRkFMU0UsIE1BS0VMT05HKCAwLCAtMSApICk7CiAgICAgU2V0Rm9jdXMzMiggaHduZEN0cmwgKTsKIH0KIApAQCAtMTQyLDcgKzE0Miw3IEBACiAJICAgICAgLyogRGVsZXRlIG1lbnUgKi8KIAkgICAgaWYgKGRsZ0luZm8tPmhNZW51KQogCSAgICB7CQkKLQkJRGVzdHJveU1lbnUoIGRsZ0luZm8tPmhNZW51ICk7CisJCURlc3Ryb3lNZW51MzIoIGRsZ0luZm8tPmhNZW51ICk7CiAJCWRsZ0luZm8tPmhNZW51ID0gMDsKIAkgICAgfQogCmRpZmYgLS1naXQgYS93aW5kb3dzL2RpYWxvZy5jIGIvd2luZG93cy9kaWFsb2cuYwppbmRleCAyMDQzN2UxLi5iY2Q3M2VhIDEwMDY0NAotLS0gYS93aW5kb3dzL2RpYWxvZy5jCisrKyBiL3dpbmRvd3MvZGlhbG9nLmMKQEAgLTU3MCw3ICs1NzAsNyBAQAogICAgIGlmICghaHduZCkKICAgICB7CiAJaWYgKGhGb250KSBEZWxldGVPYmplY3QzMiggaEZvbnQgKTsKLQlpZiAoaE1lbnUpIERlc3Ryb3lNZW51KCBoTWVudSApOworCWlmIChoTWVudSkgRGVzdHJveU1lbnUzMiggaE1lbnUgKTsKIAlyZXR1cm4gMDsKICAgICB9CiAgICAgd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTExOTMsOSArMTE5Myw5IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0RGlhbG9nQmFzZVVuaXRzICAgKFVTRVIuMjQzKQorICogICAgICAgICAgIEdldERpYWxvZ0Jhc2VVbml0cyAgIChVU0VSLjI0MykgKFVTRVIzMi4yMzIpCiAgKi8KLURXT1JEIEdldERpYWxvZ0Jhc2VVbml0cygpCitEV09SRCBHZXREaWFsb2dCYXNlVW5pdHModm9pZCkKIHsKICAgICByZXR1cm4gTUFLRUxPTkcoIHhCYXNlVW5pdCwgeUJhc2VVbml0ICk7CiB9CkBAIC0xNDkxLDcgKzE0OTEsNyBAQAogICAgICAgICBzdHJjcHkoIHRlbXAsICJBOlxcIiApOwogICAgICAgICB0ZW1wWzBdICs9IGRyaXZlOwogICAgICAgICBsc3RyY3B5bjMyQSggdGVtcCArIDMsIERSSVZFX0dldERvc0N3ZChkcml2ZSksIHNpemVvZih0ZW1wKS0zICk7Ci0gICAgICAgIEFuc2lMb3dlciggdGVtcCApOworICAgICAgICBDaGFyTG93ZXIzMkEoIHRlbXAgKTsKICAgICAgICAgLyogQ2FuJ3QgdXNlIFBvc3RNZXNzYWdlKCkgaGVyZSwgYmVjYXVzZSB0aGUgc3RyaW5nIGlzIG9uIHRoZSBzdGFjayAqLwogICAgICAgICBTZXREbGdJdGVtVGV4dDMyQSggaERsZywgaWRTdGF0aWMsIHRlbXAgKTsKICAgICB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2V2ZW50LmMgYi93aW5kb3dzL2V2ZW50LmMKaW5kZXggYWM4NTFlMy4uMTk0ODBkZCAxMDA2NDQKLS0tIGEvd2luZG93cy9ldmVudC5jCisrKyBiL3dpbmRvd3MvZXZlbnQuYwpAQCAtMzMsNyArMzMsNiBAQAogI2luY2x1ZGUgInF1ZXVlLmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCiAjaW5jbHVkZSAiZHJpdmUuaCIKLSNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKICNpbmNsdWRlICJrZXlib2FyZC5oIgpAQCAtNjgsNzMgKzY3LDYgQEAKIHN0YXRpYyBIV05EMzIgY2FwdHVyZVduZCA9IDA7CiBzdGF0aWMgQk9PTDMyIElucHV0RW5hYmxlZCA9IFRSVUU7CiAKLS8qIEtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlcyAqLwotc3RhdGljIGNvbnN0IGludCBzcGVjaWFsX2tleVtdID0KLXsKLSAgICBWS19CQUNLLCBWS19UQUIsIDAsIFZLX0NMRUFSLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAvKiBGRjA4ICovCi0gICAgMCwgMCwgMCwgVktfUEFVU0UsIFZLX1NDUk9MTCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgLyogRkYxMCAqLwotICAgIDAsIDAsIDAsIFZLX0VTQ0FQRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTggKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgY3Vyc29yX2tleVtdID0KLXsKLSAgICBWS19IT01FLCBWS19MRUZULCBWS19VUCwgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05FWFQsIFZLX0VORCAgICAgICAgICAvKiBGRjUwICovCi19OwotCi1zdGF0aWMgY29uc3QgaW50IG1pc2Nfa2V5W10gPQotewotICAgIFZLX1NFTEVDVCwgVktfU05BUFNIT1QsIFZLX0VYRUNVVEUsIFZLX0lOU0VSVCwgMCwgMCwgMCwgMCwgIC8qIEZGNjAgKi8KLSAgICBWS19DQU5DRUwsIFZLX0hFTFAsIFZLX0NBTkNFTCwgVktfTUVOVSAgICAgICAgICAgICAgICAgICAgICAvKiBGRjY4ICovCi19OwotCi1zdGF0aWMgY29uc3QgaW50IGtleXBhZF9rZXlbXSA9Ci17Ci0gICAgVktfTUVOVSwgVktfTlVNTE9DSywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY3RSAqLwotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODAgKi8KLSAgICAwLCAwLCAwLCAwLCAwLCBWS19SRVRVUk4sIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjg4ICovCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY5MCAqLwotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGOTggKi8KLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkEwICovCi0gICAgMCwgMCwgVktfTVVMVElQTFksIFZLX0FERCwgVktfU0VQQVJBVE9SLCBWS19TVUJUUkFDVCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfREVDSU1BTCwgVktfRElWSURFLCAgICAgICAgICAgLyogRkZBOCAqLwotICAgIFZLX05VTVBBRDAsIFZLX05VTVBBRDEsIFZLX05VTVBBRDIsIFZLX05VTVBBRDMsIFZLX05VTVBBRDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVktfTlVNUEFENSwgVktfTlVNUEFENiwgVktfTlVNUEFENywgLyogRkZCMCAqLwotICAgIFZLX05VTVBBRDgsIFZLX05VTVBBRDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGQjggKi8KLX07Ci0gICAgCi1zdGF0aWMgY29uc3QgaW50IGZ1bmN0aW9uX2tleVtdID0KLXsKLSAgICBWS19GMSwgVktfRjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkJFICovCi0gICAgVktfRjMsIFZLX0Y0LCBWS19GNSwgVktfRjYsIFZLX0Y3LCBWS19GOCwgVktfRjksIFZLX0YxMCwgICAgLyogRkZDMCAqLwotICAgIFZLX0YxMSwgVktfRjEyLCBWS19GMTMsIFZLX0YxNCwgVktfRjE1LCBWS19GMTYgICAgICAgICAgICAgIC8qIEZGQzggKi8KLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQgbW9kaWZpZXJfa2V5W10gPQotewotICAgIFZLX1NISUZULCBWS19TSElGVCwgVktfQ09OVFJPTCwgVktfQ09OVFJPTCwgVktfQ0FQSVRBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsICAgICAgICAgICAvKiBGRkUxICovCi0gICAgMCwgVktfTUVOVSwgVktfTUVOVSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZFOCAqLwotfTsKLQotdHlwZWRlZiB1bmlvbgotewotICAgIHN0cnVjdAotICAgIHsKLQl1bnNpZ25lZCBsb25nIGNvdW50IDogMTY7Ci0JdW5zaWduZWQgbG9uZyBjb2RlIDogODsKLQl1bnNpZ25lZCBsb25nIGV4dGVuZGVkIDogMTsKLQl1bnNpZ25lZCBsb25nIHVudXNlZCA6IDI7Ci0JdW5zaWduZWQgbG9uZyB3aW5faW50ZXJuYWwgOiAyOwotCXVuc2lnbmVkIGxvbmcgY29udGV4dCA6IDE7Ci0JdW5zaWduZWQgbG9uZyBwcmV2aW91cyA6IDE7Ci0JdW5zaWduZWQgbG9uZyB0cmFuc2l0aW9uIDogMTsKLSAgICB9IGxwMTsKLSAgICB1bnNpZ25lZCBsb25nIGxwMjsKLX0gS0VZTFA7Ci0KLXN0YXRpYyBCT09MIEtleURvd24gPSBGQUxTRTsKLQogc3RhdGljIEF0b20gd21Qcm90b2NvbHMgPSBOb25lOwogc3RhdGljIEF0b20gd21EZWxldGVXaW5kb3cgPSBOb25lOwogc3RhdGljIEF0b20gZG5kUHJvdG9jb2wgPSBOb25lOwpAQCAtNTE3LDE4ICs0NDksMzQ4IEBACiAgKgogICogSGFuZGxlIGEgWCBrZXkgZXZlbnQKICAqLworCisvKiBLZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZXMgKi8KK3N0YXRpYyBjb25zdCBpbnQgc3BlY2lhbF9rZXlbXSA9Cit7CisgICAgVktfQkFDSywgVktfVEFCLCAwLCBWS19DTEVBUiwgMCwgVktfUkVUVVJOLCAwLCAwLCAgICAgICAgICAgLyogRkYwOCAqLworICAgIDAsIDAsIDAsIFZLX1BBVVNFLCBWS19TQ1JPTEwsIDAsIDAsIDAsICAgICAgICAgICAgICAgICAgICAgIC8qIEZGMTAgKi8KKyAgICAwLCAwLCAwLCBWS19FU0NBUEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRjE4ICovCit9OworCitzdGF0aWMgY29uc3QgaW50IGN1cnNvcl9rZXlbXSA9Cit7CisgICAgVktfSE9NRSwgVktfTEVGVCwgVktfVVAsIFZLX1JJR0hULCBWS19ET1dOLCBWS19QUklPUiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWS19ORVhULCBWS19FTkQgICAgICAgICAgLyogRkY1MCAqLworfTsKKworc3RhdGljIGNvbnN0IGludCBtaXNjX2tleVtdID0KK3sKKyAgICBWS19TRUxFQ1QsIFZLX1NOQVBTSE9ULCBWS19FWEVDVVRFLCBWS19JTlNFUlQsIDAsIDAsIDAsIDAsICAvKiBGRjYwICovCisgICAgVktfQ0FOQ0VMLCBWS19IRUxQLCBWS19DQU5DRUwsIFZLX01FTlUgICAgICAgICAgICAgICAgICAgICAgLyogRkY2OCAqLworfTsKKworc3RhdGljIGNvbnN0IGludCBrZXlwYWRfa2V5W10gPQoreworICAgIDAsIFZLX05VTUxPQ0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkvKiBGRjdFICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkY4MCAqLworICAgIDAsIDAsIDAsIDAsIDAsIFZLX1JFVFVSTiwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGODggKi8KKyAgICAwLCAwLCAwLCAwLCAwLCBWS19IT01FLCBWS19MRUZULCBWS19VUCwgICAgICAgICAgICAgICAgICAgICAvKiBGRjkwICovCisgICAgVktfUklHSFQsIFZLX0RPV04sIFZLX1BSSU9SLCBWS19ORVhULCBWS19FTkQsIDAsCisJCQkJIFZLX0lOU0VSVCwgVktfREVMRVRFLCAgICAgICAgICAvKiBGRjk4ICovCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZBMCAqLworICAgIDAsIDAsIFZLX01VTFRJUExZLCBWS19BREQsIFZLX1NFUEFSQVRPUiwgVktfU1VCVFJBQ1QsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX0RFQ0lNQUwsIFZLX0RJVklERSwgICAgICAgICAgIC8qIEZGQTggKi8KKyAgICBWS19OVU1QQUQwLCBWS19OVU1QQUQxLCBWS19OVU1QQUQyLCBWS19OVU1QQUQzLCBWS19OVU1QQUQ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZLX05VTVBBRDUsIFZLX05VTVBBRDYsIFZLX05VTVBBRDcsIC8qIEZGQjAgKi8KKyAgICBWS19OVU1QQUQ4LCBWS19OVU1QQUQ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRkI4ICovCit9OworICAgIAorc3RhdGljIGNvbnN0IGludCBmdW5jdGlvbl9rZXlbXSA9Cit7CisgICAgVktfRjEsIFZLX0YyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRkZCRSAqLworICAgIFZLX0YzLCBWS19GNCwgVktfRjUsIFZLX0Y2LCBWS19GNywgVktfRjgsIFZLX0Y5LCBWS19GMTAsICAgIC8qIEZGQzAgKi8KKyAgICBWS19GMTEsIFZLX0YxMiwgVktfRjEzLCBWS19GMTQsIFZLX0YxNSwgVktfRjE2ICAgICAgICAgICAgICAvKiBGRkM4ICovCit9OworCitzdGF0aWMgY29uc3QgaW50IG1vZGlmaWVyX2tleVtdID0KK3sKKyAgICBWS19TSElGVCwgVktfU0hJRlQsIFZLX0NPTlRST0wsIFZLX0NPTlRST0wsIFZLX0NBUElUQUwsIDAsIC8qIEZGRTEgKi8KKyAgICBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VLCBWS19NRU5VICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZGRTcgKi8KK307CisKK3N0YXRpYyBpbnQgQWx0R3JNYXNrOworc3RhdGljIGludCBtaW5fa2V5Y29kZSwgbWF4X2tleWNvZGU7CitzdGF0aWMgaW50IGtleWMydmtleSBbMjU2XTsKKy8qIEZvciBleGFtcGxlIDoga2V5YzJ2a2V5WzEwXSBpcyB0aGUgVktfKiBhc3NvY2lhdGVkIHdpdGgga2V5Y29kZTEwICovCisKK3N0YXRpYyBXT1JEIEVWRU5UX2V2ZW50X3RvX3ZrZXkoIFhLZXlFdmVudCAqZSkKK3sKKyAgc3RhdGljIGludCBrZXlzeW1zX3Blcl9rZXljb2RlOworICBpbnQgaTsKKyAgS2V5U3ltIGtleXN5bTsKKworICBpZiAoIWtleXN5bXNfcGVyX2tleWNvZGUpIC8qIEZpcnN0IHRpbWUgOiBJbml0aWFsaXphdGlvbiAqLworICAgIHsKKyAgICAgIEtleVN5bSAqa3NwOworICAgICAgWE1vZGlmaWVyS2V5bWFwICptbXA7CisgICAgICBLZXlDb2RlICprY3A7CisgICAgICBYS2V5RXZlbnQgZTI7CisgICAgICBXT1JEIHZrZXksIE9FTXZrZXk7CisKKyAgICAgIFhEaXNwbGF5S2V5Y29kZXMoZS0+ZGlzcGxheSwgJm1pbl9rZXljb2RlLCAmbWF4X2tleWNvZGUpOworICAgICAga3NwID0gWEdldEtleWJvYXJkTWFwcGluZyhlLT5kaXNwbGF5LCBtaW5fa2V5Y29kZSwKKwkJCQltYXhfa2V5Y29kZSArIDEgLSBtaW5fa2V5Y29kZSwgJmtleXN5bXNfcGVyX2tleWNvZGUpOworICAgICAgLyogV2UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiBrZXlzeW1zX3Blcl9rZXljb2RlLgorCSBUaGVyZSBpcyBubyBuZWVkIHRvIGhvbGQgYSBsb2NhbCBjb3B5IG9mIHRoZSBrZXlzeW1zIHRhYmxlICovCisgICAgICBYRnJlZShrc3ApOworICAgICAgbW1wID0gWEdldE1vZGlmaWVyTWFwcGluZyhlLT5kaXNwbGF5KTsKKyAgICAgIGtjcCA9IG1tcC0+bW9kaWZpZXJtYXA7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgODsgaSArPSAxKSAvKiBUaGVyZSBhcmUgOCBtb2RpZmllciBrZXlzICovCisJeworCSAgaW50IGo7CisKKwkgIGZvciAoaiA9IDA7IGogPCBtbXAtPm1heF9rZXlwZXJtb2Q7IGogKz0gMSwga2NwICs9IDEpCisJICAgIGlmICgqa2NwKQorCSAgICAgIHsKKwkJaW50IGs7CisKKwkJZm9yIChrID0gMDsgayA8IGtleXN5bXNfcGVyX2tleWNvZGU7IGsgKz0gMSkKKwkJICBpZiAoWEtleWNvZGVUb0tleXN5bShlLT5kaXNwbGF5LCAqa2NwLCBrKQorCQkgICAgICA9PSBYS19Nb2RlX3N3aXRjaCkKKwkJICAgIHsKKwkJICAgICAgQWx0R3JNYXNrID0gMSA8PCBpOworCQkgICAgICBkcHJpbnRmX2tleShzdGRkZWIsICJBbHRHck1hc2sgaXMgJXhcbiIsIEFsdEdyTWFzayk7CisJCSAgICB9CisJICAgICAgfQorCX0KKyAgICAgIFhGcmVlTW9kaWZpZXJtYXAobW1wKTsKKwkKKwkvKiBOb3cgYnVpbGQgdHdvIGNvbnZlcnNpb24gYXJyYXlzIDoKKwkgKiBrZXljb2RlIC0+IHZrZXkgKyBleHRlbmRlZAorCSAqIHZrZXkgKyBleHRlbmRlZCAtPiBrZXljb2RlICovCisKKyAgICAgIGUyLmRpc3BsYXkgPSBlLT5kaXNwbGF5OworICAgICAgZTIuc3RhdGUgPSAwOworCisgICAgICBPRU12a2V5ID0gMHhiOTsgLyogZmlyc3QgT0VNIHZpcnR1YWwga2V5IGF2YWlsYWJsZSBpcyBiYSAqLworICAgICAgZm9yIChlMi5rZXljb2RlPW1pbl9rZXljb2RlOyBlMi5rZXljb2RlPD1tYXhfa2V5Y29kZTsgZTIua2V5Y29kZSsrKQorCXsKKwkgIFhMb29rdXBTdHJpbmcoJmUyLCBOVUxMLCAwLCAma2V5c3ltLCBOVUxMKTsKKwkgIHZrZXkgPSAwOworCSAgaWYgKGtleXN5bSkgIC8qIG90aGVyd2lzZSwga2V5Y29kZSBub3QgdXNlZCAqLworCSAgICB7CisJICAgICAgaWYgKChrZXlzeW0gPj4gOCkgPT0gMHhGRikgICAgICAgICAvKiBub24tY2hhcmFjdGVyIGtleSAqLworCQl7CisJCSAgaW50IGtleSA9IGtleXN5bSAmIDB4ZmY7CisJCQorCQkgIGlmIChrZXkgPj0gMHgwOCAmJiBrZXkgPD0gMHgxQikgICAgICAgICAvKiBzcGVjaWFsIGtleSAqLworCQkgICAgdmtleSA9IHNwZWNpYWxfa2V5W2tleSAtIDB4MDhdOworCQkgIGVsc2UgaWYgKGtleSA+PSAweDUwICYmIGtleSA8PSAweDU3KSAgICAvKiBjdXJzb3Iga2V5ICovCisJCSAgICB2a2V5ID0gY3Vyc29yX2tleVtrZXkgLSAweDUwXTsKKwkJICBlbHNlIGlmIChrZXkgPj0gMHg2MCAmJiBrZXkgPD0gMHg2QikgICAgLyogbWlzY2VsbGFuZW91cyBrZXkgKi8KKwkJICAgIHZrZXkgPSBtaXNjX2tleVtrZXkgLSAweDYwXTsKKwkJICBlbHNlIGlmIChrZXkgPj0gMHg3RSAmJiBrZXkgPD0gMHhCOSkgICAgLyoga2V5cGFkIGtleSAqLworCQkgICAgdmtleSA9IGtleXBhZF9rZXlba2V5IC0gMHg3RV07CisJCSAgZWxzZSBpZiAoa2V5ID49IDB4QkUgJiYga2V5IDw9IDB4Q0QpICAgIC8qIGZ1bmN0aW9uIGtleSAqLworCQkgICAgeworCQkgICAgICB2a2V5ID0gZnVuY3Rpb25fa2V5W2tleSAtIDB4QkVdOworCQkgICAgICB2a2V5IHw9IDB4MTAwOyAvKiBzZXQgZXh0ZW5kZWQgYml0ICovCisJCSAgICB9CisJCSAgZWxzZSBpZiAoa2V5ID49IDB4RTEgJiYga2V5IDw9IDB4RUEpICAgIC8qIG1vZGlmaWVyIGtleSAqLworCQkgICAgdmtleSA9IG1vZGlmaWVyX2tleVtrZXkgLSAweEUxXTsKKwkJICBlbHNlIGlmIChrZXkgPT0gMHhGRikgICAgICAgICAgICAgICAgICAgLyogREVMIGtleSAqLworCQkgICAgdmtleSA9IFZLX0RFTEVURTsKKwkJICAvKiBleHRlbmRlZCBtdXN0IGFsc28gYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAorCQkgICAgIElOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKKwkJICAgICBrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLworCQkgIHN3aXRjaCAoa2V5c3ltKQorCQkgICAgeworCQkgICAgY2FzZSBYS19Db250cm9sX1IgOgorCQkgICAgY2FzZSBYS19BbHRfUiA6CisJCSAgICBjYXNlIFhLX0luc2VydCA6CisJCSAgICBjYXNlIFhLX0RlbGV0ZSA6CisJCSAgICBjYXNlIFhLX0hvbWUgOgorCQkgICAgY2FzZSBYS19FbmQgOgorCQkgICAgY2FzZSBYS19QcmlvciA6CisJCSAgICBjYXNlIFhLX05leHQgOgorCQkgICAgY2FzZSBYS19MZWZ0IDoKKwkJICAgIGNhc2UgWEtfVXAgOgorCQkgICAgY2FzZSBYS19SaWdodCA6CisJCSAgICBjYXNlIFhLX0Rvd24gOgorCQkgICAgY2FzZSBYS19LUF9EaXZpZGUgOgorCQkgICAgY2FzZSBYS19LUF9FbnRlciA6CisJCSAgICAgIHZrZXkgfD0gMHgxMDA7CisJCSAgICB9CisJCX0KKwkgICAgICBmb3IgKGkgPSAwOyAoaSA8IGtleXN5bXNfcGVyX2tleWNvZGUpICYmICghdmtleSk7IGkrKykKKwkJeworCQkgIGtleXN5bSA9IFhMb29rdXBLZXlzeW0oJmUyLCBpKTsKKwkJICBpZiAoKGtleXN5bSA+PSBWS18wICYmIGtleXN5bSA8PSBWS185KQorCQkgICAgICB8fCAoa2V5c3ltID49IFZLX0EgJiYga2V5c3ltIDw9IFZLX1opCisJCSAgICAgIHx8IGtleXN5bSA9PSBWS19TUEFDRSkKKwkJICAgIHZrZXkgPSBrZXlzeW07CisJCX0KKworCSAgICAgIGlmICghdmtleSkKKwkJeworCQkgIC8qIE90aGVycyBrZXlzOiBsZXQncyBhc3NpZ24gT0VNIHZpcnR1YWwga2V5IGNvZGVzIGluIHRoZSBhbGxvd2VkIHJhbmdlLAorCQkgICAqIHRoYXQgaXMgKFsweGJhLDB4YzBdLCBbMHhkYiwweGU0XSwgMHhlNiAoZ2l2ZW4gdXApIGV0IFsweGU5LDB4ZjVdKSAqLworCQkgIHN3aXRjaCAoKytPRU12a2V5KQorCQkgICAgeworCQkgICAgY2FzZSAweGMxIDogT0VNdmtleT0weGRiOyBicmVhazsKKwkJICAgIGNhc2UgMHhlNSA6IE9FTXZrZXk9MHhlOTsgYnJlYWs7CisJCSAgICBjYXNlIDB4ZjYgOiBPRU12a2V5PTB4ZjU7IGZwcmludGYoc3RkZXJyLCJObyBtb3JlIE9FTSB2a2V5IGF2YWlsYWJsZSFcbiIpOworCQkgICAgfQorCQkgIAorCQkgIHZrZXkgPSBPRU12a2V5OworCQkgIAorCQkgIGlmIChkZWJ1Z2dpbmdfa2V5Ym9hcmQpCisJCSAgICB7CisJCSAgICAgIGZwcmludGYoc3RkZGViLCJPRU0gc3BlY2lmaWMgdmlydHVhbCBrZXkgJVggYXNzaWduZWQgdG8ga2V5Y29kZSAlWCA6XG4gKCIKKwkJCSAgICAgICxPRU12a2V5LGUyLmtleWNvZGUpOworCQkgICAgICBmb3IgKGkgPSAwOyBpIDwga2V5c3ltc19wZXJfa2V5Y29kZTsgaSArPSAxKQorCQkJeworCQkJICBjaGFyCSprc25hbWU7CisJCQkgIAorCQkJICBrZXlzeW0gPSBYTG9va3VwS2V5c3ltKCZlMiwgaSk7CisJCQkgIGtzbmFtZSA9IFhLZXlzeW1Ub1N0cmluZyhrZXlzeW0pOworCQkJICBpZiAoIWtzbmFtZSkKKwkJCSAgICBrc25hbWUgPSAiTm9TeW1ib2wiOworCQkJICBmcHJpbnRmKHN0ZGRlYiwgIiVsWCAoJXMpICIsIGtleXN5bSwga3NuYW1lKTsKKwkJCX0KKwkJICAgICAgZnByaW50ZihzdGRkZWIsICIpXG4iKTsKKwkJICAgIH0KKwkJfQorCSAgICB9CisJICBrZXljMnZrZXlbZTIua2V5Y29kZV0gPSB2a2V5OworCX0gLyogZm9yICovCisgICAgfSAvKiBJbml0aWFsaXphdGlvbiAqLworICAKKyAgcmV0dXJuIGtleWMydmtleVtlLT5rZXljb2RlXTsKKyAgCit9CisKK2ludCBFVkVOVF9Ub0FzY2lpKFdPUkQgd1ZpcnRLZXksIFdPUkQgd1NjYW5Db2RlLCBMUFNUUiBscEtleVN0YXRlLCAKKwlMUFZPSUQgbHBDaGFyLCBXT1JEIHdGbGFncykgCit7CisgICAgWEtleUV2ZW50IGU7CisgICAgS2V5U3ltIGtleXN5bTsKKyAgICBzdGF0aWMgWENvbXBvc2VTdGF0dXMgY3M7CisgICAgaW50IHJldDsKKyAgICBXT1JEIGtleWM7CisKKyAgICBlLmRpc3BsYXkgPSBkaXNwbGF5OworICAgIGUua2V5Y29kZSA9IDA7CisgICAgZm9yIChrZXljPW1pbl9rZXljb2RlOyBrZXljPD1tYXhfa2V5Y29kZTsga2V5YysrKQorICAgICAgeyAvKiB0aGlzIGNvdWxkIGJlIHNwZWVkIHVwIGJ5IG1ha2luZyBhbm90aGVyIHRhYmxlLCBhbiBhcnJheSBvZiBzdHJ1Y3QgdmtleSxrZXljb2RlCisJICogKHZrZXkgLT4ga2V5Y29kZSkgd2l0aCB2a2V5cyBzb3J0ZWQgLi4uLiBidXQgaXQgdGFrZXMgbWVtb3J5ICg1MTIqMyBieXRlcykhICBERiAqLworCWlmICgoa2V5YzJ2a2V5W2tleWNdICYgMHhGRik9PSB3VmlydEtleSkgLyogbm8gbmVlZCB0byBtYWtlIGEgbW9yZSBwcmVjaXNlIHRlc3QgKHdpdGggdGhlIGV4dGVuZGVkIGJpdCBjb3JyZWN0bHkgc2V0IGFib3ZlIHdWaXJ0S2V5IC4uLiBWSyogYXJlIGRpZmZlcmVudCBlbm91Z2guLi4gKi8KKwkgIHsKKwkgICAgaWYgKChlLmtleWNvZGUpICYmICgod1ZpcnRLZXk8MHgxMCkgfHwgKHdWaXJ0S2V5PjB4MTIpKSkgCisJCS8qIGl0J3Mgbm9ybWFsIHRvIGhhdmUgMiBzaGlmdCwgY29udHJvbCwgYW5kIGFsdCAhICovCisJCWRwcmludGZfa2V5Ym9hcmQoc3RkZGViLCJTdHJhbmdlIC4uLiB0aGUga2V5Y29kZXMgJVggYW5kICVYIGFyZSBtYXRjaGluZyFcbiIsCisJCQkJIGUua2V5Y29kZSxrZXljKTsKKwkgICAgZS5rZXljb2RlID0ga2V5YzsKKwkgIH0KKyAgICAgIH0KKyAgICBpZiAoIWUua2V5Y29kZSkgCisgICAgICB7CisJZnByaW50ZihzdGRlcnIsIlVua25vd24gdmlydHVhbCBrZXkgJVggISEhIFxuIix3VmlydEtleSk7CisJcmV0dXJuIHdWaXJ0S2V5OyAvKiB3aGF0ZXZlciAqLworICAgICAgfQorICAgIGUuc3RhdGUgPSAwOworICAgIGlmIChscEtleVN0YXRlW1ZLX1NISUZUXSAmIDB4ODApCisJZS5zdGF0ZSB8PSBTaGlmdE1hc2s7CisgICAgaWYgKGxwS2V5U3RhdGVbVktfQ0FQSVRBTF0gJiAweDgwKQorCWUuc3RhdGUgfD0gTG9ja01hc2s7CisgICAgaWYgKGxwS2V5U3RhdGVbVktfQ09OVFJPTF0gJiAweDgwKQorCWlmIChscEtleVN0YXRlW1ZLX01FTlVdICYgMHg4MCkKKwkgICAgZS5zdGF0ZSB8PSBBbHRHck1hc2s7CisJZWxzZQorCSAgICBlLnN0YXRlIHw9IENvbnRyb2xNYXNrOworICAgIGlmIChscEtleVN0YXRlW1ZLX05VTUxPQ0tdICYgMHg4MCkKKwllLnN0YXRlIHw9IE1vZDJNYXNrOworICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIkVWRU5UX1RvQXNjaWkoJTA0WCwgJTA0WCkgOiBmYWtlZCBzdGF0ZSA9ICVYXG4iLAorCQl3VmlydEtleSwgd1NjYW5Db2RlLCBlLnN0YXRlKTsKKyAgICByZXQgPSBYTG9va3VwU3RyaW5nKCZlLCBscENoYXIsIDIsICZrZXlzeW0sICZjcyk7CisgICAgaWYgKHJldCA9PSAwKQorCXsKKwlCWVRFIGRlYWRfY2hhciA9IDA7CisKKwkoKGNoYXIqKWxwQ2hhcilbMV0gPSAnXDAnOworCXN3aXRjaCAoa2V5c3ltKQorCSAgICB7CisJICAgIGNhc2UgWEtfZGVhZF90aWxkZSA6CisJICAgIGNhc2UgMHgxMDAwRkU3RSA6IC8qIFhmcmVlJ3MgWEtfRHRpbGRlICovCisJCWRlYWRfY2hhciA9ICd+JzsKKwkJYnJlYWs7CisJICAgIGNhc2UgWEtfZGVhZF9hY3V0ZSA6CisJICAgIGNhc2UgMHgxMDAwRkUyNyA6IC8qIFhmcmVlJ3MgWEtfRGFjdXRlX2FjY2VudCAqLworCQlkZWFkX2NoYXIgPSAweGI0OworCQlicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2NpcmN1bWZsZXggOgorCSAgICBjYXNlIDB4MTAwMEZFNUUgOiAvKiBYZnJlZSdzIFhLX0RjaXJjdW1mbGV4X2FjY2VudCAqLworCQlkZWFkX2NoYXIgPSAnXic7CisJCWJyZWFrOworCSAgICBjYXNlIFhLX2RlYWRfZ3JhdmUgOgorCSAgICBjYXNlIDB4MTAwMEZFNjAgOiAvKiBYZnJlZSdzIFhLX0RncmF2ZV9hY2NlbnQgKi8KKwkJZGVhZF9jaGFyID0gJ2AnOworCQlicmVhazsKKwkgICAgY2FzZSBYS19kZWFkX2RpYWVyZXNpcyA6CisJICAgIGNhc2UgMHgxMDAwRkUyMiA6IC8qIFhmcmVlJ3MgWEtfRGRpYWVyZXNpcyAqLworCQlkZWFkX2NoYXIgPSAweGE4OworCQlicmVhazsKKwkgICAgfQorCWlmIChkZWFkX2NoYXIpCisJICAgIHsKKwkgICAgKihjaGFyKilscENoYXIgPSBkZWFkX2NoYXI7CisJICAgIHJldCA9IC0xOworCSAgICB9CisJZWxzZQorCSAgICB7CisJICAgIGNoYXIJKmtzbmFtZTsKKworCSAgICBrc25hbWUgPSBYS2V5c3ltVG9TdHJpbmcoa2V5c3ltKTsKKwkgICAgaWYgKCFrc25hbWUpCisJCWtzbmFtZSA9ICJObyBOYW1lIjsKKwkgICAgaWYgKChrZXlzeW0gPj4gOCkgIT0gMHhmZikKKwkJeworCQlmcHJpbnRmKHN0ZGVyciwgIlBsZWFzZSByZXBvcnQgOiBubyBjaGFyIGZvciBrZXlzeW0gJTA0bFggKCVzKSA6XG4iLAorCQkJa2V5c3ltLCBrc25hbWUpOworCQlmcHJpbnRmKHN0ZGVyciwgIiAgd1ZpcnRLZXkgPSAlWCwgd1NjYW5Db2RlID0gJVgsIGtleWNvZGUgPSAlWCwgc3RhdGUgPSAlWFxuIiwKKwkJCXdWaXJ0S2V5LCB3U2NhbkNvZGUsIGUua2V5Y29kZSwgZS5zdGF0ZSk7CisJCX0KKwkgICAgfQorCX0KKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJFVkVOVF9Ub0FzY2lpIGFib3V0IHRvIHJldHVybiAlZCB3aXRoIGNoYXIgJXhcbiIsCisJCXJldCwgKihjaGFyKilscENoYXIpOworICAgIHJldHVybiByZXQ7Cit9CisKK3R5cGVkZWYgdW5pb24KK3sKKyAgICBzdHJ1Y3QKKyAgICB7CisJdW5zaWduZWQgbG9uZyBjb3VudCA6IDE2OworCXVuc2lnbmVkIGxvbmcgY29kZSA6IDg7CisJdW5zaWduZWQgbG9uZyBleHRlbmRlZCA6IDE7CisJdW5zaWduZWQgbG9uZyB1bnVzZWQgOiAyOworCXVuc2lnbmVkIGxvbmcgd2luX2ludGVybmFsIDogMjsKKwl1bnNpZ25lZCBsb25nIGNvbnRleHQgOiAxOworCXVuc2lnbmVkIGxvbmcgcHJldmlvdXMgOiAxOworCXVuc2lnbmVkIGxvbmcgdHJhbnNpdGlvbiA6IDE7CisgICAgfSBscDE7CisgICAgdW5zaWduZWQgbG9uZyBscDI7Cit9IEtFWUxQOworCiBzdGF0aWMgdm9pZCBFVkVOVF9rZXkoIFhLZXlFdmVudCAqZXZlbnQgKQogewogICAgIGNoYXIgU3RyWzI0XTsgCiAgICAgWENvbXBvc2VTdGF0dXMgY3M7IAogICAgIEtleVN5bSBrZXlzeW07CiAgICAgV09SRCB2a2V5ID0gMDsKLSAgICBXT1JEIHhrZXksIGtleV90eXBlLCBrZXk7CiAgICAgS0VZTFAga2V5bHA7Ci0gICAgQk9PTCBleHRlbmRlZCA9IEZBTFNFOworICAgIFdPUkQgbWVzc2FnZTsKKyAgICBzdGF0aWMgQk9PTCBmb3JjZV9leHRlbmRlZCA9IEZBTFNFOyAvKiBoYWNrIGZvciBBbHRHciB0cmFuc2xhdGlvbiAqLwogCiAgICAgaW50IGFzY2lpX2NoYXJzID0gWExvb2t1cFN0cmluZyhldmVudCwgU3RyLCAxLCAma2V5c3ltLCAmY3MpOwogCisgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiRVZFTlRfa2V5IDogc3RhdGUgPSAlWFxuIiwgZXZlbnQtPnN0YXRlKTsKKyAgICBpZiAoa2V5c3ltID09IFhLX01vZGVfc3dpdGNoKQorCXsKKwlkcHJpbnRmX2tleShzdGRkZWIsICJBbHQgR3Iga2V5IGV2ZW50IHJlY2VpdmVkXG4iKTsKKwlldmVudC0+a2V5Y29kZSA9IFhLZXlzeW1Ub0tleWNvZGUoZXZlbnQtPmRpc3BsYXksIFhLX0NvbnRyb2xfTCk7CisJZHByaW50Zl9rZXkoc3RkZGViLCAiQ29udHJvbF9MIGlzIGtleWNvZGUgMHgleFxuIiwgZXZlbnQtPmtleWNvZGUpOworCUVWRU5UX2tleShldmVudCk7CisJZXZlbnQtPmtleWNvZGUgPSBYS2V5c3ltVG9LZXljb2RlKGV2ZW50LT5kaXNwbGF5LCBYS19BbHRfTCk7CisJZHByaW50Zl9rZXkoc3RkZGViLCAiQWx0X0wgaXMga2V5Y29kZSAweCV4XG4iLCBldmVudC0+a2V5Y29kZSk7CisJZm9yY2VfZXh0ZW5kZWQgPSBUUlVFOworCUVWRU5UX2tleShldmVudCk7CisJZm9yY2VfZXh0ZW5kZWQgPSBGQUxTRTsKKwlyZXR1cm47CisJfQorCiAgICAgU3RyW2FzY2lpX2NoYXJzXSA9ICdcMCc7CiAgICAgaWYgKGRlYnVnZ2luZ19rZXkpCiAJewpAQCAtNTM3LDggKzc5OSw5IEBACiAJa3NuYW1lID0gWEtleXN5bVRvU3RyaW5nKGtleXN5bSk7CiAJaWYgKCFrc25hbWUpCiAJICAgIGtzbmFtZSA9ICJObyBOYW1lIjsKLQlmcHJpbnRmKHN0ZGRlYiwgIldNX0tFWT8/PyA6IGtleXN5bT0lbFggKCVzKSwgYXNjaWkgY2hhcnM9JXUgLyAlWCAvICclcydcbiIsIAotCSAgIGtleXN5bSwga3NuYW1lLCBhc2NpaV9jaGFycywgU3RyWzBdLCBTdHIpOworCWZwcmludGYoc3RkZGViLCAiJXMgOiBrZXlzeW09JWxYICglcyksIGFzY2lpIGNoYXJzPSV1IC8gJVggLyAnJXMnXG4iLCAKKwkgICAgZXZlbnRfbmFtZXNbZXZlbnQtPnR5cGVdLCBrZXlzeW0sIGtzbmFtZSwKKwkgICAgYXNjaWlfY2hhcnMsIFN0clswXSAmIDB4ZmYsIFN0cik7CiAJfQogCiAjaWYgMApAQCAtNTQ4LDExOSArODExLDUxIEBACiAgICAgICAgIERFQlVHX0VudGVyRGVidWdnZXIoKTsKICNlbmRpZgogCi0gICAgeGtleSA9IExPV09SRChrZXlzeW0pOwotICAgIGtleV90eXBlID0gSElCWVRFKHhrZXkpOwotICAgIGtleSA9IExPQllURSh4a2V5KTsKLSAgICBkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIGtleV90eXBlPSVYLCBrZXk9JVhcbiIsIGtleV90eXBlLCBrZXkpOworICAgIHZrZXkgPSBFVkVOVF9ldmVudF90b192a2V5KGV2ZW50KTsKKyAgICBpZiAoZm9yY2VfZXh0ZW5kZWQpIHZrZXkgfD0gMHgxMDA7CiAKLSAgICBpZiAoa2V5X3R5cGUgPT0gMHhGRikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vbi1jaGFyYWN0ZXIga2V5ICovCi0gICAgewotCWlmIChrZXkgPj0gMHgwOCAmJiBrZXkgPD0gMHgxQikgICAgICAgICAgICAvKiBzcGVjaWFsIGtleSAqLwotCSAgICB2a2V5ID0gc3BlY2lhbF9rZXlba2V5IC0gMHgwOF07Ci0JZWxzZSBpZiAoa2V5ID49IDB4NTAgJiYga2V5IDw9IDB4NTcpICAgICAgIC8qIGN1cnNvciBrZXkgKi8KLQkgICAgdmtleSA9IGN1cnNvcl9rZXlba2V5IC0gMHg1MF07Ci0JZWxzZSBpZiAoa2V5ID49IDB4NjAgJiYga2V5IDw9IDB4NkIpICAgICAgIC8qIG1pc2NlbGxhbmVvdXMga2V5ICovCi0JICAgIHZrZXkgPSBtaXNjX2tleVtrZXkgLSAweDYwXTsKLQllbHNlIGlmIChrZXkgPj0gMHg3RSAmJiBrZXkgPD0gMHhCOSkgICAgICAgLyoga2V5cGFkIGtleSAqLwotCXsKLQkgICAgdmtleSA9IGtleXBhZF9rZXlba2V5IC0gMHg3RV07Ci0JICAgIGV4dGVuZGVkID0gVFJVRTsKLQl9Ci0JZWxzZSBpZiAoa2V5ID49IDB4QkUgJiYga2V5IDw9IDB4Q0QpICAgICAgIC8qIGZ1bmN0aW9uIGtleSAqLwotCXsKLQkgICAgdmtleSA9IGZ1bmN0aW9uX2tleVtrZXkgLSAweEJFXTsKLQkgICAgZXh0ZW5kZWQgPSBUUlVFOwotCX0KLQllbHNlIGlmIChrZXkgPj0gMHhFMSAmJiBrZXkgPD0gMHhFQSkgICAgICAgLyogbW9kaWZpZXIga2V5ICovCi0JICAgIHZrZXkgPSBtb2RpZmllcl9rZXlba2V5IC0gMHhFMV07Ci0JZWxzZSBpZiAoa2V5ID09IDB4RkYpICAgICAgICAgICAgICAgICAgICAgIC8qIERFTCBrZXkgKi8KLQkgICAgdmtleSA9IFZLX0RFTEVURTsKLQkvKiBleHRlbmRlZCBtdXN0IGFsc28gYmUgc2V0IGZvciBBTFRfUiwgQ1RSTF9SLAotCUlOUywgREVMLCBIT01FLCBFTkQsIFBBR0VfVVAsIFBBR0VfRE9XTiwgQVJST1cga2V5cywKLQlrZXlwYWQgLyBhbmQga2V5cGFkIEVOVEVSIChTREsgMy4xIFZvbC4zIHAgMTM4KSAqLwotCXN3aXRjaCAoa2V5c3ltKQotCSAgICB7Ci0JICAgIGNhc2UgWEtfQ29udHJvbF9SIDoKLQkgICAgY2FzZSBYS19BbHRfUiA6Ci0JICAgIGNhc2UgWEtfSW5zZXJ0IDoKLQkgICAgY2FzZSBYS19EZWxldGUgOgotCSAgICBjYXNlIFhLX0hvbWUgOgotCSAgICBjYXNlIFhLX0VuZCA6Ci0JICAgIGNhc2UgWEtfUHJpb3IgOgotCSAgICBjYXNlIFhLX05leHQgOgotCSAgICBjYXNlIFhLX0xlZnQgOgotCSAgICBjYXNlIFhLX1VwIDoKLQkgICAgY2FzZSBYS19SaWdodCA6Ci0JICAgIGNhc2UgWEtfRG93biA6Ci0JICAgIGNhc2UgWEtfS1BfRGl2aWRlIDoKLQkgICAgY2FzZSBYS19LUF9FbnRlciA6Ci0JCWV4dGVuZGVkID0gMTsKLQkgICAgfQotICAgIH0KLSAgICBlbHNlIGlmIChrZXlfdHlwZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBrZXkgKi8KLSAgICB7Ci0JaWYgKCBpc2FsbnVtKGtleSkgKQotCSAgICAgdmtleSA9IHRvdXBwZXIoa2V5KTsgICAgICAgICAgICAgICAgICAvKiBjb252ZXJ0IGxjIHRvIHVjICovCi0JZWxzZSBpZiAoIGlzc3BhY2Uoa2V5KSApCi0JICB2a2V5ID0ga2V5OwkJCQkgICAvKiBYWFggYXBwcm94aW1hdGVseSAqLwotICAgICAgICBlbHNlICAKLQkgIHN3aXRjaCAoa2V5KQkJCQkgICAvKiB0aGUgcmVzdC4uLiAqLwotCSAgewotI2RlZmluZSB2a2Nhc2Uoayx2YWwpIGNhc2UgazogdmtleSA9IHZhbDsgYnJlYWs7Ci0jZGVmaW5lIHZrY2FzZTIoazEsazIsdmFsKSBjYXNlIGsxOiBjYXNlIGsyOiB2a2V5ID0gdmFsOyBicmVhazsKLQkgICAgV0lORV9WS0VZX01BUFBJTkdTCi0jdW5kZWYgdmtjYXNlCi0jdW5kZWYgdmtjYXNlMgotCSAgICBkZWZhdWx0OgotCSAgICAgIGZwcmludGYoIHN0ZGVyciwgIlVua25vd24ga2V5ISBQbGVhc2UgcmVwb3J0IVxuIiApOwotCSAgICAgIHZrZXkgPSAwOwkJCQkgICAvKiB3aGF0ZXZlciAqLwotCSAgfQotICAgIH0KKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJrZXljb2RlIDB4JXggY29udmVydGVkIHRvIHZrZXkgMHgleFxuIiwKKwkJICAgIGV2ZW50LT5rZXljb2RlLCB2a2V5KTsKIAorICAgIGtleWxwLmxwMS5jb3VudCA9IDE7CisgICAga2V5bHAubHAxLmNvZGUgPSBMT0JZVEUoZXZlbnQtPmtleWNvZGUpIC0gODsKKyAgICBrZXlscC5scDEuZXh0ZW5kZWQgPSAodmtleSAmIDB4MTAwID8gMSA6IDApOworICAgIGtleWxwLmxwMS53aW5faW50ZXJuYWwgPSAwOyAvKiB0aGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBkaWFsb2dzLCAKKwkJCQkqIGRvbid0IHJlbWVtYmVyIHdoZXJlIEkgcmVhZCBpdCAtIEFLICovCisJCQkJLyogaXQncyAnMScgdW5kZXIgd2luZG93cywgd2hlbiBhIGRpYWxvZyBib3ggYXBwZWFycworCQkJCSAqIGFuZCB5b3UgcHJlc3Mgb25lIG9mIHRoZSB1bmRlcmxpbmVkIGtleXMgLSBERiovCisgICAgdmtleSAmPSAweGZmOwogICAgIGlmIChldmVudC0+dHlwZSA9PSBLZXlQcmVzcykKICAgICB7CisJa2V5bHAubHAxLnByZXZpb3VzID0gKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApICE9IDA7CiAgICAgICAgIGlmICghKElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApKQogICAgICAgICAgICAgSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldIF49IDB4MDE7CiAJSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldIHw9IDB4ODA7Ci0Ja2V5bHAubHAxLmNvdW50ID0gMTsKLQlrZXlscC5scDEuY29kZSA9IExPQllURShldmVudC0+a2V5Y29kZSkgLSA4OwotCWtleWxwLmxwMS5leHRlbmRlZCA9IChleHRlbmRlZCA/IDEgOiAwKTsKLQlrZXlscC5scDEud2luX2ludGVybmFsID0gMDsJCQkvKiB0aGlzIGhhcyBzb21ldGhpbmcgdG8gZG8gd2l0aCBkaWFsb2dzLCAKLQkJCQkJCQkgKiBkb24ndCByZW1lbWJlciB3aGVyZSBJIHJlYWQgaXQgLSBBSyAqLwotCWtleWxwLmxwMS5jb250ZXh0ID0gKCAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2spIHx8IAotCQkJICAgICAgIChJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwKSkgPyAxIDogMDsKLQlrZXlscC5scDEucHJldmlvdXMgPSAoS2V5RG93biA/IDAgOiAxKTsKIAlrZXlscC5scDEudHJhbnNpdGlvbiA9IDA7Ci0JZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICB3UGFyYW09JVgsIGxQYXJhbT0lbFhcbiIsIAotCQkgICAgdmtleSwga2V5bHAubHAyICk7Ci0JZHByaW50Zl9rZXkoc3RkZGViLCIgICAgICAgICAgICBJbnB1dEtleVN0YXRlPSVYXG4iLCBJbnB1dEtleVN0YXRlVGFibGVbdmtleV0pOwotCWhhcmR3YXJlX2V2ZW50KCBJbnB1dEtleVN0YXRlVGFibGVbVktfTUVOVV0gJiAweDgwID8gV01fU1lTS0VZRE9XTiA6IFdNX0tFWURPV04sIAotCQkgICAgICAgIHZrZXksIGtleWxwLmxwMiwKLQkJICAgICAgICBldmVudC0+eF9yb290IC0gZGVza3RvcFgsIGV2ZW50LT55X3Jvb3QgLSBkZXNrdG9wWSwKLQkJICAgICAgICBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCApOwotCUtleURvd24gPSBUUlVFOworCW1lc3NhZ2UgPSAoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdICYgMHg4MCkKKwkJICAgICYmICEoSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX0NPTlRST0xdICYgMHg4MCkKKwkJCSA/IFdNX1NZU0tFWURPV04gOiBXTV9LRVlET1dOOwogICAgIH0KICAgICBlbHNlCiAgICAgewotCVVJTlQgc3lzS2V5ID0gSW5wdXRLZXlTdGF0ZVRhYmxlW1ZLX01FTlVdOworCVVJTlQgc3lzS2V5ID0gKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApCisJCQkmJiAhKElucHV0S2V5U3RhdGVUYWJsZVtWS19DT05UUk9MXSAmIDB4ODApCisJCQkmJiAoZm9yY2VfZXh0ZW5kZWQgPT0gRkFMU0UpOyAvKiBmb3IgQWx0IGZyb20gQWx0R3IgKi8KIAogCUlucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSAmPSB+MHg4MDsgCi0Ja2V5bHAubHAxLmNvdW50ID0gMTsKLQlrZXlscC5scDEuY29kZSA9IExPQllURShldmVudC0+a2V5Y29kZSkgLSA4OwotCWtleWxwLmxwMS5leHRlbmRlZCA9IChleHRlbmRlZCA/IDEgOiAwKTsKLQlrZXlscC5scDEud2luX2ludGVybmFsID0gMDsKLQlrZXlscC5scDEuY29udGV4dCA9IChldmVudC0+c3RhdGUgJiBNb2QxTWFzayA/IDEgOiAwKTsKIAlrZXlscC5scDEucHJldmlvdXMgPSAxOwogCWtleWxwLmxwMS50cmFuc2l0aW9uID0gMTsKLQlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIHdQYXJhbT0lWCwgbFBhcmFtPSVsWFxuIiwgCi0JCSAgICB2a2V5LCBrZXlscC5scDIgKTsKLQlkcHJpbnRmX2tleShzdGRkZWIsIiAgICAgICAgICAgIElucHV0S2V5U3RhdGU9JVhcbiIsIElucHV0S2V5U3RhdGVUYWJsZVt2a2V5XSk7Ci0JaGFyZHdhcmVfZXZlbnQoIHN5c0tleSAmIDB4ODAgPyBXTV9TWVNLRVlVUCA6IFdNX0tFWVVQLCAKLQkJICAgICAgICB2a2V5LCBrZXlscC5scDIsCi0JCSAgICAgICAgZXZlbnQtPnhfcm9vdCAtIGRlc2t0b3BYLCBldmVudC0+eV9yb290IC0gZGVza3RvcFksCi0JCSAgICAgICAgZXZlbnQtPnRpbWUgLSBNU0dfV2luZVN0YXJ0VGlja3MsIDAgKTsKLQlLZXlEb3duID0gRkFMU0U7CisJbWVzc2FnZSA9IHN5c0tleSA/IFdNX1NZU0tFWVVQIDogV01fS0VZVVA7CiAgICAgfQorICAgIGtleWxwLmxwMS5jb250ZXh0ID0gKCAoZXZlbnQtPnN0YXRlICYgTW9kMU1hc2spICB8fCAKKwkJCSAgKElucHV0S2V5U3RhdGVUYWJsZVtWS19NRU5VXSAmIDB4ODApKSA/IDEgOiAwOworICAgIGRwcmludGZfa2V5KHN0ZGRlYiwiICAgICAgICAgICAgd1BhcmFtPSUwNFgsIGxQYXJhbT0lMDhsWFxuIiwgCisJCXZrZXksIGtleWxwLmxwMiApOworICAgIGRwcmludGZfa2V5KHN0ZGRlYiwiICAgICAgICAgICAgSW5wdXRLZXlTdGF0ZT0lWFxuIiwKKwkJSW5wdXRLZXlTdGF0ZVRhYmxlW3ZrZXldKTsKKworICAgIGhhcmR3YXJlX2V2ZW50KCBtZXNzYWdlLCB2a2V5LCBrZXlscC5scDIsIGV2ZW50LT54X3Jvb3QgLSBkZXNrdG9wWCwKKwkgICAgZXZlbnQtPnlfcm9vdCAtIGRlc2t0b3BZLCBldmVudC0+dGltZSAtIE1TR19XaW5lU3RhcnRUaWNrcywgMCApOwogfQogCiAKQEAgLTk1MiwxMCArMTE0NywxMCBAQAogCSAgdW5pb24gewogCQkgICBBdG9tCQlhdG9tX2F1eDsKIAkJICAgUE9JTlQzMglwdF9hdXg7Ci0JCSAgIEJPT0wxNgliQWNjZXB0OwogCQkgICBpbnQJCWk7CiAJCX0JCXU7CiAJICBpbnQJCQl4LCB5OworICAgICAgICAgIEJPT0wxNgkgICAgICAgIGJBY2NlcHQ7CiAJICBIR0xPQkFMMTYJCWhEcmFnSW5mbyA9IEdsb2JhbEFsbG9jMTYoIEdNRU1fU0hBUkUgfCBHTUVNX1pFUk9JTklULCBzaXplb2YoRFJBR0lORk8pKTsKIAkgIExQRFJBR0lORk8gICAgICAgICAgICBscERyYWdJbmZvID0gKExQRFJBR0lORk8pIEdsb2JhbExvY2sxNihoRHJhZ0luZm8pOwogCSAgU0VHUFRSCQlzcERyYWdJbmZvID0gKFNFR1BUUikgV0lOMTZfR2xvYmFsTG9jazE2KGhEcmFnSW5mbyk7CkBAIC05NzQsMTYgKzExNjksMTYgQEAKIAkgIGlmKCB4IDwgMCB8fCB5IDwgMCB8fAogCSAgICAgIHggPiAocFduZC0+cmVjdFdpbmRvdy5yaWdodCAtIHBXbmQtPnJlY3RXaW5kb3cubGVmdCkgfHwKIAkgICAgICB5ID4gKHBXbmQtPnJlY3RXaW5kb3cuYm90dG9tIC0gcFduZC0+cmVjdFdpbmRvdy50b3ApICkKLQkgIHsgICB1LmJBY2NlcHQgPSBwV25kLT5kd0V4U3R5bGUgJiBXU19FWF9BQ0NFUFRGSUxFUzsgeCA9IHkgPSAwOyB9CisJICB7ICAgYkFjY2VwdCA9IHBXbmQtPmR3RXhTdHlsZSAmIFdTX0VYX0FDQ0VQVEZJTEVTOyB4ID0geSA9IDA7IH0KIAkgIGVsc2UKIAkgIHsKLQkgICAgICB1LmJBY2NlcHQgPSBEUkFHX1F1ZXJ5VXBkYXRlKCBwV25kLT5od25kU2VsZiwgc3BEcmFnSW5mbywgVFJVRSApOworCSAgICAgIGJBY2NlcHQgPSBEUkFHX1F1ZXJ5VXBkYXRlKCBwV25kLT5od25kU2VsZiwgc3BEcmFnSW5mbywgVFJVRSApOwogCSAgICAgIHggPSBscERyYWdJbmZvLT5wdC54OyB5ID0gbHBEcmFnSW5mby0+cHQueTsKIAkgIH0KIAkgIHBEcm9wV25kID0gV0lOX0ZpbmRXbmRQdHIoIGxwRHJhZ0luZm8tPmhTY29wZSApOwogCSAgR2xvYmFsRnJlZTE2KCBoRHJhZ0luZm8gKTsKIAotCSAgaWYoIHUuYkFjY2VwdCApCisJICBpZiggYkFjY2VwdCApCiAJICB7CiAJICAgICAgWEdldFdpbmRvd1Byb3BlcnR5KCBkaXNwbGF5LCBEZWZhdWx0Um9vdFdpbmRvdyhkaXNwbGF5KSwKIAkJCSAgICAgIGRuZFNlbGVjdGlvbiwgMCwgNjU1MzUsIEZBTFNFLApAQCAtOTkyLDIwICsxMTg3LDIwIEBACiAKIAkgICAgICBpZiggIWF1eF9sb25nICYmIHBfZGF0YSkJLyogZG9uJ3QgYm90aGVyIGlmID4gNjRLICovCiAJICAgICAgewotCQljaGFyKgkJCXAgPSAoY2hhciopIHBfZGF0YTsKLQkJY2hhcioJCQlwX2ZpbGVuYW1lLCpwX2Ryb3A7CisJCWNoYXIgKnAgPSAoY2hhciopIHBfZGF0YTsKKwkJY2hhciAqcF9kcm9wOwogCiAJCWF1eF9sb25nID0gMDsgCiAJCXdoaWxlKCAqcCApCS8qIGNhbGN1bGF0ZSBidWZmZXIgc2l6ZSAqLwogCQl7CiAJCSAgcF9kcm9wID0gcDsKIAkJICBpZigodS5pID0gKnApICE9IC0xICkgCi0JCSAgICAgIHUuaSA9IERSSVZFX0ZpbmREcml2ZVJvb3QoIChjb25zdCBjaGFyKiopJnBfZHJvcCApOworCQkgICAgICB1LmkgPSBEUklWRV9GaW5kRHJpdmVSb290KCAoY29uc3QgY2hhciAqKikmcF9kcm9wICk7CiAJCSAgaWYoIHUuaSA9PSAtMSApICpwID0gLTE7CS8qIG1hcmsgYXMgImJhZCIgKi8KIAkJICBlbHNlCiAJCSAgewotCQkgICAgICBwX2ZpbGVuYW1lID0gKGNoYXIqKSBET1NGU19HZXREb3NUcnVlTmFtZSggKGNvbnN0IGNoYXIqKXAsIFRSVUUgKTsKLQkJICAgICAgaWYoIHBfZmlsZW5hbWUgKSBhdXhfbG9uZyArPSBzdHJsZW4ocF9maWxlbmFtZSkgKyAxOworICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGxlbiA9IEdldFNob3J0UGF0aE5hbWUzMkEoIHAsIE5VTEwsIDAgKTsKKyAgICAgICAgICAgICAgICAgICAgICBpZiAobGVuKSBhdXhfbG9uZyArPSBsZW4gKyAxOwogCQkgICAgICBlbHNlICpwID0gLTE7CiAJCSAgfQogCQkgIHAgKz0gc3RybGVuKHApICsgMTsKQEAgLTEwMzUsOSArMTIzMCw4IEBACiAJCSAgICB7CiAJCSAgICAgIGlmKCAqcCAhPSAtMSApCS8qIHVzZSBvbmx5ICJnb29kIiBlbnRyaWVzICovCiAJCSAgICAgIHsKLQkJCXBfZmlsZW5hbWUgPSAoY2hhciopIERPU0ZTX0dldERvc1RydWVOYW1lKCBwLCBUUlVFICk7Ci0JCQlzdHJjcHkocF9kcm9wLCBwX2ZpbGVuYW1lKTsKLQkJCXBfZHJvcCArPSBzdHJsZW4oIHBfZmlsZW5hbWUgKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNob3J0UGF0aE5hbWUzMkEoIHAsIHBfZHJvcCwgNjU1MzUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcF9kcm9wICs9IHN0cmxlbiggcF9kcm9wICkgKyAxOwogCQkgICAgICB9CiAJCSAgICAgIHAgKz0gc3RybGVuKHApICsgMTsKIAkJICAgIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvZ3JhcGhpY3MuYyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwppbmRleCBjYWY4NjVlLi44ZGQxZDY1IDEwMDY0NAotLS0gYS93aW5kb3dzL2dyYXBoaWNzLmMKKysrIGIvd2luZG93cy9ncmFwaGljcy5jCkBAIC0xNCw2ICsxNCw3IEBACiAjZGVmaW5lIFBJIE1fUEkKICNlbmRpZgogI2luY2x1ZGUgImdyYXBoaWNzLmgiCisjaW5jbHVkZSAiZ2RpLmgiCiAjaW5jbHVkZSAiZGMuaCIKICNpbmNsdWRlICJiaXRtYXAuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpAQCAtNDAsMjQgKzQxLDEwIEBACiAgKi8KIEJPT0wzMiBMaW5lVG8zMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5ICkKIHsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiBGQUxTRTsKLQlNRl9NZXRhUGFyYW0yKGRjLCBNRVRBX0xJTkVUTywgeCwgeSk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgfQorICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CiAKLSAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiggZGMgKSkKLQlYRHJhd0xpbmUoZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCi0JCSAgZGMtPncuRENPcmdYICsgWExQVE9EUCggZGMsIGRjLT53LkN1cnNQb3NYICksCi0JCSAgZGMtPncuRENPcmdZICsgWUxQVE9EUCggZGMsIGRjLT53LkN1cnNQb3NZICksCi0JCSAgZGMtPncuRENPcmdYICsgWExQVE9EUCggZGMsIHggKSwKLQkJICBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgeSApICk7Ci0gICAgZGMtPncuQ3Vyc1Bvc1ggPSB4OwotICAgIGRjLT53LkN1cnNQb3NZID0geTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wTGluZVRvICYmCisgICAgCSAgIGRjLT5mdW5jcy0+cExpbmVUbyhkYyx4LHkpOwogfQogCiAKQEAgLTY2LDE5ICs1MywxMSBAQAogICovCiBEV09SRCBNb3ZlVG8oIEhEQzE2IGhkYywgSU5UMTYgeCwgSU5UMTYgeSApCiB7Ci0gICAgRFdPUkQgcmV0OwotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7Ci0JaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotCU1GX01ldGFQYXJhbTIoZGMsIE1FVEFfTU9WRVRPLCB4LCB5KTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0ID0gTUFLRUxPTkcoIGRjLT53LkN1cnNQb3NYLCBkYy0+dy5DdXJzUG9zWSApOwotICAgIGRjLT53LkN1cnNQb3NYID0geDsKLSAgICBkYy0+dy5DdXJzUG9zWSA9IHk7Ci0gICAgcmV0dXJuIHJldDsKKyAgICBQT0lOVDE2CXB0OworCisgICAgaWYgKCFNb3ZlVG9FeDE2KGhkYyx4LHksJnB0KSkKKyAgICAJcmV0dXJuIDA7CisgICAgcmV0dXJuIE1BS0VMT05HKHB0LngscHQueSk7CiB9CiAKIApAQCAtODcsMTYgKzY2LDEyIEBACiAgKi8KIEJPT0wxNiBNb3ZlVG9FeDE2KCBIREMxNiBoZGMsIElOVDE2IHgsIElOVDE2IHksIExQUE9JTlQxNiBwdCApCiB7Ci0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotICAgIGlmIChwdCkKLSAgICB7Ci0JcHQtPnggPSBkYy0+dy5DdXJzUG9zWDsKLQlwdC0+eSA9IGRjLT53LkN1cnNQb3NZOwotICAgIH0KLSAgICBkYy0+dy5DdXJzUG9zWCA9IHg7Ci0gICAgZGMtPncuQ3Vyc1Bvc1kgPSB5OworICAgIFBPSU5UMzIgcHQzMjsKKworICAgIGlmICghTW92ZVRvRXgzMiggKEhEQzMyKWhkYywgKElOVDMyKXgsIChJTlQzMil5LCAmcHQzMiApKSByZXR1cm4gRkFMU0U7CisgICAgaWYgKHB0KSBDT05WX1BPSU5UMzJUTzE2KCAmcHQzMiwgcHQgKTsKICAgICByZXR1cm4gVFJVRTsKKwogfQogCiAKQEAgLTEwNSwxMDQgKzgwLDEwIEBACiAgKi8KIEJPT0wzMiBNb3ZlVG9FeDMyKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHksIExQUE9JTlQzMiBwdCApCiB7Ci0gICAgUE9JTlQxNiBwdDE2OwotICAgIGlmICghTW92ZVRvRXgxNiggKEhEQzE2KWhkYywgKElOVDE2KXgsIChJTlQxNil5LCAmcHQxNiApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKHB0KSBDT05WX1BPSU5UMTZUTzMyKCAmcHQxNiwgcHQgKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHUkFQSF9EcmF3QXJjCi0gKgotICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgQXJjKCksIENob3JkKCkgYW5kIFBpZSgpLgotICogJ2xpbmVzJyBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGRyYXc6IDAgZm9yIEFyYywgMSBmb3IgQ2hvcmQsIDIgZm9yIFBpZS4KLSAqLwotc3RhdGljIEJPT0wzMiBHUkFQSF9EcmF3QXJjKCBIREMzMiBoZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGJvdHRvbSwgSU5UMzIgeHN0YXJ0LCBJTlQzMiB5c3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIHhlbmQsIElOVDMyIHllbmQsIElOVDMyIGxpbmVzICkKLXsKLSAgICBJTlQzMiB4Y2VudGVyLCB5Y2VudGVyLCBpc3RhcnRfYW5nbGUsIGlkaWZmX2FuZ2xlLCB0bXA7Ci0gICAgZG91YmxlIHN0YXJ0X2FuZ2xlLCBlbmRfYW5nbGU7Ci0gICAgWFBvaW50IHBvaW50c1szXTsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiBGQUxTRTsKLQlzd2l0Y2ggKGxpbmVzKQotCXsKLQljYXNlIDA6Ci0JICAgIE1GX01ldGFQYXJhbTgoZGMsIE1FVEFfQVJDLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCi0JCQkgIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLCB5ZW5kKTsKLQkgICAgYnJlYWs7Ci0KLQljYXNlIDE6Ci0JICAgIE1GX01ldGFQYXJhbTgoZGMsIE1FVEFfQ0hPUkQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKLQkJCSAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQpOwotCSAgICBicmVhazsKLQotCWNhc2UgMjoKLQkgICAgTUZfTWV0YVBhcmFtOChkYywgTUVUQV9QSUUsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKLQkJCSAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQpOwotCSAgICBicmVhazsKLQl9Ci0JcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbGVmdCAgID0gWExQVE9EUCggZGMsIGxlZnQgKTsKLSAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7Ci0gICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJpZ2h0ICk7Ci0gICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOwotICAgIHhzdGFydCA9IFhMUFRPRFAoIGRjLCB4c3RhcnQgKTsKLSAgICB5c3RhcnQgPSBZTFBUT0RQKCBkYywgeXN0YXJ0ICk7Ci0gICAgeGVuZCAgID0gWExQVE9EUCggZGMsIHhlbmQgKTsKLSAgICB5ZW5kICAgPSBZTFBUT0RQKCBkYywgeWVuZCApOwotICAgIGlmICgobGVmdCA9PSByaWdodCkgfHwgKHRvcCA9PSBib3R0b20pKSByZXR1cm4gRkFMU0U7Ci0KLSAgICB4Y2VudGVyID0gKHJpZ2h0ICsgbGVmdCkgLyAyOwotICAgIHljZW50ZXIgPSAoYm90dG9tICsgdG9wKSAvIDI7Ci0gICAgc3RhcnRfYW5nbGUgPSBhdGFuMiggKGRvdWJsZSkoeWNlbnRlci15c3RhcnQpKihyaWdodC1sZWZ0KSwKLQkJCSAoZG91YmxlKSh4c3RhcnQteGNlbnRlcikqKGJvdHRvbS10b3ApICk7Ci0gICAgZW5kX2FuZ2xlICAgPSBhdGFuMiggKGRvdWJsZSkoeWNlbnRlci15ZW5kKSoocmlnaHQtbGVmdCksCi0JCQkgKGRvdWJsZSkoeGVuZC14Y2VudGVyKSooYm90dG9tLXRvcCkgKTsKLSAgICBpc3RhcnRfYW5nbGUgPSAoSU5UMzIpKHN0YXJ0X2FuZ2xlICogMTgwICogNjQgLyBQSSk7Ci0gICAgaWRpZmZfYW5nbGUgID0gKElOVDMyKSgoZW5kX2FuZ2xlIC0gc3RhcnRfYW5nbGUpICogMTgwICogNjQgLyBQSSApOwotICAgIGlmIChpZGlmZl9hbmdsZSA8PSAwKSBpZGlmZl9hbmdsZSArPSAzNjAgKiA2NDsKLSAgICBpZiAobGVmdCA+IHJpZ2h0KSB7IHRtcD1sZWZ0OyBsZWZ0PXJpZ2h0OyByaWdodD10bXA7IH0KLSAgICBpZiAodG9wID4gYm90dG9tKSB7IHRtcD10b3A7IHRvcD1ib3R0b207IGJvdHRvbT10bXA7IH0KLQotICAgICAgLyogRmlsbCBhcmMgd2l0aCBicnVzaCBpZiBDaG9yZCgpIG9yIFBpZSgpICovCi0KLSAgICBpZiAoKGxpbmVzID4gMCkgJiYgRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotICAgIHsKLSAgICAgICAgWFNldEFyY01vZGUoIGRpc3BsYXksIGRjLT51LnguZ2MsIChsaW5lcz09MSkgPyBBcmNDaG9yZCA6IEFyY1BpZVNsaWNlKTsKLSAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKLSAgICAgICAgICAgICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIGlzdGFydF9hbmdsZSwgaWRpZmZfYW5nbGUgKTsKLSAgICB9Ci0KLSAgICAgIC8qIERyYXcgYXJjIGFuZCBsaW5lcyAqLwotCi0gICAgaWYgKCFEQ19TZXR1cEdDRm9yUGVuKCBkYyApKSByZXR1cm4gVFJVRTsKLSAgICBYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0JICAgICAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIGlzdGFydF9hbmdsZSwgaWRpZmZfYW5nbGUgKTsKLSAgICBpZiAoIWxpbmVzKSByZXR1cm4gVFJVRTsKLQotICAgIHBvaW50c1swXS54ID0gZGMtPncuRENPcmdYICsgeGNlbnRlciArIChpbnQpKGNvcyhzdGFydF9hbmdsZSkgKiAocmlnaHQtbGVmdCkgLyAyKTsKLSAgICBwb2ludHNbMF0ueSA9IGRjLT53LkRDT3JnWSArIHljZW50ZXIgLSAoaW50KShzaW4oc3RhcnRfYW5nbGUpICogKGJvdHRvbS10b3ApIC8gMik7Ci0gICAgcG9pbnRzWzFdLnggPSBkYy0+dy5EQ09yZ1ggKyB4Y2VudGVyICsgKGludCkoY29zKGVuZF9hbmdsZSkgKiAocmlnaHQtbGVmdCkgLyAyKTsKLSAgICBwb2ludHNbMV0ueSA9IGRjLT53LkRDT3JnWSArIHljZW50ZXIgLSAoaW50KShzaW4oZW5kX2FuZ2xlKSAqIChib3R0b20tdG9wKSAvIDIpOwotICAgIGlmIChsaW5lcyA9PSAyKQotICAgIHsKLQlwb2ludHNbMl0gPSBwb2ludHNbMV07Ci0JcG9pbnRzWzFdLnggPSBkYy0+dy5EQ09yZ1ggKyB4Y2VudGVyOwotCXBvaW50c1sxXS55ID0gZGMtPncuRENPcmdZICsgeWNlbnRlcjsKLSAgICB9Ci0gICAgWERyYXdMaW5lcyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkgICAgICAgIHBvaW50cywgbGluZXMrMSwgQ29vcmRNb2RlT3JpZ2luICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgCisgICAgcmV0dXJuIGRjICYmIGRjLT5mdW5jcy0+cE1vdmVUb0V4ICYmCisgICAgCSAgIGRjLT5mdW5jcy0+cE1vdmVUb0V4KGRjLHgseSxwdCk7CiB9CiAKIApAQCAtMjEyLDggKzkzLDkgQEAKIEJPT0wxNiBBcmMxNiggSERDMTYgaGRjLCBJTlQxNiBsZWZ0LCBJTlQxNiB0b3AsIElOVDE2IHJpZ2h0LCBJTlQxNiBib3R0b20sCiAgICAgICAgICAgICAgIElOVDE2IHhzdGFydCwgSU5UMTYgeXN0YXJ0LCBJTlQxNiB4ZW5kLCBJTlQxNiB5ZW5kICkKIHsKLSAgICByZXR1cm4gR1JBUEhfRHJhd0FyYyggaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCi0JCQkgIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLCB5ZW5kLCAwICk7CisgICAgcmV0dXJuIEFyYzMyKCAoSERDMzIpaGRjLCAoSU5UMzIpbGVmdCwgKElOVDMyKXRvcCwgKElOVDMyKXJpZ2h0LAorICAgCQkgIChJTlQzMilib3R0b20sIChJTlQzMil4c3RhcnQsIChJTlQzMil5c3RhcnQsIChJTlQzMil4ZW5kLAorCQkgIChJTlQzMil5ZW5kICk7CiB9CiAKIApAQCAtMjIzLDggKzEwNSwxMCBAQAogQk9PTDMyIEFyYzMyKCBIREMzMiBoZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSwKICAgICAgICAgICAgICAgSU5UMzIgeHN0YXJ0LCBJTlQzMiB5c3RhcnQsIElOVDMyIHhlbmQsIElOVDMyIHllbmQgKQogewotICAgIHJldHVybiBHUkFQSF9EcmF3QXJjKCBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKLQkJCSAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDAgKTsKKyAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOworICAKKyAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wQXJjICYmCisgICAgCSAgIGRjLT5mdW5jcy0+cEFyYyhkYyxsZWZ0LHRvcCxyaWdodCxib3R0b20seHN0YXJ0LHlzdGFydCx4ZW5kLHllbmQpOwogfQogCiAKQEAgLTIzNCw4ICsxMTgsOSBAQAogQk9PTDE2IFBpZTE2KCBIREMxNiBoZGMsIElOVDE2IGxlZnQsIElOVDE2IHRvcCwgSU5UMTYgcmlnaHQsIElOVDE2IGJvdHRvbSwKICAgICAgICAgICAgICAgSU5UMTYgeHN0YXJ0LCBJTlQxNiB5c3RhcnQsIElOVDE2IHhlbmQsIElOVDE2IHllbmQgKQogewotICAgIHJldHVybiBHUkFQSF9EcmF3QXJjKCBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKLQkJCSAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDIgKTsKKyAgICByZXR1cm4gUGllMzIoIChIREMzMiloZGMsIChJTlQzMilsZWZ0LCAoSU5UMzIpdG9wLCAoSU5UMzIpcmlnaHQsCisgICAJCSAgKElOVDMyKWJvdHRvbSwgKElOVDMyKXhzdGFydCwgKElOVDMyKXlzdGFydCwgKElOVDMyKXhlbmQsCisJCSAgKElOVDMyKXllbmQgKTsKIH0KIAogCkBAIC0yNDUsOCArMTMwLDEwIEBACiBCT09MMzIgUGllMzIoIEhEQzMyIGhkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tLAogICAgICAgICAgICAgICBJTlQzMiB4c3RhcnQsIElOVDMyIHlzdGFydCwgSU5UMzIgeGVuZCwgSU5UMzIgeWVuZCApCiB7Ci0gICAgcmV0dXJuIEdSQVBIX0RyYXdBcmMoIGhkYywgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tLAotCQkJICB4c3RhcnQsIHlzdGFydCwgeGVuZCwgeWVuZCwgMiApOworICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CisgIAorICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBQaWUgJiYKKyAgICAJICAgZGMtPmZ1bmNzLT5wUGllKGRjLGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSx4c3RhcnQseXN0YXJ0LHhlbmQseWVuZCk7CiB9CiAKIApAQCAtMjU2LDggKzE0Myw3IEBACiBCT09MMTYgQ2hvcmQxNiggSERDMTYgaGRjLCBJTlQxNiBsZWZ0LCBJTlQxNiB0b3AsIElOVDE2IHJpZ2h0LCBJTlQxNiBib3R0b20sCiAgICAgICAgICAgICAgICAgSU5UMTYgeHN0YXJ0LCBJTlQxNiB5c3RhcnQsIElOVDE2IHhlbmQsIElOVDE2IHllbmQgKQogewotICAgIHJldHVybiBHUkFQSF9EcmF3QXJjKCBoZGMsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwKLQkJCSAgeHN0YXJ0LCB5c3RhcnQsIHhlbmQsIHllbmQsIDEgKTsKKyAgICByZXR1cm4gQ2hvcmQzMiggaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLCB5ZW5kICk7CiB9CiAKIApAQCAtMjY3LDggKzE1MywxMCBAQAogQk9PTDMyIENob3JkMzIoIEhEQzMyIGhkYywgSU5UMzIgbGVmdCwgSU5UMzIgdG9wLCBJTlQzMiByaWdodCwgSU5UMzIgYm90dG9tLAogICAgICAgICAgICAgICAgIElOVDMyIHhzdGFydCwgSU5UMzIgeXN0YXJ0LCBJTlQzMiB4ZW5kLCBJTlQzMiB5ZW5kICkKIHsKLSAgICByZXR1cm4gR1JBUEhfRHJhd0FyYyggaGRjLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCi0JCQkgIHhzdGFydCwgeXN0YXJ0LCB4ZW5kLCB5ZW5kLCAxICk7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgCisgICAgcmV0dXJuIGRjICYmIGRjLT5mdW5jcy0+cENob3JkICYmCisgICAgCSAgIGRjLT5mdW5jcy0+cENob3JkKGRjLGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSx4c3RhcnQseXN0YXJ0LHhlbmQseWVuZCk7CiB9CiAKIApAQCAtMjg2LDQzICsxNzQsMTAgQEAKICAqLwogQk9PTDMyIEVsbGlwc2UzMiggSERDMzIgaGRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LCBJTlQzMiBib3R0b20gKQogewotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7Ci0JaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotCU1GX01ldGFQYXJhbTQoZGMsIE1FVEFfRUxMSVBTRSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQlyZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBsZWZ0ICAgPSBYTFBUT0RQKCBkYywgbGVmdCApOwotICAgIHRvcCAgICA9IFlMUFRPRFAoIGRjLCB0b3AgKTsKLSAgICByaWdodCAgPSBYTFBUT0RQKCBkYywgcmlnaHQgKTsKLSAgICBib3R0b20gPSBZTFBUT0RQKCBkYywgYm90dG9tICk7Ci0gICAgaWYgKChsZWZ0ID09IHJpZ2h0KSB8fCAodG9wID09IGJvdHRvbSkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChyaWdodCA8IGxlZnQpIHsgSU5UMzIgdG1wID0gcmlnaHQ7IHJpZ2h0ID0gbGVmdDsgbGVmdCA9IHRtcDsgfQotICAgIGlmIChib3R0b20gPCB0b3ApIHsgSU5UMzIgdG1wID0gYm90dG9tOyBib3R0b20gPSB0b3A7IHRvcCA9IHRtcDsgfQotICAgIAotICAgIGlmICgoZGMtPnUueC5wZW4uc3R5bGUgPT0gUFNfSU5TSURFRlJBTUUpICYmCi0gICAgICAgIChkYy0+dS54LnBlbi53aWR0aCA8IHJpZ2h0LWxlZnQtMSkgJiYKLSAgICAgICAgKGRjLT51LngucGVuLndpZHRoIDwgYm90dG9tLXRvcC0xKSkKLSAgICB7Ci0gICAgICAgIGxlZnQgICArPSBkYy0+dS54LnBlbi53aWR0aCAvIDI7Ci0gICAgICAgIHJpZ2h0ICAtPSAoZGMtPnUueC5wZW4ud2lkdGggKyAxKSAvIDI7Ci0gICAgICAgIHRvcCAgICArPSBkYy0+dS54LnBlbi53aWR0aCAvIDI7Ci0gICAgICAgIGJvdHRvbSAtPSAoZGMtPnUueC5wZW4ud2lkdGggKyAxKSAvIDI7Ci0gICAgfQotCi0gICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKLQlYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0JCSAgcmlnaHQtbGVmdC0xLCBib3R0b20tdG9wLTEsIDAsIDM2MCo2NCApOwotICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQotCVhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgIGRjLT53LkRDT3JnWCArIGxlZnQsIGRjLT53LkRDT3JnWSArIHRvcCwKLQkJICByaWdodC1sZWZ0LTEsIGJvdHRvbS10b3AtMSwgMCwgMzYwKjY0ICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgCisgICAgcmV0dXJuIGRjICYmIGRjLT5mdW5jcy0+cEVsbGlwc2UgJiYKKyAgICAJICAgZGMtPmZ1bmNzLT5wRWxsaXBzZShkYyxsZWZ0LHRvcCxyaWdodCxib3R0b20pOwogfQogCiAKQEAgLTM0MCw1NiArMTk1LDEwIEBACiAgKi8KIEJPT0wzMiBSZWN0YW5nbGUzMihIREMzMiBoZGMsIElOVDMyIGxlZnQsIElOVDMyIHRvcCwgSU5UMzIgcmlnaHQsIElOVDMyIGJvdHRvbSkKIHsKLSAgICBJTlQzMiB3aWR0aDsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiBGQUxTRTsKLQlNRl9NZXRhUGFyYW00KGRjLCBNRVRBX1JFQ1RBTkdMRSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQlyZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgbGVmdCAgID0gWExQVE9EUCggZGMsIGxlZnQgKTsKLSAgICB0b3AgICAgPSBZTFBUT0RQKCBkYywgdG9wICk7Ci0gICAgcmlnaHQgID0gWExQVE9EUCggZGMsIHJpZ2h0ICk7Ci0gICAgYm90dG9tID0gWUxQVE9EUCggZGMsIGJvdHRvbSApOwotCi0gICAgaWYgKHJpZ2h0IDwgbGVmdCkgeyBJTlQzMiB0bXAgPSByaWdodDsgcmlnaHQgPSBsZWZ0OyBsZWZ0ID0gdG1wOyB9Ci0gICAgaWYgKGJvdHRvbSA8IHRvcCkgeyBJTlQzMiB0bXAgPSBib3R0b207IGJvdHRvbSA9IHRvcDsgdG9wID0gdG1wOyB9Ci0KLSAgICBpZiAoKGxlZnQgPT0gcmlnaHQpIHx8ICh0b3AgPT0gYm90dG9tKSkKLSAgICB7Ci0JaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JICAgIFhEcmF3TGluZShkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKLQkJICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAotCQkgIGRjLT53LkRDT3JnWSArIHRvcCwKLQkJICBkYy0+dy5EQ09yZ1ggKyByaWdodCwKLQkJICBkYy0+dy5EQ09yZ1kgKyBib3R0b20pOwotCXJldHVybiBUUlVFOwotICAgIH0KLSAgICB3aWR0aCA9IGRjLT51LngucGVuLndpZHRoOwotICAgIGlmICghd2lkdGgpIHdpZHRoID0gMTsKLSAgICBpZihkYy0+dS54LnBlbi5zdHlsZSA9PSBQU19OVUxMKSB3aWR0aCA9IDA7Ci0KLSAgICBpZiAoKGRjLT51LngucGVuLnN0eWxlID09IFBTX0lOU0lERUZSQU1FKSAmJgotICAgICAgICAod2lkdGggPCByaWdodC1sZWZ0KSAmJiAod2lkdGggPCBib3R0b20tdG9wKSkKLSAgICB7Ci0gICAgICAgIGxlZnQgICArPSB3aWR0aCAvIDI7Ci0gICAgICAgIHJpZ2h0ICAtPSAod2lkdGggKyAxKSAvIDI7Ci0gICAgICAgIHRvcCAgICArPSB3aWR0aCAvIDI7Ci0gICAgICAgIGJvdHRvbSAtPSAod2lkdGggKyAxKSAvIDI7Ci0gICAgfQotCi0gICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKLQlYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLQkJICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgKHdpZHRoICsgMSkgLyAyLAotCQkgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArICh3aWR0aCArIDEpIC8gMiwKLQkJICAgICAgICByaWdodC1sZWZ0LXdpZHRoLTEsIGJvdHRvbS10b3Atd2lkdGgtMSk7Ci0gICAgaWYgKERDX1NldHVwR0NGb3JQZW4oIGRjICkpCi0JWERyYXdSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAotCQkgICAgICAgIHJpZ2h0LWxlZnQtMSwgYm90dG9tLXRvcC0xICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKKyAgCisgICAgcmV0dXJuIGRjICYmIGRjLT5mdW5jcy0+cFJlY3RhbmdsZSAmJgorICAgIAkgICBkYy0+ZnVuY3MtPnBSZWN0YW5nbGUoZGMsbGVmdCx0b3AscmlnaHQsYm90dG9tKTsKIH0KIAogCkBAIC00MDksMTE1ICsyMTgsMTAgQEAKIEJPT0wzMiBSb3VuZFJlY3QzMiggSERDMzIgaGRjLCBJTlQzMiBsZWZ0LCBJTlQzMiB0b3AsIElOVDMyIHJpZ2h0LAogICAgICAgICAgICAgICAgICAgICBJTlQzMiBib3R0b20sIElOVDMyIGVsbF93aWR0aCwgSU5UMzIgZWxsX2hlaWdodCApCiB7Ci0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpOwotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7Ci0JaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotCU1GX01ldGFQYXJhbTYoZGMsIE1FVEFfUk9VTkRSRUNULCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sCi0JCSAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCk7Ci0JcmV0dXJuIFRSVUU7Ci0gICAgfQotICAgIGRwcmludGZfZ3JhcGhpY3Moc3RkZGViLCAiUm91bmRSZWN0KCVkICVkICVkICVkICAlZCAlZFxuIiwgCi0gICAgCWxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSwgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0KTsKLQotICAgIGxlZnQgICA9IFhMUFRPRFAoIGRjLCBsZWZ0ICk7Ci0gICAgdG9wICAgID0gWUxQVE9EUCggZGMsIHRvcCApOwotICAgIHJpZ2h0ICA9IFhMUFRPRFAoIGRjLCByaWdodCApOwotICAgIGJvdHRvbSA9IFlMUFRPRFAoIGRjLCBib3R0b20gKTsKLSAgICBlbGxfd2lkdGggID0gYWJzKCBlbGxfd2lkdGggKiBkYy0+dnBvcnRFeHRYIC8gZGMtPnduZEV4dFggKTsKLSAgICBlbGxfaGVpZ2h0ID0gYWJzKCBlbGxfaGVpZ2h0ICogZGMtPnZwb3J0RXh0WSAvIGRjLT53bmRFeHRZICk7Ci0KLSAgICAvKiBGaXggdGhlIGNvb3JkaW5hdGVzICovCi0KLSAgICBpZiAocmlnaHQgPCBsZWZ0KSB7IElOVDMyIHRtcCA9IHJpZ2h0OyByaWdodCA9IGxlZnQ7IGxlZnQgPSB0bXA7IH0KLSAgICBpZiAoYm90dG9tIDwgdG9wKSB7IElOVDMyIHRtcCA9IGJvdHRvbTsgYm90dG9tID0gdG9wOyB0b3AgPSB0bXA7IH0KLSAgICBpZiAoZWxsX3dpZHRoID4gcmlnaHQgLSBsZWZ0KSBlbGxfd2lkdGggPSByaWdodCAtIGxlZnQ7Ci0gICAgaWYgKGVsbF9oZWlnaHQgPiBib3R0b20gLSB0b3ApIGVsbF9oZWlnaHQgPSBib3R0b20gLSB0b3A7Ci0KLSAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotICAgIHsKLSAgICAgICAgaWYgKGVsbF93aWR0aCAmJiBlbGxfaGVpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCA5MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBYRmlsbEFyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMTgwICogNjQsIDkwICogNjQgKTsKLSAgICAgICAgICAgIFhGaWxsQXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSAtIGVsbF9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAyNzAgKiA2NCwgOTAgKiA2NCApOwotICAgICAgICAgICAgWEZpbGxBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGgsIGRjLT53LkRDT3JnWSArIHRvcCwKLSAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDAsIDkwICogNjQgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxsX3dpZHRoIDwgcmlnaHQgLSBsZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgZWxsX3dpZHRoIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgLSBsZWZ0IC0gZWxsX3dpZHRoLCBlbGxfaGVpZ2h0IC8gMiApOwotICAgICAgICAgICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gKGVsbF9oZWlnaHQrMSkgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCAtIGVsbF93aWR0aCwgKGVsbF9oZWlnaHQrMSkgLyAyICk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgIChlbGxfaGVpZ2h0IDwgYm90dG9tIC0gdG9wKQotICAgICAgICB7Ci0gICAgICAgICAgICBYRmlsbFJlY3RhbmdsZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArIGVsbF9oZWlnaHQgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0IC0gbGVmdCwgYm90dG9tIC0gdG9wIC0gZWxsX2hlaWdodCApOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKGRjKSkKLSAgICB7Ci0gICAgICAgIGlmIChlbGxfd2lkdGggJiYgZWxsX2hlaWdodCkKLSAgICAgICAgewotICAgICAgICAgICAgWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgdG9wLAotICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgOTAgKiA2NCwgOTAgKiA2NCApOwotICAgICAgICAgICAgWERyYXdBcmMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCwgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICBlbGxfd2lkdGgsIGVsbF9oZWlnaHQsIDE4MCAqIDY0LCA5MCAqIDY0ICk7Ci0gICAgICAgICAgICBYRHJhd0FyYyggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgIGVsbF93aWR0aCwgZWxsX2hlaWdodCwgMjcwICogNjQsIDkwICogNjQgKTsKLSAgICAgICAgICAgIFhEcmF3QXJjKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJpZ2h0IC0gZWxsX3dpZHRoLCBkYy0+dy5EQ09yZ1kgKyB0b3AsCi0gICAgICAgICAgICAgICAgICAgICAgZWxsX3dpZHRoLCBlbGxfaGVpZ2h0LCAwLCA5MCAqIDY0ICk7Ci0JfQotICAgICAgICBpZiAoZWxsX3dpZHRoIDwgcmlnaHQgLSBsZWZ0KQotICAgICAgICB7Ci0gICAgICAgICAgICBYRHJhd0xpbmUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0ICsgZWxsX3dpZHRoIC8gMiwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgdG9wLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCAtIGVsbF93aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCApOwotICAgICAgICAgICAgWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgbGVmdCArIGVsbF93aWR0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIGJvdHRvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQgLSBlbGxfd2lkdGggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZWxsX2hlaWdodCA8IGJvdHRvbSAtIHRvcCkKLSAgICAgICAgewotICAgICAgICAgICAgWERyYXdMaW5lKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLCAKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdYICsgcmlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArIGVsbF9oZWlnaHQgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgZGMtPncuRENPcmdZICsgYm90dG9tIC0gZWxsX2hlaWdodCAvIDIgKTsKLSAgICAgICAgICAgIFhEcmF3TGluZSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgZGMtPnUueC5nYywgCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWSArIHRvcCArIGVsbF9oZWlnaHQgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyBib3R0b20gLSBlbGxfaGVpZ2h0IC8gMiApOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBUUlVFOworICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CisgIAorICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBSb3VuZFJlY3QgJiYKKyAgICAJICAgZGMtPmZ1bmNzLT5wUm91bmRSZWN0KGRjLGxlZnQsdG9wLHJpZ2h0LGJvdHRvbSxlbGxfd2lkdGgsZWxsX2hlaWdodCk7CiB9CiAKIApAQCAtNjM1LDI4ICszMzksMTAgQEAKICAqLwogQ09MT1JSRUYgU2V0UGl4ZWwzMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBDT0xPUlJFRiBjb2xvciApCiB7Ci0gICAgUGl4ZWwgcGl4ZWw7Ci0gICAgCi0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgaWYgKCFkYykgCi0gICAgewotCWRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKLQlpZiAoIWRjKSByZXR1cm4gMDsKLQlNRl9NZXRhUGFyYW00KGRjLCBNRVRBX1NFVFBJWEVMLCB4LCB5LCBISVdPUkQoY29sb3IpLCBMT1dPUkQoY29sb3IpKTsgCi0JcmV0dXJuIDE7Ci0gICAgfQotCi0gICAgeCA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCB4ICk7Ci0gICAgeSA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICk7Ci0gICAgcGl4ZWwgPSBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgY29sb3IgKTsKLSAgICAKLSAgICBYU2V0Rm9yZWdyb3VuZCggZGlzcGxheSwgZGMtPnUueC5nYywgcGl4ZWwgKTsKLSAgICBYU2V0RnVuY3Rpb24oIGRpc3BsYXksIGRjLT51LnguZ2MsIEdYY29weSApOwotICAgIFhEcmF3UG9pbnQoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsIHgsIHkgKTsKLQotICAgIC8qIGluZWZmaWNpZW50IGJ1dCBzaW1wbGUuLi4gKi8KLQotICAgIHJldHVybiBDT0xPUl9Ub0xvZ2ljYWwocGl4ZWwpOworICAgIERDICogZGMgPSBEQ19HZXREQ1B0ciggaGRjICk7CisgIAorICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cFNldFBpeGVsKSByZXR1cm4gMDsKKyAgICByZXR1cm4gZGMtPmZ1bmNzLT5wU2V0UGl4ZWwoZGMseCx5LGNvbG9yKTsKIH0KIAogCkBAIC02NzQsNDAgKzM2MCwxNyBAQAogICovCiBDT0xPUlJFRiBHZXRQaXhlbDMyKCBIREMzMiBoZGMsIElOVDMyIHgsIElOVDMyIHkgKQogewotICAgIHN0YXRpYyBQaXhtYXAgcGl4bWFwID0gMDsKLSAgICBYSW1hZ2UgKiBpbWFnZTsKLSAgICBpbnQgcGl4ZWw7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKIAotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwogICAgIGlmICghZGMpIHJldHVybiAwOwotCiAjaWZkZWYgU09MSVRBSVJFX1NQRUVEX0hBQ0sKICAgICByZXR1cm4gMDsKICNlbmRpZgogCisgICAgLyogRklYTUU6IHNob3VsZCB0aGlzIGJlIGluIHRoZSBncmFwaGljcyBkcml2ZXI/ICovCiAgICAgaWYgKCFQdFZpc2libGUzMiggaGRjLCB4LCB5ICkpIHJldHVybiAwOwotCi0gICAgeCA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCB4ICk7Ci0gICAgeSA9IGRjLT53LkRDT3JnWSArIFlMUFRPRFAoIGRjLCB5ICk7Ci0gICAgaWYgKGRjLT53LmZsYWdzICYgRENfTUVNT1JZKQotICAgIHsKLSAgICAgICAgaW1hZ2UgPSBYR2V0SW1hZ2UoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIHgsIHksIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXAgKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogSWYgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgc2NyZWVuLCB1c2UgYSB0ZW1wb3JhcnkgY29weSAqLwotICAgICAgICAvKiB0byBhdm9pZCBhIEJhZE1hdGNoIGVycm9yICovCi0gICAgICAgIGlmICghcGl4bWFwKSBwaXhtYXAgPSBYQ3JlYXRlUGl4bWFwKCBkaXNwbGF5LCByb290V2luZG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMSwgZGMtPncuYml0c1BlclBpeGVsICk7Ci0gICAgICAgIFhDb3B5QXJlYSggZGlzcGxheSwgZGMtPnUueC5kcmF3YWJsZSwgcGl4bWFwLCBCSVRNQVBfY29sb3JHQywKLSAgICAgICAgICAgICAgICAgICB4LCB5LCAxLCAxLCAwLCAwICk7Ci0gICAgICAgIGltYWdlID0gWEdldEltYWdlKCBkaXNwbGF5LCBwaXhtYXAsIDAsIDAsIDEsIDEsIEFsbFBsYW5lcywgWlBpeG1hcCApOwotICAgIH0KLSAgICBwaXhlbCA9IFhHZXRQaXhlbCggaW1hZ2UsIDAsIDAgKTsKLSAgICBYRGVzdHJveUltYWdlKCBpbWFnZSApOwotICAgIAotICAgIHJldHVybiBDT0xPUl9Ub0xvZ2ljYWwocGl4ZWwpOworICAgIGlmICghZGMgfHwgIWRjLT5mdW5jcy0+cEdldFBpeGVsKSByZXR1cm4gMDsKKyAgICByZXR1cm4gZGMtPmZ1bmNzLT5wR2V0UGl4ZWwoZGMseCx5KTsKIH0KIAogCkBAIC03MjUsMzUgKzM4OCwxMCBAQAogICovCiBCT09MMzIgUGFpbnRSZ24zMiggSERDMzIgaGRjLCBIUkdOMzIgaHJnbiApCiB7Ci0gICAgUkVDVDMyIGJveDsKLSAgICBIUkdOMzIgdG1wVmlzUmduLCBwcmV2VmlzUmduOwotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICAgIGlmICghZGMpIHJldHVybiBGQUxTRTsKKyAgICBEQyAqIGRjID0gRENfR2V0RENQdHIoIGhkYyApOwogCi0gICAgICAvKiBNb2RpZnkgdmlzaWJsZSByZWdpb24gKi8KLQotICAgIGlmICghKHByZXZWaXNSZ24gPSBTYXZlVmlzUmduKCBoZGMgKSkpIHJldHVybiBGQUxTRTsKLSAgICBpZiAoISh0bXBWaXNSZ24gPSBDcmVhdGVSZWN0UmduMzIoIDAsIDAsIDAsIDAgKSkpCi0gICAgewotICAgICAgICBSZXN0b3JlVmlzUmduKCBoZGMgKTsKLSAgICAgICAgcmV0dXJuIEZBTFNFOwotICAgIH0KLSAgICBDb21iaW5lUmduMzIoIHRtcFZpc1JnbiwgcHJldlZpc1JnbiwgaHJnbiwgUkdOX0FORCApOwotICAgIFNlbGVjdFZpc1JnbiggaGRjLCB0bXBWaXNSZ24gKTsKLSAgICBEZWxldGVPYmplY3QzMiggdG1wVmlzUmduICk7Ci0KLSAgICAgIC8qIEZpbGwgdGhlIHJlZ2lvbiAqLwotCi0gICAgR2V0UmduQm94MzIoIGRjLT53LmhHQ0NsaXBSZ24sICZib3ggKTsKLSAgICBpZiAoRENfU2V0dXBHQ0ZvckJydXNoKCBkYyApKQotCVhGaWxsUmVjdGFuZ2xlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICAgICAgIGRjLT53LkRDT3JnWCArIGJveC5sZWZ0LCBkYy0+dy5EQ09yZ1kgKyBib3gudG9wLAotCQkgICAgICAgIGJveC5yaWdodC1ib3gubGVmdCwgYm94LmJvdHRvbS1ib3gudG9wICk7Ci0KLSAgICAgIC8qIFJlc3RvcmUgdGhlIHZpc2libGUgcmVnaW9uICovCi0KLSAgICBSZXN0b3JlVmlzUmduKCBoZGMgKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wUGFpbnRSZ24gJiYKKwkgICBkYy0+ZnVuY3MtPnBQYWludFJnbihkYyxocmduKTsKIH0KIAogCkBAIC04NDAsNiArNDc4LDggQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgRHJhd0ZvY3VzUmVjdDMyICAgIChVU0VSMzIuMTU1KQorICoKKyAqIEZJWE1FOiBzaG91bGQgdXNlIFJlY3RhbmdsZTMyIQogICovCiB2b2lkIERyYXdGb2N1c1JlY3QzMiggSERDMzIgaGRjLCBjb25zdCBSRUNUMzIqIHJjICkKIHsKQEAgLTk0OCwyMyArNTg4LDEzIEBACiBCT09MMTYgUG9seWxpbmUxNiggSERDMTYgaGRjLCBMUFBPSU5UMTYgcHQsIElOVDE2IGNvdW50ICkKIHsKICAgICByZWdpc3RlciBpbnQgaTsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiBGQUxTRTsKLQlNRl9NZXRhUG9seShkYywgTUVUQV9QT0xZTElORSwgcHQsIGNvdW50KTsgCi0JcmV0dXJuIFRSVUU7Ci0gICAgfQorICAgIExQUE9JTlQzMiBwdDMyID0gKExQUE9JTlQzMil4bWFsbG9jKGNvdW50KnNpemVvZihQT0lOVDMyKSk7CisgICAgQk9PTDE2IHJldDsKIAotICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQotCWZvciAoaSA9IDA7IGkgPCBjb3VudC0xOyBpICsrKQotCSAgICBYRHJhd0xpbmUgKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsICAKLQkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpXS54KSwKLQkJICAgICAgIGRjLT53LkRDT3JnWSArIFlMUFRPRFAoZGMsIHB0IFtpXS55KSwKLQkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpKzFdLngpLAotCQkgICAgICAgZGMtPncuRENPcmdZICsgWUxQVE9EUChkYywgcHQgW2krMV0ueSkpOwotICAgIHJldHVybiBUUlVFOworICAgIGZvciAoaT1jb3VudDtpLS07KSBDT05WX1BPSU5UMTZUTzMyKCYocHRbaV0pLCYocHQzMltpXSkpOworICAgIHJldCA9IFBvbHlsaW5lMzIoaGRjLHB0MzIsY291bnQpOworICAgIGZyZWUocHQzMik7CisgICAgcmV0dXJuIHJldDsKIH0KIAogCkBAIC05NzMsMjggKzYwMywxMCBAQAogICovCiBCT09MMzIgUG9seWxpbmUzMiggSERDMzIgaGRjLCBjb25zdCBMUFBPSU5UMzIgcHQsIElOVDMyIGNvdW50ICkKIHsKLSAgICByZWdpc3RlciBpbnQgaTsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKLSAgICBpZiAoIWRjKSAKLSAgICB7Ci0JZGMgPSAoREMgKilHRElfR2V0T2JqUHRyKGhkYywgTUVUQUZJTEVfRENfTUFHSUMpOwotCWlmICghZGMpIHJldHVybiBGQUxTRTsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiUG9seWxpbmUzMjogTWV0YWZpbGUgUG9seWxpbmUgbm90IHlldCBzdXBwb3J0ZWQgZm9yIFdpbjMyXG4iKTsKLS8qIHdpbiAxNiBjb2RlIHdhczoKLQlNRl9NZXRhUG9seShkYywgTUVUQV9QT0xZTElORSwgcHQsIGNvdW50KTsgCi0JcmV0dXJuIFRSVUU7Ci0qLwotCXJldHVybiBGQUxTRTsKLSAgICB9CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKIAotICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuKCBkYyApKQotCWZvciAoaSA9IDA7IGkgPCBjb3VudC0xOyBpICsrKQotCSAgICBYRHJhd0xpbmUgKGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsICAKLQkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpXS54KSwKLQkJICAgICAgIGRjLT53LkRDT3JnWSArIFlMUFRPRFAoZGMsIHB0IFtpXS55KSwKLQkJICAgICAgIGRjLT53LkRDT3JnWCArIFhMUFRPRFAoZGMsIHB0IFtpKzFdLngpLAotCQkgICAgICAgZGMtPncuRENPcmdZICsgWUxQVE9EUChkYywgcHQgW2krMV0ueSkpOwotICAgIHJldHVybiBUUlVFOworICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBQb2x5bGluZSAmJgorICAgIAkgICBkYy0+ZnVuY3MtPnBQb2x5bGluZShkYyxwdCxjb3VudCk7CiB9CiAKIApAQCAtMTAwNCw3OCArNjE2LDI2IEBACiBCT09MMTYgUG9seWdvbjE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwdCwgSU5UMTYgY291bnQgKQogewogICAgIHJlZ2lzdGVyIGludCBpOwotICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOwotICAgIFhQb2ludCAqcG9pbnRzOworICAgIExQUE9JTlQzMiBwdDMyID0gKExQUE9JTlQzMil4bWFsbG9jKGNvdW50KnNpemVvZihQT0lOVDMyKSk7CisgICAgQk9PTDMyIHJldDsKIAotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7Ci0JaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotCU1GX01ldGFQb2x5KGRjLCBNRVRBX1BPTFlHT04sIHB0LCBjb3VudCk7IAotCXJldHVybiBUUlVFOwotICAgIH0KIAotICAgIHBvaW50cyA9IChYUG9pbnQgKikgeG1hbGxvYyAoc2l6ZW9mIChYUG9pbnQpICogKGNvdW50KzEpKTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICB7Ci0JcG9pbnRzW2ldLnggPSBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgcHRbaV0ueCApOwotCXBvaW50c1tpXS55ID0gZGMtPncuRENPcmdZICsgWUxQVE9EUCggZGMsIHB0W2ldLnkgKTsKLSAgICB9Ci0gICAgcG9pbnRzW2NvdW50XSA9IHBvaW50c1swXTsKLQotICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCi0JWEZpbGxQb2x5Z29uKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICAgIHBvaW50cywgY291bnQrMSwgQ29tcGxleCwgQ29vcmRNb2RlT3JpZ2luKTsKLQotICAgIGlmIChEQ19TZXR1cEdDRm9yUGVuICggZGMgKSkKLQlYRHJhd0xpbmVzKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLCBkYy0+dS54LmdjLAotCQkgICBwb2ludHMsIGNvdW50KzEsIENvb3JkTW9kZU9yaWdpbiApOwotCi0gICAgZnJlZSggcG9pbnRzICk7Ci0gICAgcmV0dXJuIFRSVUU7CisgICAgZm9yIChpPWNvdW50O2ktLTspIENPTlZfUE9JTlQxNlRPMzIoJihwdFtpXSksJihwdDMyW2ldKSk7CisgICAgcmV0ID0gUG9seWdvbjMyKGhkYyxwdDMyLGNvdW50KTsKKyAgICBmcmVlKHB0MzIpOworICAgIHJldHVybiByZXQ7CiB9CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIFBvbHlnb24zMiAgKEdESTMyLjI3NSkKLSAqCi0gKiBUaGlzIGEgY29weSBvZiBQb2x5Z29uMTYgc28gdGhhdCBjb252ZXJzaW9uIG9mIGFycmF5IG9mCi0gKiBMUFBPSU5UMzIgdG8gTFBQT0lOVDE2IGlzIG5vdCBuZWNlc3NhcnkKLSAqCiAgKi8KIEJPT0wzMiBQb2x5Z29uMzIoIEhEQzMyIGhkYywgTFBQT0lOVDMyIHB0LCBJTlQzMiBjb3VudCApCiB7Ci0gICAgcmVnaXN0ZXIgaW50IGk7Ci0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7Ci0gICAgWFBvaW50ICpwb2ludHM7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKIAotICAgIGlmICghZGMpCi0gICAgewotCWRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKLQlpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0JLyogRklYTUU6IE1GX01ldGFQb2x5IGV4cGVjdHMgTFBQT0lOVDE2IG5vdCAzMiAqLwotCS8qIE1GX01ldGFQb2x5KGRjLCBNRVRBX1BPTFlHT04sIHB0LCBjb3VudCk7ICovCi0JcmV0dXJuIFRSVUU7Ci0gICAgfQotCi0gICAgcG9pbnRzID0gKFhQb2ludCAqKSB4bWFsbG9jIChzaXplb2YgKFhQb2ludCkgKiAoY291bnQrMSkpOwotICAgIGZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLQlwb2ludHNbaV0ueCA9IGRjLT53LkRDT3JnWCArIFhMUFRPRFAoIGRjLCBwdFtpXS54ICk7Ci0JcG9pbnRzW2ldLnkgPSBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgcHRbaV0ueSApOwotICAgIH0KLSAgICBwb2ludHNbY291bnRdID0gcG9pbnRzWzBdOwotCi0gICAgaWYgKERDX1NldHVwR0NGb3JCcnVzaCggZGMgKSkKLQlYRmlsbFBvbHlnb24oIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgcG9pbnRzLCBjb3VudCsxLCBDb21wbGV4LCBDb29yZE1vZGVPcmlnaW4pOwotCi0gICAgaWYgKERDX1NldHVwR0NGb3JQZW4gKCBkYyApKQotCVhEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgIHBvaW50cywgY291bnQrMSwgQ29vcmRNb2RlT3JpZ2luICk7Ci0KLSAgICBmcmVlKCBwb2ludHMgKTsKLSAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gZGMgJiYgZGMtPmZ1bmNzLT5wUG9seWdvbiAmJgorICAgIAkgICBkYy0+ZnVuY3MtPnBQb2x5Z29uKGRjLHB0LGNvdW50KTsKIH0KIAogCkBAIC0xMDg0LDE1NSArNjQ0LDM3IEBACiAgKi8KIEJPT0wxNiBQb2x5UG9seWdvbjE2KCBIREMxNiBoZGMsIExQUE9JTlQxNiBwdCwgTFBJTlQxNiBjb3VudHMsIFVJTlQxNiBwb2x5Z29ucykKIHsKLSAgICBIUkdOMzIgaHJnbjsKLSAgICBEQyAqIGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKTsKKyAgICBpbnQJCWksbnJwdHM7CisgICAgTFBQT0lOVDMyCXB0MzI7CisgICAgTFBJTlQzMgljb3VudHMzMjsKKyAgICBCT09MMTYJcmV0OwogCi0gICAgaWYgKCFkYykgCi0gICAgewotCWRjID0gKERDICopR0RJX0dldE9ialB0cihoZGMsIE1FVEFGSUxFX0RDX01BR0lDKTsKLQlpZiAoIWRjKSByZXR1cm4gRkFMU0U7Ci0JLyogTUZfTWV0YVBvbHkoZGMsIE1FVEFfUE9MWUdPTiwgcHQsIGNvdW50KTsgKi8KLQlyZXR1cm4gVFJVRTsKLSAgICB9Ci0gICAgICAvKiBGSVhNRTogVGhlIHBvaW50cyBzaG91bGQgYmUgY29udmVydGVkIHRvIGRldmljZSBjb29yZHMgYmVmb3JlICovCi0gICAgICAvKiBjcmVhdGluZyB0aGUgcmVnaW9uLiBCdXQgYXMgQ3JlYXRlUG9seVBvbHlnb25SZ24gaXMgbm90ICovCi0gICAgICAvKiByZWFsbHkgY29ycmVjdCBlaXRoZXIsIGl0IGRvZXNuJ3QgbWF0dGVyIG11Y2guLi4gKi8KLSAgICAgIC8qIEF0IGxlYXN0IHRoZSBvdXRsaW5lIHdpbGwgYmUgY29ycmVjdCA6LSkgKi8KLSAgICBocmduID0gQ3JlYXRlUG9seVBvbHlnb25SZ24xNiggcHQsIGNvdW50cywgcG9seWdvbnMsIGRjLT53LnBvbHlGaWxsTW9kZSApOwotICAgIFBhaW50UmduMzIoIGhkYywgaHJnbiApOwotICAgIERlbGV0ZU9iamVjdDMyKCBocmduICk7Ci0KLSAgICAgIC8qIERyYXcgdGhlIG91dGxpbmUgb2YgdGhlIHBvbHlnb25zICovCi0KLSAgICBpZiAoRENfU2V0dXBHQ0ZvclBlbiAoIGRjICkpCi0gICAgewotCWludCBpLCBqLCBtYXggPSAwOwotCVhQb2ludCAqcG9pbnRzOwotCi0JZm9yIChpID0gMDsgaSA8IHBvbHlnb25zOyBpKyspIGlmIChjb3VudHNbaV0gPiBtYXgpIG1heCA9IGNvdW50c1tpXTsKLQlwb2ludHMgPSAoWFBvaW50ICopIHhtYWxsb2MoIHNpemVvZihYUG9pbnQpICogKG1heCsxKSApOwotCi0JZm9yIChpID0gMDsgaSA8IHBvbHlnb25zOyBpKyspCi0JewotCSAgICBmb3IgKGogPSAwOyBqIDwgY291bnRzW2ldOyBqKyspCi0JICAgIHsKLQkJcG9pbnRzW2pdLnggPSBkYy0+dy5EQ09yZ1ggKyBYTFBUT0RQKCBkYywgcHQtPnggKTsKLQkJcG9pbnRzW2pdLnkgPSBkYy0+dy5EQ09yZ1kgKyBZTFBUT0RQKCBkYywgcHQtPnkgKTsKLQkJcHQrKzsKLQkgICAgfQotCSAgICBwb2ludHNbal0gPSBwb2ludHNbMF07Ci0JICAgIFhEcmF3TGluZXMoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0JCSAgICAgICAgcG9pbnRzLCBqICsgMSwgQ29vcmRNb2RlT3JpZ2luICk7Ci0JfQotCWZyZWUoIHBvaW50cyApOwotICAgIH0KLSAgICByZXR1cm4gVFJVRTsKKyAgICBucnB0cz0wOworICAgIGZvciAoaT1wb2x5Z29ucztpLS07KQorICAgIAlucnB0cys9Y291bnRzW2ldOworICAgIHB0MzIgPSAoTFBQT0lOVDMyKXhtYWxsb2Moc2l6ZW9mKFBPSU5UMzIpKm5ycHRzKTsKKyAgICBmb3IgKGk9bnJwdHM7aS0tOykKKyAgICAJQ09OVl9QT0lOVDE2VE8zMigmKHB0W2ldKSwmKHB0MzJbaV0pKTsKKyAgICBjb3VudHMzMiA9IChMUElOVDMyKXhtYWxsb2MocG9seWdvbnMqc2l6ZW9mKElOVDMyKSk7CisgICAgZm9yIChpPXBvbHlnb25zO2ktLTspIGNvdW50czMyW2ldPWNvdW50c1tpXTsKKyAgIAorICAgIHJldCA9IFBvbHlQb2x5Z29uMzIoaGRjLHB0MzIsY291bnRzMzIscG9seWdvbnMpOworICAgIGZyZWUoY291bnRzMzIpOworICAgIGZyZWUocHQzMik7CisgICAgcmV0dXJuIHJldDsKIH0KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgR1JBUEhfSW50ZXJuYWxGbG9vZEZpbGwKLSAqCi0gKiBJbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gZm9yIGZsb29kIGZpbGwuCi0gKiAoeG9yZyx5b3JnKSBpcyB0aGUgb3JpZ2luIG9mIHRoZSBYIGltYWdlIHJlbGF0aXZlIHRvIHRoZSBkcmF3YWJsZS4KLSAqICh4LHkpIGlzIHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4gb2YgdGhlIFggaW1hZ2UuCisgKiAgICAgICAgICBQb2x5UG9seWdvbjMyICAoR0RJLjQ1MCkKICAqLwotc3RhdGljIHZvaWQgR1JBUEhfSW50ZXJuYWxGbG9vZEZpbGwoIFhJbWFnZSAqaW1hZ2UsIERDICpkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeCwgaW50IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHhPcmcsIGludCB5T3JnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBpeGVsIHBpeGVsLCBXT1JEIGZpbGxUeXBlICkKK0JPT0wzMiBQb2x5UG9seWdvbjMyKCBIREMzMiBoZGMsIExQUE9JTlQzMiBwdCwgTFBJTlQzMiBjb3VudHMsIFVJTlQzMiBwb2x5Z29ucykKIHsKLSAgICBpbnQgbGVmdCwgcmlnaHQ7CisgICAgREMgKiBkYyA9IERDX0dldERDUHRyKCBoZGMgKTsKIAotI2RlZmluZSBUT19GTE9PRCh4LHkpICAoKGZpbGxUeXBlID09IEZMT09ERklMTEJPUkRFUikgPyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoWEdldFBpeGVsKGltYWdlLHgseSkgIT0gcGl4ZWwpIDogXAotICAgICAgICAgICAgICAgICAgICAgICAgKFhHZXRQaXhlbChpbWFnZSx4LHkpID09IHBpeGVsKSkKLQotICAgIGlmICghVE9fRkxPT0QoeCx5KSkgcmV0dXJuOwotCi0gICAgICAvKiBGaW5kIGxlZnQgYW5kIHJpZ2h0IGJvdW5kYXJpZXMgKi8KLQotICAgIGxlZnQgPSByaWdodCA9IHg7Ci0gICAgd2hpbGUgKChsZWZ0ID4gMCkgJiYgVE9fRkxPT0QoIGxlZnQtMSwgeSApKSBsZWZ0LS07Ci0gICAgd2hpbGUgKChyaWdodCA8IGltYWdlLT53aWR0aCkgJiYgVE9fRkxPT0QoIHJpZ2h0LCB5ICkpIHJpZ2h0Kys7Ci0gICAgWEZpbGxSZWN0YW5nbGUoIGRpc3BsYXksIGRjLT51LnguZHJhd2FibGUsIGRjLT51LnguZ2MsCi0gICAgICAgICAgICAgICAgICAgIHhPcmcgKyBsZWZ0LCB5T3JnICsgeSwgcmlnaHQtbGVmdCwgMSApOwotCi0gICAgICAvKiBTZXQgdGhlIHBpeGVscyBvZiB0aGlzIGxpbmUgc28gd2UgZG9uJ3QgZmlsbCBpdCBhZ2FpbiAqLwotCi0gICAgZm9yICh4ID0gbGVmdDsgeCA8IHJpZ2h0OyB4KyspCi0gICAgewotICAgICAgICBpZiAoZmlsbFR5cGUgPT0gRkxPT0RGSUxMQk9SREVSKSBYUHV0UGl4ZWwoIGltYWdlLCB4LCB5LCBwaXhlbCApOwotICAgICAgICBlbHNlIFhQdXRQaXhlbCggaW1hZ2UsIHgsIHksIH5waXhlbCApOwotICAgIH0KLQotICAgICAgLyogRmlsbCB0aGUgbGluZSBhYm92ZSAqLwotCi0gICAgaWYgKC0teSA+PSAwKQotICAgIHsKLSAgICAgICAgeCA9IGxlZnQ7Ci0gICAgICAgIHdoaWxlICh4IDwgcmlnaHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdoaWxlICgoeCA8IHJpZ2h0KSAmJiAhVE9fRkxPT0QoeCx5KSkgeCsrOwotICAgICAgICAgICAgaWYgKHggPj0gcmlnaHQpIGJyZWFrOwotICAgICAgICAgICAgd2hpbGUgKCh4IDwgcmlnaHQpICYmIFRPX0ZMT09EKHgseSkpIHgrKzsKLSAgICAgICAgICAgIEdSQVBIX0ludGVybmFsRmxvb2RGaWxsKCBpbWFnZSwgZGMsIHgtMSwgeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4T3JnLCB5T3JnLCBwaXhlbCwgZmlsbFR5cGUgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgICAgLyogRmlsbCB0aGUgbGluZSBiZWxvdyAqLwotCi0gICAgaWYgKCh5ICs9IDIpIDwgaW1hZ2UtPmhlaWdodCkKLSAgICB7Ci0gICAgICAgIHggPSBsZWZ0OwotICAgICAgICB3aGlsZSAoeCA8IHJpZ2h0KQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAoKHggPCByaWdodCkgJiYgIVRPX0ZMT09EKHgseSkpIHgrKzsKLSAgICAgICAgICAgIGlmICh4ID49IHJpZ2h0KSBicmVhazsKLSAgICAgICAgICAgIHdoaWxlICgoeCA8IHJpZ2h0KSAmJiBUT19GTE9PRCh4LHkpKSB4Kys7Ci0gICAgICAgICAgICBHUkFQSF9JbnRlcm5hbEZsb29kRmlsbCggaW1hZ2UsIGRjLCB4LTEsIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeE9yZywgeU9yZywgcGl4ZWwsIGZpbGxUeXBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0jdW5kZWYgVE9fRkxPT0QgICAgCisgICAgcmV0dXJuIGRjICYmIGRjLT5mdW5jcy0+cFBvbHlQb2x5Z29uICYmCisgICAgCSAgIGRjLT5mdW5jcy0+cFBvbHlQb2x5Z29uKGRjLHB0LGNvdW50cyxwb2x5Z29ucyk7CiB9CiAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgIEdSQVBIX0RvRmxvb2RGaWxsCi0gKgotICogTWFpbiBmbG9vZC1maWxsIHJvdXRpbmUuCi0gKi8KLXN0YXRpYyBCT09MMzIgR1JBUEhfRG9GbG9vZEZpbGwoIERDICpkYywgUkVDVDMyICpyZWN0LCBJTlQzMiB4LCBJTlQzMiB5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09MT1JSRUYgY29sb3IsIFVJTlQzMiBmaWxsVHlwZSApCi17Ci0gICAgWEltYWdlICppbWFnZTsKLQotICAgIGlmICghKGltYWdlID0gWEdldEltYWdlKCBkaXNwbGF5LCBkYy0+dS54LmRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1ggKyByZWN0LT5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyByZWN0LT50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QtPnJpZ2h0IC0gcmVjdC0+bGVmdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdC0+Ym90dG9tIC0gcmVjdC0+dG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxQbGFuZXMsIFpQaXhtYXAgKSkpIHJldHVybiBGQUxTRTsKLQotICAgIGlmIChEQ19TZXR1cEdDRm9yQnJ1c2goIGRjICkpCi0gICAgewotICAgICAgICAgIC8qIFJPUCBtb2RlIGlzIGFsd2F5cyBHWGNvcHkgZm9yIGZsb29kLWZpbGwgKi8KLSAgICAgICAgWFNldEZ1bmN0aW9uKCBkaXNwbGF5LCBkYy0+dS54LmdjLCBHWGNvcHkgKTsKLSAgICAgICAgR1JBUEhfSW50ZXJuYWxGbG9vZEZpbGwoIGltYWdlLCBkYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhMUFRPRFAoZGMseCkgLSByZWN0LT5sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWUxQVE9EUChkYyx5KSAtIHJlY3QtPnRvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRjLT53LkRDT3JnWCArIHJlY3QtPmxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYy0+dy5EQ09yZ1kgKyByZWN0LT50b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9Ub1BoeXNpY2FsKCBkYywgY29sb3IgKSwgZmlsbFR5cGUgKTsKLSAgICB9Ci0KLSAgICBYRGVzdHJveUltYWdlKCBpbWFnZSApOwotICAgIHJldHVybiBUUlVFOwotfQotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICBFeHRGbG9vZEZpbGwxNiAgIChHREkuMzcyKQogICovCkBAIC0xMjQ5LDI2ICs2OTEsMTAgQEAKIEJPT0wzMiBFeHRGbG9vZEZpbGwzMiggSERDMzIgaGRjLCBJTlQzMiB4LCBJTlQzMiB5LCBDT0xPUlJFRiBjb2xvciwKICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGZpbGxUeXBlICkKIHsKLSAgICBSRUNUMzIgcmVjdDsKLSAgICBEQyAqZGM7CisgICAgREMgKmRjID0gRENfR2V0RENQdHIoIGhkYyApOwogCi0gICAgZHByaW50Zl9ncmFwaGljcyggc3RkZGViLCAiRXh0Rmxvb2RGaWxsICUwNHggJWQsJWQgJTA2bHggJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgaGRjLCB4LCB5LCBjb2xvciwgZmlsbFR5cGUgKTsKLSAgICBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKGhkYywgRENfTUFHSUMpOwotICAgIGlmICghZGMpIAotICAgIHsKLQlkYyA9IChEQyAqKUdESV9HZXRPYmpQdHIoaGRjLCBNRVRBRklMRV9EQ19NQUdJQyk7Ci0JaWYgKCFkYykgcmV0dXJuIEZBTFNFOwotCU1GX01ldGFQYXJhbTQoZGMsIE1FVEFfRkxPT0RGSUxMLCB4LCB5LCBISVdPUkQoY29sb3IpLCAKLQkJICAgICAgTE9XT1JEKGNvbG9yKSk7IAotCXJldHVybiBUUlVFOwotICAgIH0KLQotICAgIGlmICghUHRWaXNpYmxlMzIoIGhkYywgeCwgeSApKSByZXR1cm4gRkFMU0U7Ci0gICAgaWYgKEdldFJnbkJveDMyKCBkYy0+dy5oR0NDbGlwUmduLCAmcmVjdCApID09IEVSUk9SKSByZXR1cm4gRkFMU0U7Ci0KLSAgICByZXR1cm4gQ2FsbFRvMzJfTGFyZ2VTdGFjayggKGludCgqKSgpKUdSQVBIX0RvRmxvb2RGaWxsLCA2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYywgJnJlY3QsIHgsIHksIGNvbG9yLCBmaWxsVHlwZSApOworICAgIHJldHVybiBkYyAmJiBkYy0+ZnVuY3MtPnBFeHRGbG9vZEZpbGwgJiYKKwkgICBkYy0+ZnVuY3MtPnBFeHRGbG9vZEZpbGwoZGMseCx5LGNvbG9yLGZpbGxUeXBlKTsKIH0KIAogCmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGY1ZGQ0OGEuLmU3YTA3M2QgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC0xMDksNyArMTA5LDcgQEAKICAgICAgICAgICAgICAgICBMUE1PVVNFSE9PS1NUUlVDVDMyIGxwbXMzMiA9IEhlYXBBbGxvYyggU3lzdGVtSGVhcCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKCpscG1zMzIpICk7CiAKLSAgICAgICAgICAgICAgICBTVFJVQ1QzMl9QT0lOVDE2dG8zMiggJmxwbXMxNi0+cHQsICZscG1zMzItPnB0ICk7CisgICAgICAgICAgICAgICAgQ09OVl9QT0lOVDE2VE8zMiggJmxwbXMxNi0+cHQsICZscG1zMzItPnB0ICk7CiAKICAgICAgICAgICAgICAgICAvKiB3SGl0VGVzdENvZGUgbWF5IGJlIG5lZ2F0aXZlLCBzbyBjb252aW5jZSBjb21waWxlciB0byBkbwogICAgICAgICAgICAgICAgICAgIGNvcnJlY3Qgc2lnbiBleHRlbnNpb24uIFlheS4gOnwgKi8KQEAgLTEyNiw3ICsxMjYsNyBAQAogICAgICAgICAgICAgICAgIExQUkVDVDMyIGxwcmVjdDMyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKmxwcmVjdDMyKSApOwogCi0gICAgICAgICAgICAgICAgU1RSVUNUMzJfUkVDVDE2dG8zMiggbHByZWN0MTYsIGxwcmVjdDMyICk7CisgICAgICAgICAgICAgICAgQ09OVl9SRUNUMTZUTzMyKCBscHJlY3QxNiwgbHByZWN0MzIgKTsKICAgICAgICAgICAgICAgICAqcGxQYXJhbSA9IChMUEFSQU0pbHByZWN0MzI7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xMzgsNyArMTM4LDcgQEAKICAgICAgICAgICAgIExQTU9VU0VIT09LU1RSVUNUMzIgbHBtczMyID0gSGVhcEFsbG9jKCBTeXN0ZW1IZWFwLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqbHBtczMyKSApOwogCi0gICAgICAgICAgICBTVFJVQ1QzMl9QT0lOVDE2dG8zMiggJmxwbXMxNi0+cHQsICZscG1zMzItPnB0ICk7CisgICAgICAgICAgICBDT05WX1BPSU5UMTZUTzMyKCAmbHBtczE2LT5wdCwgJmxwbXMzMi0+cHQgKTsKIAogICAgICAgICAgICAgLyogd0hpdFRlc3RDb2RlIG1heSBiZSBuZWdhdGl2ZSwgc28gY29udmluY2UgY29tcGlsZXIgdG8gZG8KICAgICAgICAgICAgICAgIGNvcnJlY3Qgc2lnbiBleHRlbnNpb24uIFlheS4gOnwgKi8KQEAgLTQxMyw3ICs0MTMsNyBAQAogCSAgICAgIExQTU9VU0VIT09LU1RSVUNUMzIgbHBtczMyID0gKExQTU9VU0VIT09LU1RSVUNUMzIpKnBsUGFyYW07CiAJICAgICAgTFBNT1VTRUhPT0tTVFJVQ1QxNiBscG1zMTYgPSBTRUdQVFJfTkVXKCBNT1VTRUhPT0tTVFJVQ1QxNiApOwogCi0JICAgICAgU1RSVUNUMzJfUE9JTlQzMnRvMTYoICZscG1zMzItPnB0LCAmbHBtczE2LT5wdCApOworCSAgICAgIENPTlZfUE9JTlQzMlRPMTYoICZscG1zMzItPnB0LCAmbHBtczE2LT5wdCApOwogCiAJICAgICAgbHBtczE2LT5od25kICAgICAgICAgPSBscG1zMzItPmh3bmQ7CiAJICAgICAgbHBtczE2LT53SGl0VGVzdENvZGUgPSBscG1zMzItPndIaXRUZXN0Q29kZTsKQEAgLTQyOCw3ICs0MjgsNyBAQAogCSAgICAgIExQUkVDVDMyIGxwcmVjdDMyID0gKExQUkVDVDMyKSpwbFBhcmFtOwogCSAgICAgIExQUkVDVDE2IGxwcmVjdDE2ID0gU0VHUFRSX05FVyggUkVDVDE2ICk7CiAKLQkgICAgICBTVFJVQ1QzMl9SRUNUMzJ0bzE2KCBscHJlY3QzMiwgbHByZWN0MTYgKTsKKwkgICAgICBDT05WX1JFQ1QzMlRPMTYoIGxwcmVjdDMyLCBscHJlY3QxNiApOwogCiAJICAgICAgKnBsUGFyYW0gPSAoTFBBUkFNKVNFR1BUUl9HRVQoIGxwcmVjdDE2ICk7CiAJICAgICAgYnJlYWs7CkBAIC00NDEsNyArNDQxLDcgQEAKIAkgIExQTU9VU0VIT09LU1RSVUNUMzIgbHBtczMyID0gKExQTU9VU0VIT09LU1RSVUNUMzIpKnBsUGFyYW07CiAJICBMUE1PVVNFSE9PS1NUUlVDVDE2IGxwbXMxNiA9IFNFR1BUUl9ORVcoIE1PVVNFSE9PS1NUUlVDVDE2ICk7CiAKLQkgIFNUUlVDVDMyX1BPSU5UMzJ0bzE2KCAmbHBtczMyLT5wdCwgJmxwbXMxNi0+cHQgKTsKKwkgIENPTlZfUE9JTlQzMlRPMTYoICZscG1zMzItPnB0LCAmbHBtczE2LT5wdCApOwogCiAJICBscG1zMTYtPmh3bmQgPSBscG1zMzItPmh3bmQ7CiAJICBscG1zMTYtPndIaXRUZXN0Q29kZSA9IGxwbXMzMi0+d0hpdFRlc3RDb2RlOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9rZXlib2FyZC5jIGIvd2luZG93cy9rZXlib2FyZC5jCmluZGV4IGQ0ZGNjN2YuLjFhNDE4ZmQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mva2V5Ym9hcmQuYworKysgYi93aW5kb3dzL2tleWJvYXJkLmMKQEAgLTEwLDYgKzEwLDcgQEAKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiYWNjZWwuaCIKKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKIGV4dGVybiBCT09MIE1vdXNlQnV0dG9uc1N0YXRlc1szXTsKQEAgLTI1LDIxICsyNiwyOCBAQAogICoga2V5Ym9hcmQtaW5wdXQgbWVzc2FnZS4gIFRoaXMgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBzdGF0ZSBvZiB0aGUga2V5CiAgKiBhdCB0aGUgdGltZSB0aGUgaW5wdXQgbWVzc2FnZSB3YXMgZ2VuZXJhdGVkLiAgKFNESyAzLjEgVm9sIDIuIHAgMzkwKQogICovCi1JTlQgR2V0S2V5U3RhdGUoSU5UIGtleWNvZGUpCitJTlQgR2V0S2V5U3RhdGUoSU5UIHZrZXkpCiB7CiAgICAgSU5UIHJldHZhbDsKIAotICAgIGlmKCBrZXljb2RlID49IFZLX0xCVVRUT04gJiYga2V5Y29kZSA8PSBWS19SQlVUVE9OICkKLQlyZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNba2V5Y29kZSAtIFZLX0xCVVRUT05dOwotICAgIGVsc2UKLSAgICB7Ci0JaWYgKGtleWNvZGUgPj0gJ2EnICYmIGtleWNvZGUgPD0gJ3onKQotCSAgICBrZXljb2RlICs9ICdBJyAtICdhJzsKLQlyZXR2YWwgPSAoIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4ODApIDw8IDggKSB8Ci0JCSAgIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVtrZXljb2RlXSAmIDB4MDEpOwotICAgIH0KLQotICAgIGRwcmludGZfa2V5KHN0ZGRlYiwgIkdldEtleVN0YXRlKCV4KSAtPiAleFxuIiwga2V5Y29kZSwgcmV0dmFsKTsKKyAgICBzd2l0Y2ggKHZrZXkpCisJeworCWNhc2UgVktfTEJVVFRPTiA6IC8qIFZLX0xCVVRUT04gaXMgMSAqLworCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF07CisJICAgIGJyZWFrOworCWNhc2UgVktfTUJVVFRPTiA6IC8qIFZLX01CVVRUT04gaXMgNCAqLworCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV07CisJICAgIGJyZWFrOworCWNhc2UgVktfUkJVVFRPTiA6IC8qIFZLX1JCVVRUT04gaXMgMiAqLworCSAgICByZXR2YWwgPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMl07CisJICAgIGJyZWFrOworCWRlZmF1bHQgOgorCSAgICBpZiAodmtleSA+PSAnYScgJiYgdmtleSA8PSAneicpCisJCXZrZXkgKz0gJ0EnIC0gJ2EnOworCSAgICByZXR2YWwgPSAoIChJTlQpKFF1ZXVlS2V5U3RhdGVUYWJsZVt2a2V5XSAmIDB4ODApIDw8IDggKSB8CisJCSAgICAgICAoSU5UKShRdWV1ZUtleVN0YXRlVGFibGVbdmtleV0gJiAweDAxKTsKKwl9CisgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiR2V0S2V5U3RhdGUoMHgleCkgLT4gJXhcbiIsIHZrZXksIHJldHZhbCk7CiAgICAgcmV0dXJuIHJldHZhbDsKIH0KIApAQCAtNTEsNiArNTksNyBAQAogICovCiB2b2lkIEdldEtleWJvYXJkU3RhdGUoQllURSAqbHBLZXlTdGF0ZSkKIHsKKyAgICBkcHJpbnRmX2tleShzdGRkZWIsICJHZXRLZXlib2FyZFN0YXRlKClcbiIpOwogICAgIGlmIChscEtleVN0YXRlICE9IE5VTEwpIHsKIAlRdWV1ZUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPj4gODsKIAlRdWV1ZUtleVN0YXRlVGFibGVbVktfTUJVVFRPTl0gPSBNb3VzZUJ1dHRvbnNTdGF0ZXNbMV0gPj4gODsKQEAgLTY0LDYgKzczLDcgQEAKICAqLwogdm9pZCBTZXRLZXlib2FyZFN0YXRlKEJZVEUgKmxwS2V5U3RhdGUpCiB7CisgICAgZHByaW50Zl9rZXkoc3RkZGViLCAiU2V0S2V5Ym9hcmRTdGF0ZSgpXG4iKTsKICAgICBpZiAobHBLZXlTdGF0ZSAhPSBOVUxMKSB7CiAJbWVtY3B5KFF1ZXVlS2V5U3RhdGVUYWJsZSwgbHBLZXlTdGF0ZSwgMjU2KTsKIAlNb3VzZUJ1dHRvbnNTdGF0ZXNbMF0gPSBRdWV1ZUtleVN0YXRlVGFibGVbVktfTEJVVFRPTl0/IDB4ODAwMDogMDsKQEAgLTE5NSwxNCArMjA1LDE0IEBACiAgICAgICAgICAgICBtZXNnPTM7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgIHsKLSAgICAgICAgICAgIGhNZW51PUdldE1lbnUoaFduZCk7Ci0gICAgICAgICAgICBoU3lzTWVudT1HZXRTeXN0ZW1NZW51KGhXbmQsRkFMU0UpOworICAgICAgICAgICAgaE1lbnU9R2V0TWVudTMyKGhXbmQpOworICAgICAgICAgICAgaFN5c01lbnU9R2V0U3lzdGVtTWVudTMyKGhXbmQsRkFMU0UpOwogICAgICAgICAgICAgaWYgKGhTeXNNZW51KQotICAgICAgICAgICAgICBpU3lzU3RhdD1HZXRNZW51U3RhdGUoaFN5c01lbnUsbHBBY2NlbFRibC0+dGJsW2ldLndJRHZhbCxNRl9CWUNPTU1BTkQpOworICAgICAgICAgICAgICBpU3lzU3RhdD1HZXRNZW51U3RhdGUzMihoU3lzTWVudSxscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsLE1GX0JZQ09NTUFORCk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIGlTeXNTdGF0PS0xOwogICAgICAgICAgICAgaWYgKGhNZW51KQotICAgICAgICAgICAgICBpU3RhdD1HZXRNZW51U3RhdGUoaE1lbnUsbHBBY2NlbFRibC0+dGJsW2ldLndJRHZhbCxNRl9CWUNPTU1BTkQpOworICAgICAgICAgICAgICBpU3RhdD1HZXRNZW51U3RhdGUzMihoTWVudSxscEFjY2VsVGJsLT50YmxbaV0ud0lEdmFsLE1GX0JZQ09NTUFORCk7CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIGlTdGF0PS0xOwogICAgICAgICAgICAgaWYgKGlTeXNTdGF0IT0tMSkKQEAgLTI0MSw3ICsyNTEsNyBAQAogCSAgewogCSAgIC8qICBzb21lIHJlYXNvbnMgZm9yIE5PVCBzZW5kaW5nIHRoZSBXTV97U1lTfUNPTU1BTkQgbWVzc2FnZTogCiAJICAgICogICAjMDogdW5rbm93biAocGxlYXNlIHJlcG9ydCEpCi0JICAgICogICAjMTogZm9yIFdNX0tFWVVQLFdNX1NZS0VZVVAKKwkgICAgKiAgICMxOiBmb3IgV01fS0VZVVAsV01fU1lTS0VZVVAKIAkgICAgKiAgICMyOiBtb3VzZSBpcyBjYXB0dXJlZAogCSAgICAqICAgIzM6IHdpbmRvdyBpcyBkaXNhYmxlZCAKIAkgICAgKiAgICM0OiBpdCdzIGEgZGlzYWJsZWQgc3lzdGVtIG1lbnUgb3B0aW9uCmRpZmYgLS1naXQgYS93aW5kb3dzL21kaS5jIGIvd2luZG93cy9tZGkuYwppbmRleCBmNzgwYjcyLi5mNmU1YmFjIDEwMDY0NAotLS0gYS93aW5kb3dzL21kaS5jCisrKyBiL3dpbmRvd3MvbWRpLmMKQEAgLTEwMSwxMCArMTAxLDEwIEBACiAKICBpZiAod25kUHRyLT50ZXh0KSBsc3RyY3B5bjMyQShidWZmZXIgKyBuLCB3bmRQdHItPnRleHQsIHNpemVvZihidWZmZXIpIC0gbiApOwogCi0gbiAgICA9IEdldE1lbnVTdGF0ZShjbGllbnRJbmZvLT5oV2luZG93TWVudSx3bmRQdHItPndJRG1lbnUgLE1GX0JZQ09NTUFORCk7IAorIG4gICAgPSBHZXRNZW51U3RhdGUzMihjbGllbnRJbmZvLT5oV2luZG93TWVudSx3bmRQdHItPndJRG1lbnUgLE1GX0JZQ09NTUFORCk7IAogIGJSZXQgPSBNb2RpZnlNZW51MzJBKGNsaWVudEluZm8tPmhXaW5kb3dNZW51ICwgd25kUHRyLT53SURtZW51LCAKICAgICAgICAgICAgICAgICAgICAgICBNRl9CWUNPTU1BTkQgfCBNRl9TVFJJTkcsIHduZFB0ci0+d0lEbWVudSwgYnVmZmVyICk7Ci0gQ2hlY2tNZW51SXRlbShjbGllbnRJbmZvLT5oV2luZG93TWVudSAsd25kUHRyLT53SURtZW51ICwgbiAmIE1GX0NIRUNLRUQpOworIENoZWNrTWVudUl0ZW0zMihjbGllbnRJbmZvLT5oV2luZG93TWVudSAsd25kUHRyLT53SURtZW51ICwgbiAmIE1GX0NIRUNLRUQpOwogIHJldHVybiBiUmV0OwogfQogCkBAIC0xMjIsNyArMTIyLDcgQEAKICAgICAgIWNsaWVudEluZm8tPmhXaW5kb3dNZW51ICkgcmV0dXJuIDA7CiAKICBpZCA9IHduZFB0ci0+d0lEbWVudTsKLSBEZWxldGVNZW51KGNsaWVudEluZm8tPmhXaW5kb3dNZW51LGlkLE1GX0JZQ09NTUFORCk7CisgRGVsZXRlTWVudTMyKGNsaWVudEluZm8tPmhXaW5kb3dNZW51LGlkLE1GX0JZQ09NTUFORCk7CiAKICAvKiB3YWxrIHRoZSByZXN0IG9mIE1ESSBjaGlsZHJlbiB0byBwcmV2ZW50IGdhcHMgaW4gdGhlIGlkIAogICAqIHNlcXVlbmNlIGFuZCBpbiB0aGUgbWVudSBjaGlsZCBsaXN0ICovCkBAIC0yMjYsNyArMjI2LDcgQEAKICAgICBpZiAoIWZSZWZyZXNoKSAKICAgICAgICB7CiAJSFdORCBod25kRnJhbWUgPSBHZXRQYXJlbnQxNihod25kKTsKLQlITUVOVTE2IG9sZEZyYW1lTWVudSA9IEdldE1lbnUoaHduZEZyYW1lKTsKKwlITUVOVTMyIG9sZEZyYW1lTWVudSA9IEdldE1lbnUzMihod25kRnJhbWUpOwogICAgICAgICAKIAlpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCAmJiBobWVudUZyYW1lICYmIGhtZW51RnJhbWUhPW9sZEZyYW1lTWVudSApCiAJICAgIE1ESV9SZXN0b3JlRnJhbWVNZW51KHctPnBhcmVudCwgY2ktPmh3bmRDaGlsZE1heGltaXplZCApOwpAQCAtMjM2LDggKzIzNiw4IEBACiAJICAgIC8qIGRlbGV0ZSBtZW51IGl0ZW1zIGZyb20gY2ktPmhXaW5kb3dNZW51IAogCSAgICAgKiBhbmQgYWRkIHRoZW0gdG8gaG1lbnVXaW5kb3cgKi8KIAotICAgICAgICAgICAgSU5UCQlpID0gR2V0TWVudUl0ZW1Db3VudChjaS0+aFdpbmRvd01lbnUpIC0gMTsKLQkgICAgSU5UIAlwb3MgPSBHZXRNZW51SXRlbUNvdW50KGhtZW51V2luZG93KSArIDE7CisgICAgICAgICAgICBJTlQzMiBpID0gR2V0TWVudUl0ZW1Db3VudDMyKGNpLT5oV2luZG93TWVudSkgLSAxOworCSAgICBJTlQzMiBwb3MgPSBHZXRNZW51SXRlbUNvdW50MzIoaG1lbnVXaW5kb3cpICsgMTsKIAogICAgICAgICAgICAgQXBwZW5kTWVudTMyQSggaG1lbnVXaW5kb3csIE1GX1NFUEFSQVRPUiwgMCwgTlVMTCk7CiAKQEAgLTI0OSwyNyArMjQ5LDI3IEBACiAKIAkJZm9yKCA7IGkgPj0gaiA7IGktLSApCiAJCSAgIHsKLQkJICAgICBpZCA9IEdldE1lbnVJdGVtSUQoY2ktPmhXaW5kb3dNZW51LGkgKTsKLQkJICAgICBzdGF0ZSA9IEdldE1lbnVTdGF0ZShjaS0+aFdpbmRvd01lbnUsaSxNRl9CWVBPU0lUSU9OKTsgCisJCSAgICAgaWQgPSBHZXRNZW51SXRlbUlEMzIoY2ktPmhXaW5kb3dNZW51LGkgKTsKKwkJICAgICBzdGF0ZSA9IEdldE1lbnVTdGF0ZTMyKGNpLT5oV2luZG93TWVudSxpLE1GX0JZUE9TSVRJT04pOyAKIAotCQkgICAgIEdldE1lbnVTdHJpbmcoY2ktPmhXaW5kb3dNZW51LCBpLCBidWZmZXIsIDEwMCwgTUZfQllQT1NJVElPTik7CisJCSAgICAgR2V0TWVudVN0cmluZzMyQShjaS0+aFdpbmRvd01lbnUsIGksIGJ1ZmZlciwgMTAwLCBNRl9CWVBPU0lUSU9OKTsKIAotCQkgICAgIERlbGV0ZU1lbnUoY2ktPmhXaW5kb3dNZW51LCBpICwgTUZfQllQT1NJVElPTik7CisJCSAgICAgRGVsZXRlTWVudTMyKGNpLT5oV2luZG93TWVudSwgaSAsIE1GX0JZUE9TSVRJT04pOwogCQkgICAgIEluc2VydE1lbnUzMkEoaG1lbnVXaW5kb3csIHBvcywgTUZfQllQT1NJVElPTiB8IE1GX1NUUklORywKIAkJCQkJICAgICBpZCwgYnVmZmVyKTsKLQkJICAgICBDaGVja01lbnVJdGVtKGhtZW51V2luZG93ICxwb3MgLCBNRl9CWVBPU0lUSU9OIHwgKHN0YXRlICYgTUZfQ0hFQ0tFRCkpOworCQkgICAgIENoZWNrTWVudUl0ZW0zMihobWVudVdpbmRvdyAscG9zICwgTUZfQllQT1NJVElPTiB8IChzdGF0ZSAmIE1GX0NIRUNLRUQpKTsKIAkJICAgfQogCSAgICAgIH0KIAogCSAgICAvKiByZW1vdmUgc2VwYXJhdG9yICovCi0JICAgIERlbGV0ZU1lbnUoY2ktPmhXaW5kb3dNZW51LCBpLCBNRl9CWVBPU0lUSU9OKTsgCisJICAgIERlbGV0ZU1lbnUzMihjaS0+aFdpbmRvd01lbnUsIGksIE1GX0JZUE9TSVRJT04pOyAKIAogCSAgICBjaS0+aFdpbmRvd01lbnUgPSBobWVudVdpbmRvdzsKIAkgIH0gCiAKIAlpZiggaG1lbnVGcmFtZSAmJiBobWVudUZyYW1lIT1vbGRGcmFtZU1lbnUpCiAJICB7Ci0JICAgIFNldE1lbnUoaHduZEZyYW1lLCBobWVudUZyYW1lKTsKKwkgICAgU2V0TWVudTMyKGh3bmRGcmFtZSwgaG1lbnVGcmFtZSk7CiAJICAgIGlmKCBjaS0+aHduZENoaWxkTWF4aW1pemVkICkKIAkgICAgICAgIE1ESV9BdWdtZW50RnJhbWVNZW51KGNpLCB3LT5wYXJlbnQsIGNpLT5od25kQ2hpbGRNYXhpbWl6ZWQgKTsKIAkgICAgcmV0dXJuIG9sZEZyYW1lTWVudTsKQEAgLTM4Niw3ICszODYsNyBAQAogICAgIGVsc2UKICAgICB7CiAJY2ktPm5BY3RpdmVDaGlsZHJlbi0tOwotCURlbGV0ZU1lbnUoY2ktPmhXaW5kb3dNZW51LHdJRG1lbnUsTUZfQllDT01NQU5EKTsKKwlEZWxldGVNZW51MzIoY2ktPmhXaW5kb3dNZW51LHdJRG1lbnUsTUZfQllDT01NQU5EKTsKIAlpZiggSXNXaW5kb3coaHduZE1heCkgKQogCSAgICBTaG93V2luZG93KGh3bmRNYXgsIFNXX1NIT1dNQVhJTUlaRUQpOwogICAgIH0KQEAgLTU1MCw4ICs1NTAsOCBAQAogI2VuZGlmIAogICAgICAgICAvKiB1bmNoZWNrIG1lbnUgaXRlbSAqLwogICAgICAgIAlpZiggY2xpZW50SW5mby0+aFdpbmRvd01lbnUgKQotICAgICAgIAkgICAgICAgIENoZWNrTWVudUl0ZW0oIGNsaWVudEluZm8tPmhXaW5kb3dNZW51LAotICAgICAgIAkgICAgICAgICAgICAgICAgICAgICAgIHduZFByZXYtPndJRG1lbnUsIDApOworICAgICAgIAkgICAgICAgIENoZWNrTWVudUl0ZW0zMiggY2xpZW50SW5mby0+aFdpbmRvd01lbnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQcmV2LT53SURtZW51LCAwKTsKICAgICAgIH0KIAogICAgIC8qIHNldCBhcHBlYXJhbmNlICovCkBAIC01NzgsOCArNTc4LDggQEAKIAkKICAgICAvKiBjaGVjayBtZW51IGl0ZW0gKi8KICAgICBpZiggY2xpZW50SW5mby0+aFdpbmRvd01lbnUgKQotICAgICAgICAgICAgICBDaGVja01lbnVJdGVtKCBjbGllbnRJbmZvLT5oV2luZG93TWVudSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT53SURtZW51LCBNRl9DSEVDS0VEKTsKKyAgICAgICAgICAgICAgQ2hlY2tNZW51SXRlbTMyKCBjbGllbnRJbmZvLT5oV2luZG93TWVudSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3bmRQdHItPndJRG1lbnUsIE1GX0NIRUNLRUQpOwogCiAgICAgLyogYnJpbmcgYWN0aXZlIGNoaWxkIHRvIHRoZSB0b3AgKi8KICAgICBTZXRXaW5kb3dQb3MoIGhXbmRDaGlsZCwgMCwwLDAsMCwwLCBTV1BfTk9TSVpFIHwgU1dQX05PTU9WRSB8IFNXUF9OT0FDVElWQVRFKTsKQEAgLTg1MywyMSArODUzLDIxIEBACiAgCiAgaWYoICFJbnNlcnRNZW51MzJBKGZyYW1lLT53SURtZW51LDAsTUZfQllQT1NJVElPTiB8IE1GX0JJVE1BUCB8IE1GX1BPUFVQLAogICAgICAgICAgICAgICAgICAgICBoU3lzUG9wdXAsIChMUFNUUikoRFdPUkQpaEJtcENsb3NlICkpCi0gICB7ICBEZXN0cm95TWVudShoU3lzUG9wdXApOyByZXR1cm4gMDsgfQorICAgeyAgRGVzdHJveU1lbnUzMihoU3lzUG9wdXApOyByZXR1cm4gMDsgfQogCiAgaWYoICFBcHBlbmRNZW51MzJBKGZyYW1lLT53SURtZW51LE1GX0hFTFAgfCBNRl9CSVRNQVAsCiAgICAgICAgICAgICAgICAgICAgIFNDX1JFU1RPUkUsIChMUFNUUikoRFdPUkQpaEJtcFJlc3RvcmUgKSkKICAgIHsKLSAgICAgIFJlbW92ZU1lbnUoZnJhbWUtPndJRG1lbnUsMCxNRl9CWVBPU0lUSU9OKTsKKyAgICAgIFJlbW92ZU1lbnUzMihmcmFtZS0+d0lEbWVudSwwLE1GX0JZUE9TSVRJT04pOwogICAgICAgcmV0dXJuIDA7CiAgICB9CiAKLSBFbmFibGVNZW51SXRlbShoU3lzUG9wdXAsIFNDX1NJWkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7Ci0gRW5hYmxlTWVudUl0ZW0oaFN5c1BvcHVwLCBTQ19NT1ZFLCBNRl9CWUNPTU1BTkQgfCBNRl9HUkFZRUQpOwotIEVuYWJsZU1lbnVJdGVtKGhTeXNQb3B1cCwgU0NfTUFYSU1JWkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgRW5hYmxlTWVudUl0ZW0zMihoU3lzUG9wdXAsIFNDX1NJWkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgRW5hYmxlTWVudUl0ZW0zMihoU3lzUG9wdXAsIFNDX01PVkUsIE1GX0JZQ09NTUFORCB8IE1GX0dSQVlFRCk7CisgRW5hYmxlTWVudUl0ZW0zMihoU3lzUG9wdXAsIFNDX01BWElNSVpFLCBNRl9CWUNPTU1BTkQgfCBNRl9HUkFZRUQpOwogCiAgLyogcmVkcmF3IG1lbnUgKi8KLSBEcmF3TWVudUJhcihmcmFtZS0+aHduZFNlbGYpOworIERyYXdNZW51QmFyMzIoZnJhbWUtPmh3bmRTZWxmKTsKIAogIHJldHVybiAxOwogfQpAQCAtODc3LDE4ICs4NzcsMTggQEAKICAqLwogQk9PTCBNRElfUmVzdG9yZUZyYW1lTWVudSggV05EICpmcmFtZVduZCwgSFdORCBoQ2hpbGQpCiB7Ci0gSU5UCW5JdGVtcyAgID0gR2V0TWVudUl0ZW1Db3VudChmcmFtZVduZC0+d0lEbWVudSkgLSAxOworIElOVDMyIG5JdGVtcyA9IEdldE1lbnVJdGVtQ291bnQzMihmcmFtZVduZC0+d0lEbWVudSkgLSAxOwogCiAgZHByaW50Zl9tZGkoc3RkZGViLCJNRElfUmVzdG9yZUZyYW1lTWVudTogZm9yIGNoaWxkICUwNHhcbiIsaENoaWxkKTsKIAotIGlmKCBHZXRNZW51SXRlbUlEKGZyYW1lV25kLT53SURtZW51LG5JdGVtcykgIT0gU0NfUkVTVE9SRSApCisgaWYoIEdldE1lbnVJdGVtSUQzMihmcmFtZVduZC0+d0lEbWVudSxuSXRlbXMpICE9IFNDX1JFU1RPUkUgKQogICAgICByZXR1cm4gMDsgCiAKIAotIFJlbW92ZU1lbnUoZnJhbWVXbmQtPndJRG1lbnUsMCxNRl9CWVBPU0lUSU9OKTsKLSBEZWxldGVNZW51KGZyYW1lV25kLT53SURtZW51LG5JdGVtcy0xLE1GX0JZUE9TSVRJT04pOworIFJlbW92ZU1lbnUzMihmcmFtZVduZC0+d0lEbWVudSwwLE1GX0JZUE9TSVRJT04pOworIERlbGV0ZU1lbnUzMihmcmFtZVduZC0+d0lEbWVudSxuSXRlbXMtMSxNRl9CWVBPU0lUSU9OKTsKIAotIERyYXdNZW51QmFyKGZyYW1lV25kLT5od25kU2VsZik7CisgRHJhd01lbnVCYXIzMihmcmFtZVduZC0+aHduZFNlbGYpOwogCiAgcmV0dXJuIDE7CiB9CkBAIC0xMDE5LDExICsxMDE5LDExIEBACiAgICAgICAKICAgICAgIGNhc2UgV01fREVTVFJPWToKIAlpZiggY2ktPmh3bmRDaGlsZE1heGltaXplZCApIE1ESV9SZXN0b3JlRnJhbWVNZW51KHcsIGZyYW1lV25kLT5od25kU2VsZik7Ci0JaWYoKG5JdGVtcyA9IEdldE1lbnVJdGVtQ291bnQoY2ktPmhXaW5kb3dNZW51KSkgPiAwKSB7CisJaWYoKG5JdGVtcyA9IEdldE1lbnVJdGVtQ291bnQzMihjaS0+aFdpbmRvd01lbnUpKSA+IDApIHsKICAgICAJICAgIGNpLT5pZEZpcnN0Q2hpbGQgPSBuSXRlbXMgLSAxOwogCSAgICBjaS0+bkFjdGl2ZUNoaWxkcmVuKys7IAkJLyogdG8gZGVsZXRlIGEgc2VwYXJhdG9yICovCiAJICAgIHdoaWxlKCBjaS0+bkFjdGl2ZUNoaWxkcmVuLS0gKQotCSAgICAgICAgRGVsZXRlTWVudShjaS0+aFdpbmRvd01lbnUsTUZfQllQT1NJVElPTixjaS0+aWRGaXJzdENoaWxkLS0pOworCSAgICAgICAgRGVsZXRlTWVudTMyKGNpLT5oV2luZG93TWVudSxNRl9CWVBPU0lUSU9OLGNpLT5pZEZpcnN0Q2hpbGQtLSk7CiAJfQogCXJldHVybiAwOwogCkBAIC0xMjMxLDExICsxMjMxLDExIEBACiAJCWlmKCB3UGFyYW0gPT0gVktfTEVGVCApIAogCQkgIHsgaWYoIHduZFB0ci0+cGFyZW50LT53SURtZW51ICE9IExPV09SRChsUGFyYW0pICkgYnJlYWs7IH0KIAkJZWxzZSBpZiggd1BhcmFtID09IFZLX1JJR0hUICkKLQkJICB7IGlmKCBHZXRTeXN0ZW1NZW51KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsIDApIAotCQkJCSAgICAgICAhPSBMT1dPUkQobFBhcmFtKSApIGJyZWFrOyB9CisJCSAgeyBpZiggR2V0U3lzdGVtTWVudTE2KCB3bmRQdHItPnBhcmVudC0+aHduZFNlbGYsIDApIAorICAgICAgICAgICAgICAgICAgICAgICAgICAhPSBMT1dPUkQobFBhcmFtKSApIGJyZWFrOyB9CiAJCWVsc2UgYnJlYWs7CiAJCQotCQlyZXR1cm4gTUFLRUxPTkcoIEdldFN5c3RlbU1lbnUoY2ktPmh3bmRBY3RpdmVDaGlsZCwgMCksIAorCQlyZXR1cm4gTUFLRUxPTkcoIEdldFN5c3RlbU1lbnUxNihjaS0+aHduZEFjdGl2ZUNoaWxkLCAwKSwgCiAJCQkJIGNpLT5od25kQWN0aXZlQ2hpbGQgKTsKIAkgICAgICB9CiAJICAgIGJyZWFrOwpAQCAtMTQ0OSw3ICsxNDQ5LDcgQEAKICAgICAgIGNhc2UgV01fTkVYVE1FTlU6CiAKIAlpZiggd1BhcmFtID09IFZLX0xFRlQgKQkJLyogc3dpdGNoIHRvIGZyYW1lIHN5c3RlbSBtZW51ICovCi0JICByZXR1cm4gTUFLRUxPTkcoIEdldFN5c3RlbU1lbnUoY2xpZW50V25kLT5wYXJlbnQtPmh3bmRTZWxmLCAwKSwgCisJICByZXR1cm4gTUFLRUxPTkcoIEdldFN5c3RlbU1lbnUxNihjbGllbnRXbmQtPnBhcmVudC0+aHduZFNlbGYsIDApLCAKIAkJCSAgIGNsaWVudFduZC0+cGFyZW50LT5od25kU2VsZiApOwogCWlmKCB3UGFyYW0gPT0gVktfUklHSFQgKQkvKiB0byBmcmFtZSBtZW51IGJhciAqLwogCSAgcmV0dXJuIE1BS0VMT05HKCBjbGllbnRXbmQtPnBhcmVudC0+d0lEbWVudSwKZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWVzc2FnZS5jIGIvd2luZG93cy9tZXNzYWdlLmMKaW5kZXggNzBiMzA0My4uMjAzZDdlOCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZXNzYWdlLmMKKysrIGIvd2luZG93cy9tZXNzYWdlLmMKQEAgLTExNjYsNiArMTE2Niw0OCBAQAogICogYnkgdGhlIGtleWJvYXJkIGRyaXZlci4KICAqLwogCitjb25zdCBzdHJ1Y3QgYWNjZW50X2NoYXIKKwl7CisJQllURSBhY19hY2NlbnQ7CisJQllURSBhY19jaGFyOworCUJZVEUgYWNfcmVzdWx0OworCX0gYWNjZW50X2NoYXJzW10gPQorCXsKKwl7J2AnLCAnQScsICdcMzAwJ30sCXsnYCcsICdhJywgJ1wzNDAnfSwKKwl7J1wnJywgJ0EnLCAnXDMwMSd9LAl7J1wnJywgJ2EnLCAnXDM0MSd9LAorCXsnXicsICdBJywgJ1wzMDInfSwJeydeJywgJ2EnLCAnXDM0Mid9LAorCXsnficsICdBJywgJ1wzMDMnfSwJeyd+JywgJ2EnLCAnXDM0Myd9LAorCXsnIicsICdBJywgJ1wzMDQnfSwJeyciJywgJ2EnLCAnXDM0NCd9LAorCXsnTycsICdBJywgJ1wzMDUnfSwJeydvJywgJ2EnLCAnXDM0NSd9LAorCXsnMCcsICdBJywgJ1wzMDUnfSwJeycwJywgJ2EnLCAnXDM0NSd9LAorCXsnQScsICdBJywgJ1wzMDUnfSwJeydhJywgJ2EnLCAnXDM0NSd9LAorCXsnQScsICdFJywgJ1wzMDYnfSwJeydhJywgJ2UnLCAnXDM0Nid9LAorCXsnLCcsICdDJywgJ1wzMDcnfSwJeycsJywgJ2MnLCAnXDM0Nyd9LAorCXsnYCcsICdFJywgJ1wzMTAnfSwJeydgJywgJ2UnLCAnXDM1MCd9LAorCXsnXCcnLCAnRScsICdcMzExJ30sCXsnXCcnLCAnZScsICdcMzUxJ30sCisJeydeJywgJ0UnLCAnXDMxMid9LAl7J14nLCAnZScsICdcMzUyJ30sCisJeyciJywgJ0UnLCAnXDMxMyd9LAl7JyInLCAnZScsICdcMzUzJ30sCisJeydgJywgJ0knLCAnXDMxNCd9LAl7J2AnLCAnaScsICdcMzU0J30sCisJeydcJycsICdJJywgJ1wzMTUnfSwJeydcJycsICdpJywgJ1wzNTUnfSwKKwl7J14nLCAnSScsICdcMzE2J30sCXsnXicsICdpJywgJ1wzNTYnfSwKKwl7JyInLCAnSScsICdcMzE3J30sCXsnIicsICdpJywgJ1wzNTcnfSwKKwl7Jy0nLCAnRCcsICdcMzIwJ30sCXsnLScsICdkJywgJ1wzNjAnfSwKKwl7J34nLCAnTicsICdcMzIxJ30sCXsnficsICduJywgJ1wzNjEnfSwKKwl7J2AnLCAnTycsICdcMzIyJ30sCXsnYCcsICdvJywgJ1wzNjInfSwKKwl7J1wnJywgJ08nLCAnXDMyMyd9LAl7J1wnJywgJ28nLCAnXDM2Myd9LAorCXsnXicsICdPJywgJ1wzMjQnfSwJeydeJywgJ28nLCAnXDM2NCd9LAorCXsnficsICdPJywgJ1wzMjUnfSwJeyd+JywgJ28nLCAnXDM2NSd9LAorCXsnIicsICdPJywgJ1wzMjYnfSwJeyciJywgJ28nLCAnXDM2Nid9LAorCXsnLycsICdPJywgJ1wzMzAnfSwJeycvJywgJ28nLCAnXDM3MCd9LAorCXsnYCcsICdVJywgJ1wzMzEnfSwJeydgJywgJ3UnLCAnXDM3MSd9LAorCXsnXCcnLCAnVScsICdcMzMyJ30sCXsnXCcnLCAndScsICdcMzcyJ30sCisJeydeJywgJ1UnLCAnXDMzMyd9LAl7J14nLCAndScsICdcMzczJ30sCisJeyciJywgJ1UnLCAnXDMzNCd9LAl7JyInLCAndScsICdcMzc0J30sCisJeydcJycsICdZJywgJ1wzMzUnfSwJeydcJycsICd5JywgJ1wzNzUnfSwKKwl7J1QnLCAnSCcsICdcMzM2J30sCXsndCcsICdoJywgJ1wzNzYnfSwKKwl7J3MnLCAncycsICdcMzM3J30sCXsnIicsICd5JywgJ1wzNzcnfSwKKwl7J3MnLCAneicsICdcMzM3J30sCXsnaScsICdqJywgJ1wzNzcnfSwKKwl9OwogCiBCT09MIFRyYW5zbGF0ZU1lc3NhZ2UoIExQTVNHMTYgbXNnICkKIHsKQEAgLTExNzYsMjUgKzEyMTgsNTQgQEAKIAkmJiBtZXNzYWdlICE9IFdNX01PVVNFTU9WRSAmJiBtZXNzYWdlICE9IFdNX1RJTUVSKQogICAgIHx8IChkZWJ1Z2dpbmdfa2V5CiAJJiYgbWVzc2FnZSA+PSBXTV9LRVlGSVJTVCAmJiBtZXNzYWdlIDw9IFdNX0tFWUxBU1QpKQotCSAgICBmcHJpbnRmKHN0ZGRlYiwgIlRyYW5zbGF0ZU1lc3NhZ2UoJXMsICUwNHgsICUwOGx4KVxuIiwKKwkgICAgZnByaW50ZihzdGRkZWIsICJUcmFuc2xhdGVNZXNzYWdlKCVzLCAlMDRYLCAlMDhsWClcbiIsCiAJCVNQWV9HZXRNc2dOYW1lKG1zZy0+bWVzc2FnZSksIG1zZy0+d1BhcmFtLCBtc2ctPmxQYXJhbSk7CiAgICAgaWYgKChtZXNzYWdlID09IFdNX0tFWURPV04pIHx8IChtZXNzYWdlID09IFdNX1NZU0tFWURPV04pKQogICAgIHsKKwlzdGF0aWMgZGVhZF9jaGFyOworCiAJaWYgKGRlYnVnZ2luZ19tc2cgfHwgZGVidWdnaW5nX2tleSkKLQkgICAgZnByaW50ZihzdGRkZWIsICJUcmFuc2xhdGluZyBrZXkgJTA0eCwgc2NhbmNvZGUgJTA0eFxuIiwKKwkgICAgZnByaW50ZihzdGRkZWIsICJUcmFuc2xhdGluZyBrZXkgJTA0WCwgc2NhbmNvZGUgJTA0WFxuIiwKIAkJbXNnLT53UGFyYW0sIEhJV09SRChtc2ctPmxQYXJhbSkgKTsKIAogCS8qIEZJWE1FIDogc2hvdWxkIGhhbmRsZSBUb0FzY2lpIHlpZWxkaW5nIDIgKi8KLQlpZiAoVG9Bc2NpaShtc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSwgKExQU1RSKSZRdWV1ZUtleVN0YXRlVGFibGUsCi0JCQkJICAgICAgd3BhcmFtLCAwKSkgCi0JICAgICAgewotCQkvKiBNYXAgV01fS0VZKiB0byBXTV8qQ0hBUiAqLwotCQltZXNzYWdlICs9IDIgLSAobWVzc2FnZSAmIDB4MDAwMSk7IAorCXN3aXRjaCAoVG9Bc2NpaShtc2ctPndQYXJhbSwgSElXT1JEKG1zZy0+bFBhcmFtKSwKKwkJKExQU1RSKSZRdWV1ZUtleVN0YXRlVGFibGUsIHdwYXJhbSwgMCkpIAorCSAgICB7CisJICAgIGNhc2UgMSA6CisJCW1lc3NhZ2UgPSBtZXNzYWdlID09IFdNX0tFWURPV04gPyBXTV9DSEFSIDogV01fU1lTQ0hBUjsKKwkJLyogU2hvdWxkIGRlYWQgY2hhcnMgaGFuZGxpbmcgZ28gaW4gVG9Bc2NpaSA/ICovCisJCWlmIChkZWFkX2NoYXIpCisJCSAgICB7CisJCSAgICBpbnQgaTsKIAorCQkgICAgaWYgKHdwYXJhbVswXSA9PSAnICcpCisJCQl3cGFyYW1bMF0gPSAgZGVhZF9jaGFyOworCQkgICAgaWYgKGRlYWRfY2hhciA9PSAweGE4KQorCQkJZGVhZF9jaGFyID0gJyInOworCQkgICAgZWxzZSBpZiAoZGVhZF9jaGFyID09IDB4YjQpCisJCQlkZWFkX2NoYXIgPSAnXCcnOworCQkgICAgZm9yIChpID0gMDsKKwkJCWkgPCBzaXplb2YoYWNjZW50X2NoYXJzKSAvIHNpemVvZihhY2NlbnRfY2hhcnNbMF0pOworCQkJaSArPSAxKQorCQkJaWYgKGFjY2VudF9jaGFyc1tpXS5hY19hY2NlbnQgPT0gZGVhZF9jaGFyCisJCQkmJiBhY2NlbnRfY2hhcnNbaV0uYWNfY2hhciA9PSB3cGFyYW1bMF0pCisJCQkgICAgeworCQkJICAgIHdwYXJhbVswXSA9IGFjY2VudF9jaGFyc1tpXS5hY19yZXN1bHQ7CisJCQkgICAgYnJlYWs7CisJCQkgICAgfQorCQkgICAgZGVhZF9jaGFyID0gMDsKKwkJICAgIH0KK2RwcmludGZfa2V5KHN0ZGRlYiwgIjEgLT4gUG9zdE1lc3NhZ2UoJXMpXG4iLCBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSk7CiAJCVBvc3RNZXNzYWdlKCBtc2ctPmh3bmQsIG1lc3NhZ2UsIHdwYXJhbVswXSwgbXNnLT5sUGFyYW0gKTsKLQogCQlyZXR1cm4gVFJVRTsKLQkgICAgICB9CisJICAgIGNhc2UgLTEgOgorCQltZXNzYWdlID0gbWVzc2FnZSA9PSBXTV9LRVlET1dOID8gV01fREVBRENIQVIgOiBXTV9TWVNERUFEQ0hBUjsKKwkJZGVhZF9jaGFyID0gd3BhcmFtWzBdOworZHByaW50Zl9rZXkoc3RkZGViLCAiLTEgLT4gUG9zdE1lc3NhZ2UoJXMpXG4iLCBTUFlfR2V0TXNnTmFtZShtZXNzYWdlKSk7CisJCVBvc3RNZXNzYWdlKCBtc2ctPmh3bmQsIG1lc3NhZ2UsIHdwYXJhbVswXSwgbXNnLT5sUGFyYW0gKTsKKwkJcmV0dXJuIFRSVUU7CisJICAgIH0KICAgICB9CiAgICAgcmV0dXJuIEZBTFNFOwogfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9ub25jbGllbnQuYyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKaW5kZXggMjBlMmM2Zi4uMmY5M2E2YSAxMDA2NDQKLS0tIGEvd2luZG93cy9ub25jbGllbnQuYworKysgYi93aW5kb3dzL25vbmNsaWVudC5jCkBAIC0yNjgsNyArMjY4LDcgQEAKICAqIGJ1dCB3aXRob3V0IHRoZSBib3JkZXJzIChpZiBhbnkpLgogICogVGhlIHJlY3RhbmdsZSBpcyBpbiB3aW5kb3cgY29vcmRpbmF0ZXMgKGZvciBkcmF3aW5nIHdpdGggR2V0V2luZG93REMoKSkuCiAgKi8KLXN0YXRpYyB2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQgaHduZCwgUkVDVDE2ICpyZWN0ICkKK3N0YXRpYyB2b2lkIE5DX0dldEluc2lkZVJlY3QoIEhXTkQgaHduZCwgUkVDVDMyICpyZWN0ICkKIHsKICAgICBXTkQgKiB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCkBAIC0yODIsMTYgKzI4MiwxNiBAQAogICAgICAgLyogUmVtb3ZlIGZyYW1lIGZyb20gcmVjdGFuZ2xlICovCiAgICAgaWYgKEhBU19ETEdGUkFNRSggd25kUHRyLT5kd1N0eWxlLCB3bmRQdHItPmR3RXhTdHlsZSApKQogICAgIHsKLQlJbmZsYXRlUmVjdDE2KCByZWN0LCAtU1lTTUVUUklDU19DWERMR0ZSQU1FLCAtU1lTTUVUUklDU19DWURMR0ZSQU1FKTsKKwlJbmZsYXRlUmVjdDMyKCByZWN0LCAtU1lTTUVUUklDU19DWERMR0ZSQU1FLCAtU1lTTUVUUklDU19DWURMR0ZSQU1FKTsKIAlpZiAod25kUHRyLT5kd0V4U3R5bGUgJiBXU19FWF9ETEdNT0RBTEZSQU1FKQotICAgICAgICAgICAgSW5mbGF0ZVJlY3QxNiggcmVjdCwgLTEsIDAgKTsKKyAgICAgICAgICAgIEluZmxhdGVSZWN0MzIoIHJlY3QsIC0xLCAwICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7CiAJaWYgKEhBU19USElDS0ZSQU1FKCB3bmRQdHItPmR3U3R5bGUgKSkKLQkgICAgSW5mbGF0ZVJlY3QxNiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hGUkFNRSwgLVNZU01FVFJJQ1NfQ1lGUkFNRSApOworCSAgICBJbmZsYXRlUmVjdDMyKCByZWN0LCAtU1lTTUVUUklDU19DWEZSQU1FLCAtU1lTTUVUUklDU19DWUZSQU1FICk7CiAJaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0JPUkRFUikKLQkgICAgSW5mbGF0ZVJlY3QxNiggcmVjdCwgLVNZU01FVFJJQ1NfQ1hCT1JERVIsIC1TWVNNRVRSSUNTX0NZQk9SREVSICk7CisJICAgIEluZmxhdGVSZWN0MzIoIHJlY3QsIC1TWVNNRVRSSUNTX0NYQk9SREVSLCAtU1lTTUVUUklDU19DWUJPUkRFUiApOwogICAgIH0KIH0KIApAQCAtNDMzLDkgKzQzMyw5IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBOQ19EcmF3U3lzQnV0dG9uCiAgKi8KLXZvaWQgTkNfRHJhd1N5c0J1dHRvbiggSFdORCBod25kLCBIREMxNiBoZGMsIEJPT0wzMiBkb3duICkKK3ZvaWQgTkNfRHJhd1N5c0J1dHRvbiggSFdORDMyIGh3bmQsIEhEQzMyIGhkYywgQk9PTDMyIGRvd24gKQogewotICAgIFJFQ1QxNiByZWN0OworICAgIFJFQ1QzMiByZWN0OwogICAgIEhEQzMyIGhkY01lbTsKICAgICBIQklUTUFQMzIgaGJpdG1hcDsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CkBAIC00NTksNyArNDU5LDcgQEAKICAqLwogc3RhdGljIHZvaWQgTkNfRHJhd01heEJ1dHRvbiggSFdORCBod25kLCBIREMxNiBoZGMsIEJPT0wgZG93biApCiB7Ci0gICAgUkVDVDE2IHJlY3Q7CisgICAgUkVDVDMyIHJlY3Q7CiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogCiAgICAgaWYoICEod25kUHRyLT5mbGFncyAmIFdJTl9NQU5BR0VEKSApCkBAIC00NzksMTMgKzQ3OSwxMyBAQAogICovCiBzdGF0aWMgdm9pZCBOQ19EcmF3TWluQnV0dG9uKCBIV05EIGh3bmQsIEhEQzE2IGhkYywgQk9PTCBkb3duICkKIHsKLSAgICBSRUNUMTYgcmVjdDsKKyAgICBSRUNUMzIgcmVjdDsKICAgICBXTkQgKnduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICk7CiAKICAgICBpZiggISh3bmRQdHItPmZsYWdzICYgV0lOX01BTkFHRUQpICkKICAgICB7CiAgICAgICBOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwotICAgICAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX01BWElNSVpFQk9YKSByZWN0LnJpZ2h0IC09IFNZU01FVFJJQ1NfQ1hTSVpFICsgMTsKKyAgICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19NQVhJTUlaRUJPWCkgcmVjdC5yaWdodCAtPSBTWVNNRVRSSUNTX0NYU0laRSsxOwogICAgICAgR1JBUEhfRHJhd0JpdG1hcCggaGRjLCAoZG93biA/IGhiaXRtYXBNaW5pbWl6ZUQgOiBoYml0bWFwTWluaW1pemUpLAogCQkgICAgICAgIHJlY3QucmlnaHQgLSBTWVNNRVRSSUNTX0NYU0laRSAtIDEsIHJlY3QudG9wLAogCQkgICAgICAgIDAsIDAsIFNZU01FVFJJQ1NfQ1hTSVpFKzEsIFNZU01FVFJJQ1NfQ1lTSVpFICk7CkBAIC03MjMsNyArNzIzLDggQEAKIAogICAgIGlmIChIQVNfTUVOVSh3bmRQdHIpKQogICAgIHsKLQlSRUNUMTYgciA9IHJlY3Q7CisJUkVDVDMyIHI7CisgICAgICAgIENPTlZfUkVDVDE2VE8zMiggJnJlY3QsICZyICk7CiAJci5ib3R0b20gPSByZWN0LnRvcCArIFNZU01FVFJJQ1NfQ1lNRU5VOyAgLyogZGVmYXVsdCBoZWlnaHQgKi8KIAlyZWN0LnRvcCArPSBNRU5VX0RyYXdNZW51QmFyKCBoZGMsICZyLCBod25kLCBzdXBwcmVzc19tZW51cGFpbnQgKTsKICAgICB9CkBAIC04NDQsMTggKzg0NSwxOCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTkNfR2V0U3lzUG9wdXBQb3MKICAqLwotQk9PTDMyIE5DX0dldFN5c1BvcHVwUG9zKCBXTkQqIHduZFB0ciwgUkVDVDE2KiByZWN0ICkKK0JPT0wzMiBOQ19HZXRTeXNQb3B1cFBvcyggV05EKiB3bmRQdHIsIFJFQ1QzMiogcmVjdCApCiB7CiAgIGlmKCB3bmRQdHItPmhTeXNNZW51ICkKICAgewogICAgICAgaWYoIHduZFB0ci0+ZHdTdHlsZSAmIFdTX01JTklNSVpFICkKLQkgIEdldFdpbmRvd1JlY3QxNiggd25kUHRyLT5od25kU2VsZiwgcmVjdCApOworCSAgR2V0V2luZG93UmVjdDMyKCB3bmRQdHItPmh3bmRTZWxmLCByZWN0ICk7CiAgICAgICBlbHNlCiAgICAgICB7CiAgIAkgIE5DX0dldEluc2lkZVJlY3QoIHduZFB0ci0+aHduZFNlbGYsIHJlY3QgKTsKLSAgCSAgT2Zmc2V0UmVjdDE2KCByZWN0LCB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCwgd25kUHRyLT5yZWN0V2luZG93LnRvcCApOworICAJICBPZmZzZXRSZWN0MzIoIHJlY3QsIHduZFB0ci0+cmVjdFdpbmRvdy5sZWZ0LCB3bmRQdHItPnJlY3RXaW5kb3cudG9wKTsKICAgCSAgaWYgKHduZFB0ci0+ZHdTdHlsZSAmIFdTX0NISUxEKQotICAgICAJICAgICAgQ2xpZW50VG9TY3JlZW4xNiggd25kUHRyLT5wYXJlbnQtPmh3bmRTZWxmLCAoUE9JTlQxNiAqKXJlY3QgKTsKKyAgICAgCSAgICAgIENsaWVudFRvU2NyZWVuMzIoIHduZFB0ci0+cGFyZW50LT5od25kU2VsZiwgKFBPSU5UMzIgKilyZWN0ICk7CiAgICAgICAgICAgcmVjdC0+cmlnaHQgPSByZWN0LT5sZWZ0ICsgU1lTTUVUUklDU19DWFNJWkU7CiAgICAgICAgICAgcmVjdC0+Ym90dG9tID0gcmVjdC0+dG9wICsgU1lTTUVUUklDU19DWVNJWkU7CiAgICAgICB9CkBAIC04ODIsMTIgKzg4MywxMyBAQAogCWlmKCAhaWNvbmljICkgCiAJewogCSAgICAgSERDMTYJaGRjID0gR2V0V2luZG93REMzMihod25kKTsKLQkgICAgIFJFQ1QxNglyZWN0LCByVHJhY2s7CisJICAgICBSRUNUMzIJcmVjdDsKKyAgICAgICAgICAgICBSRUNUMTYgICAgIHJUcmFjazsKIAkgICAgIEJPT0wzMiAJYk5ldywgYlRyYWNrID0gVFJVRTsKIAkgICAgIE1TRzE2CW1zZzsKIAkgICAgCiAJICAgICBOQ19HZXRTeXNQb3B1cFBvcyggd25kUHRyLCAmcmVjdCApOwotCSAgICAgclRyYWNrID0gcmVjdDsKKyAgICAgICAgICAgICBDT05WX1JFQ1QzMlRPMTYoICZyZWN0LCAmclRyYWNrICk7CiAJICAgICBNYXBXaW5kb3dQb2ludHMxNiggMCwgaHduZCwgKExQUE9JTlQxNikmclRyYWNrLCAyICk7CiAKIAkgICAgIC8qIHRyYWNrIG1vdXNlIHdoaWxlIHdhaXRpbmcgZm9yIFdNX0xCVVRUT05VUCAqLwpAQCAtOTM2LDcgKzkzOCw3IEBACiAgICAgaWYgKCh3UGFyYW0gJiAweGZmZjApID09IFNDX01PVkUpCiAgICAgewogCSAgLyogTW92ZSBwb2ludGVyIGF0IHRoZSBjZW50ZXIgb2YgdGhlIGNhcHRpb24gKi8KLQlSRUNUMTYgcmVjdDsKKwlSRUNUMzIgcmVjdDsKIAlOQ19HZXRJbnNpZGVSZWN0KCBod25kLCAmcmVjdCApOwogCWlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19TWVNNRU5VKQogCSAgICByZWN0LmxlZnQgKz0gU1lTTUVUUklDU19DWFNJWkUgKyAxOwpAQCAtMTQ1MCw3ICsxNDUyLDggQEAKIAlicmVhazsKIAogICAgIGNhc2UgU0NfTU9VU0VNRU5VOgotICAgICAgICBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCB3bmRQdHIsIHdQYXJhbSAmIDB4MDAwRiwgcHQgKTsKKyAgICAgICAgQ09OVl9QT0lOVDE2VE8zMiggJnB0LCAmcHQzMiApOworICAgICAgICBNRU5VX1RyYWNrTW91c2VNZW51QmFyKCB3bmRQdHIsIHdQYXJhbSAmIDB4MDAwRiwgcHQzMiApOwogCWJyZWFrOwogCiAgICAgY2FzZSBTQ19LRVlNRU5VOgpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggYWFlM2Q2ZC4uMDk2NmI0OSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0zNjAsOCArMzYwLDggQEAKICAgICB9CiAKICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19DSElMRCkpCi0gICAgICAgaWYgKHduZFB0ci0+d0lEbWVudSkgRGVzdHJveU1lbnUoIChITUVOVTE2KXduZFB0ci0+d0lEbWVudSApOwotICAgIGlmICh3bmRQdHItPmhTeXNNZW51KSBEZXN0cm95TWVudSggd25kUHRyLT5oU3lzTWVudSApOworICAgICAgIGlmICh3bmRQdHItPndJRG1lbnUpIERlc3Ryb3lNZW51MzIoIChITUVOVTMyKXduZFB0ci0+d0lEbWVudSApOworICAgIGlmICh3bmRQdHItPmhTeXNNZW51KSBEZXN0cm95TWVudTMyKCB3bmRQdHItPmhTeXNNZW51ICk7CiAgICAgaWYgKHduZFB0ci0+d2luZG93KSBFVkVOVF9EZXN0cm95V2luZG93KCB3bmRQdHIgKTsKICAgICBpZiAod25kUHRyLT5jbGFzcy0+c3R5bGUgJiBDU19PV05EQykgRENFX0ZyZWVEQ0UoIHduZFB0ci0+ZGNlICk7CiAKQEAgLTcwMiw3ICs3MDIsNyBAQAogCiAgICAgaWYgKChjcy0+c3R5bGUgJiBXU19DQVBUSU9OKSAmJiAhKGNzLT5zdHlsZSAmIFdTX0NISUxEKSkKICAgICB7Ci0gICAgICAgIGlmIChjcy0+aE1lbnUpIFNldE1lbnUoaHduZCwgY3MtPmhNZW51KTsKKyAgICAgICAgaWYgKGNzLT5oTWVudSkgU2V0TWVudTMyKGh3bmQsIGNzLT5oTWVudSk7CiAgICAgICAgIGVsc2UKICAgICAgICAgewogI2lmIDAgIC8qIEZJWE1FOiBzaG91bGQgY2hlY2sgaWYgY2xhc3NQdHItPm1lbnVOYW1lVyBjYW4gYmUgdXNlZCBhcyBpcyAqLwpAQCAtNzE1LDcgKzcxNSw3IEBACiAgICAgICAgICAgICBpZiAobWVudU5hbWUpIGNzLT5oTWVudSA9IExvYWRNZW51MTYoIGNzLT5oSW5zdGFuY2UsIG1lbnVOYW1lICk7CiAjZW5kaWYKICAgICAgICAgfQotICAgICAgICBpZiAoY3MtPmhNZW51KSBTZXRNZW51KCBod25kLCBjcy0+aE1lbnUgKTsKKyAgICAgICAgaWYgKGNzLT5oTWVudSkgU2V0TWVudTMyKCBod25kLCBjcy0+aE1lbnUgKTsKICAgICB9CiAgICAgZWxzZSB3bmRQdHItPndJRG1lbnUgPSAoVUlOVCljcy0+aE1lbnU7CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3Mvd2lucG9zLmMgYi93aW5kb3dzL3dpbnBvcy5jCmluZGV4IDkwNjE2ODYuLjQwNTE2ZjMgMTAwNjQ0Ci0tLSBhL3dpbmRvd3Mvd2lucG9zLmMKKysrIGIvd2luZG93cy93aW5wb3MuYwpAQCAtMTUwNiw2ICsxNTA2LDMzIEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgV0lOUE9TX0ZpbmREZXNrVG9wWFdpbmRvdworICoKKyAqIEZpbmQgdGhlIGFjdHVhbCBYIHdpbmRvdyB3aGljaCBuZWVkcyBiZSByZXN0YWNrZWQuCisgKiBVc2VkIGJ5IFdJTlBPU19TZXRYV2luZG93UG9zKCkuCisgKi8KK3N0YXRpYyBXaW5kb3cgV0lOUE9TX0ZpbmREZXNrVG9wWFdpbmRvdyggV05EICp3bmRQdHIgKQoreworICAgIGlmICghKHduZFB0ci0+ZmxhZ3MgJiBXSU5fTUFOQUdFRCkpCisgICAgICAgIHJldHVybiB3bmRQdHItPndpbmRvdzsKKyAgICBlbHNlCisgICAgeworICAgICAgICBXaW5kb3cgd2luZG93LCByb290LCBwYXJlbnQsICpjaGlsZHJlbjsKKyAgICAgICAgaW50IG5jaGlsZHJlbjsKKyAgICAgICAgd2luZG93ID0gd25kUHRyLT53aW5kb3c7CisgICAgICAgIGZvciAoOzspCisgICAgICAgIHsKKyAgICAgICAgICAgIFhRdWVyeVRyZWUoIGRpc3BsYXksIHdpbmRvdywgJnJvb3QsICZwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmY2hpbGRyZW4sICZuY2hpbGRyZW4gKTsKKyAgICAgICAgICAgIFhGcmVlKCBjaGlsZHJlbiApOworICAgICAgICAgICAgaWYgKHBhcmVudCA9PSByb290KQorICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3c7CisgICAgICAgICAgICB3aW5kb3cgPSBwYXJlbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdJTlBPU19TZXRYV2luZG93UG9zCiAgKgogICogU2V0V2luZG93UG9zKCkgZm9yIGFuIFggd2luZG93LiBVc2VkIGJ5IHRoZSByZWFsIFNldFdpbmRvd1BvcygpLgpAQCAtMTU2MCw4ICsxNTg3LDggQEAKICAgICAgICAgICAgIFdORCogICBpbnNlcnRQdHIgPSBXSU5fRmluZFduZFB0ciggd2lucG9zLT5od25kSW5zZXJ0QWZ0ZXIgKTsKIAkgICAgV2luZG93IHN0YWNrWzJdOwogCi0JICAgIHN0YWNrWzBdID0gaW5zZXJ0UHRyLT53aW5kb3c7Ci0JICAgIHN0YWNrWzFdID0gd25kUHRyLT53aW5kb3c7CisJICAgIHN0YWNrWzBdID0gV0lOUE9TX0ZpbmREZXNrVG9wWFdpbmRvdyggaW5zZXJ0UHRyICk7CisJICAgIHN0YWNrWzFdID0gV0lOUE9TX0ZpbmREZXNrVG9wWFdpbmRvdyggd25kUHRyICk7CiAKIAkgICAgLyogZm9yIHN0dXBpZCB3aW5kb3cgbWFuYWdlcnMgKGkuZS4gYWxsIG9mIHRoZW0pICovCiAKQEAgLTE2NDQsNyArMTY3MSw4IEBACiAJIGlmKCB3bmQtPnBhcmVudCAhPSB3bmRQdHItPnBhcmVudCApIHJldHVybiBGQUxTRTsKIAkgaWYoIHduZC0+bmV4dCA9PSB3bmRQdHIgKSBmbGFncyB8PSBTV1BfTk9aT1JERVI7CiAgICAgICAgfQotICAgIGVsc2UKKyAgICBlbHNlIGlmICghKHduZFB0ci0+d2luZG93KSkKKyAgICAgICAgIC8qIEZJWE1FOiB0aGUgZm9sbG93aW5nIG9wdGltaXphdGlvbiBpcyBubyBnb29kIGZvciAiWC1lZCIgd2luZG93cyAqLwogICAgICAgIGlmIChod25kSW5zZXJ0QWZ0ZXIgPT0gSFdORF9UT1ApCiAJICAgZmxhZ3MgfD0gKCB3bmRQdHItPnBhcmVudC0+Y2hpbGQgPT0gd25kUHRyKT8gU1dQX05PWk9SREVSOiAwOwogICAgICAgIGVsc2UgLyogSFdORF9CT1RUT00gKi8KZGlmZiAtLWdpdCBhL3dpbmUubWFuIGIvd2luZS5tYW4KaW5kZXggMDI0NzE2NC4uMzk1Yjg0MCAxMDA2NDQKLS0tIGEvd2luZS5tYW4KKysrIGIvd2luZS5tYW4KQEAgLTU2LDkgKzU2LDYgQEAKIC5CIGNvbmZpZ3VyZS4KIC5TSCBPUFRJT05TCiAuVFAKLS5JIC1hbGxvd3JlYWRvbmx5Ci1SZWFkIG9ubHkgZmlsZXMgbWF5IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlCi0uVFAKIC5JIC1iYWNraW5nc3RvcmUKIFR1cm4gb24gYmFja2luZyBzdG9yZQogLlRQCkBAIC05OCw2ICs5NSwxMSBAQAogR0RJMzIsIExaMzIsIE1QUiwgTlRETEwsIE9MRTMyLCBTSEVMTDMyLCBVU0VSMzIsIFZFUiwgVkVSU0lPTiwgVzMyU1lTLCBXSU5NTSwKIFdJTlNQT09MLCBXU09DSzMyCiAuVFAKKy5JIC1mYWlscmVhZG9ubHkKK1JlYWQgb25seSBmaWxlcyBtYXkgbm90IGJlIG9wZW5lZCBpbiB3cml0ZSBtb2RlICh0aGUgZGVmYXVsdCBpcyB0bworYWxsb3cgb3BlbmluZyByZWFkLW9ubHkgZmlsZXMgZm9yIHdyaXRpbmcsIGJlY2F1c2UgbW9zdCBXaW5kb3dzCitwcm9ncmFtcyBhbHdheXMgcmVxdWVzdCByZWFkLXdyaXRlIGFjY2VzcywgZXZlbiBvbiBDRC1ST00gZHJpdmVzLi4uKS4KKy5UUAogLkkgLWZpeGVkbWFwCiBVc2UgYSAic3RhbmRhcmQiIGNvbG9yIG1hcC4KIC5UUAo=