ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMjNiZGVkNDEuLjkwZmYwOWQgMTAwNjQ0Ci0tLSBhL0FOTk9VTkNFCisrKyBiL0FOTk9VTkNFCkBAIC0xLDE1ICsxLDE0IEBACi1UaGlzIGlzIHJlbGVhc2UgOTYwNDIxIG9mIFdpbmUgdGhlIE1TIFdpbmRvd3MgZW11bGF0b3IuICBUaGlzIGlzIHN0aWxsIGEKK1RoaXMgaXMgcmVsZWFzZSA5NjA0Mjggb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQogZGV2ZWxvcGVyJ3Mgb25seSByZWxlYXNlLiAgVGhlcmUgYXJlIG1hbnkgYnVncyBhbmQgbWFueSB1bmltcGxlbWVudGVkIEFQSQogZmVhdHVyZXMuICBNb3N0IGFwcGxpY2F0aW9ucyBzdGlsbCBkbyBub3Qgd29yay4KIAogUGF0Y2hlcyBzaG91bGQgYmUgc3VibWl0dGVkIHRvICJqdWxsaWFyZEBscmMuZXBmbC5jaCIuICBQbGVhc2UgZG9uJ3QKIGZvcmdldCB0byBpbmNsdWRlIGEgQ2hhbmdlTG9nIGVudHJ5LgogCi1XSEFUJ1MgTkVXIHdpdGggV2luZS05NjA0MjE6IChzZWUgQ2hhbmdlTG9nIGZvciBkZXRhaWxzKQotCS0gUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgVzMyU1lTLkRMTC4KLQktIEJ1aWx0LWluIENPTU1ETEcgaW1wcm92ZW1lbnRzLgotCS0gTmV3IGZvcm1hdCBhbmQgbG9jYXRpb24gZm9yIHJlZ2lzdHJ5IGZpbGVzLgotCS0gV2luZG93IHJlZnJlc2ggb3B0aW1pemVkLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTYwNDI4OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIFByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIFZFUi5ETEwuCisJLSBTdXVwb3J0IGZvciBLb3JlYW4gW0tvXSBsYW5ndWFnZS4KKwktIE1vcmUgV2luMzIgZnVuY3Rpb25zLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE4LDEwICsxNywxMCBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA0MjEudGFyLmd6Ci0gICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNDIxLnRhci5negotICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNDIxLnRhci5negotICAgIGFyaXMuY29tOi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDQyMS50YXIuZ3oKKyAgICBzdW5zaXRlLnVuYy5lZHU6L3B1Yi9MaW51eC9BTFBIQS93aW5lL2RldmVsb3BtZW50L1dpbmUtOTYwNDI4LnRhci5negorICAgIHRzeC0xMS5taXQuZWR1Oi9wdWIvbGludXgvQUxQSEEvV2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDQyOC50YXIuZ3oKKyAgICBmdHAuaW5mb21hZ2ljLmNvbTovcHViL21pcnJvcnMvbGludXgvd2luZS9kZXZlbG9wbWVudC9XaW5lLTk2MDQyOC50YXIuZ3oKKyAgICBhcmlzLmNvbTovcHViL2xpbnV4L0FMUEhBL1dpbmUvZGV2ZWxvcG1lbnQvV2luZS05NjA0MjgudGFyLmd6CiAKIEl0IHNob3VsZCBhbHNvIGJlIGF2YWlsYWJsZSBmcm9tIGFueSBzaXRlIHRoYXQgbWlycm9ycyB0c3gtMTEgb3Igc3Vuc2l0ZS4KIApkaWZmIC0tZ2l0IGEvQ2hhbmdlTG9nIGIvQ2hhbmdlTG9nCmluZGV4IGY4ZDRjM2QuLmRlMTc0NjYgMTAwNjQ0Ci0tLSBhL0NoYW5nZUxvZworKysgYi9DaGFuZ2VMb2cKQEAgLTEsNCArMSwxMDUgQEAKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1N1biBBcHIgMjggMTQ6MzI6NDMgMTk5NiAgQWxleGFuZHJlIEp1bGxpYXJkICA8anVsbGlhcmRAbHJjLmVwZmwuY2g+CisKKwkqIFtNYWtlZmlsZS5pbl0KKwlTdWJkaXIgbWVtb3J5IGlzIG5vdyBhbHNvIGNvbXBpbGVkIGZvciBXaW5lbGliLCBpbiBvcmRlciB0byBnZXQKKwl0aGUgV2luMzIgaGVhcCBmdW5jdGlvbnMuCisKKwkqIFtpZjE2MzIvTWFrZWZpbGUuaW5dCisJUmVuYW1lZCB3aW5wcm9jcyBhbmQgd2lucHJvY3MzMiB0byB3cHJvY3MgYW5kIHdwcm9jczMyIHRvIGF2b2lkCisJRExMIG5hbWVzID4gOCBjaGFyYWN0ZXJzLgorCisJKiBbbG9hZGVyL2J1aWx0aW4uY10gKE5ldyBmaWxlKQorCUdyb3VwZWQgYWxsIGJ1aWx0LWluIERMTHMgY29kZSBpbiBhIHNpbmdsZSBmaWxlLgorCisJKiBbbWVtb3J5L2dsb2JhbC5jXQorCVVzZSB0aGUgV2luMzIgaGVhcCBjb2RlIGluc3RlYWQgb2YgbWFsbG9jKCkgdG8gYWxsb2NhdGUgbGluZWFyCisJbWVtb3J5LiBUaGlzIHdpbGwgaGVscCB0ZXN0IHRoZSBoZWFwIGNvZGUuCisKKwkqIFttZW1vcnkvbG9jYWwuY10KKwlGaXhlZCBGcmVlU2VsZWN0b3IoKSB0byBjbGVhciBEUyBhbmQgRVMgY29ycmVjdGx5IGZvciBodWdlIGJsb2Nrcy4KKworCSogW3Rvb2xzL2J1aWxkLmNdIFtpZjE2MzIvcmVsYXkuY10KKwlSZW1vdmVkICdpZCcgZGlyZWN0aXZlIGluIHNwZWMgZmlsZXMuIEZvciByZWxheSBkZWJ1Z2dpbmcsIHRoZSBETEwKKwllbnRyeSBwb2ludCBpcyBub3cgY29tcHV0ZWQgZnJvbSB0aGUgQ1M6SVAgZW50cnkgcG9pbnQgYWRkcmVzcy4KKwlBZGRlZCAnaGVhcCcgZGlyZWN0aXZlIHRvIHNwZWNpZml5IGEgbG9jYWwgaGVhcCBmb3IgdGhlIERMTC4gVVNFUgorCWFuZCBHREkgaGVhcCBhcmUgbm93IGNyZWF0ZWQgdGhpcyB3YXkuCisKKwkqIFt3aW5kb3dzL2NsYXNzLmNdIFtpbmNsdWRlL2NsYXNzLmhdCisJQ2hhbmdlZCB0aGUgY2xhc3Mgc3RydWN0dXJlIHRvIHVzZSBwb2ludGVycyBpbnN0ZWFkIG9mIGhhbmRsZXMuCisJQ2hhbmdlZCBHZXQvU2V0Q2xhc3NXb3JkL0xvbmcgdG8gdXNlIGEgc3dpdGNoIHN0YXRlbWVudDsgdGhpcworCWFsbG93cyBjaGFuZ2luZyB0aGUgbGF5b3V0IG9mIHRoZSBDTEFTUyBzdHJ1Y3R1cmUuCisKKwkqIFt3aW5kb3dzL3dpbi5jXSBbaW5jbHVkZS93aW4uaF0KKwlVc2UgYSBDTEFTUyAqIGluc3RlYWQgb2YgYSBoYW5kbGUgZm9yIHRoZSB3aW5kb3cgY2xhc3MuCisKK1NhdCBBcHIgMjcgMTg6MTA6MTEgTWFydGluIHZvbiBMb2V3aXMgPGxvZXdpc0BpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT4KKworCSogW2lmMTYzMi9rZXJuZWwzMi5zcGVjXSBbbWVtb3J5L2dsb2JhbC5jXQorCSAgW3dpbjMyL21lbW9yeS5jXSBbd2luMzIvcHJvY2Vzcy5jXQorCUdldFByb2Nlc3NBZmZpbml0eU1hc2ssR2xvYmFsTG9jayxJc0JhZFJlYWRQdHIsSXNCYWRXcml0ZVB0ciwKKwlMb2NhbExvY2ssU2V0VGhyZWFkQWZmaW5pdHlNYXNrOiBuZXcgcmVsYXlzLgorCisJKiBbd2luMzIvY3Vyc29yaWNvbjMyLmNdCisJUmV0dXJuIHNhbWUgaGFuZGxlIGlmIGEgY3Vyc29yIGlzIGxvYWRlZCBtdWx0aXBsZSB0aW1lcy4KKworU2F0IEFwciAyNyAxNToxMzozNyAxOTk2ICBCYW5nIEp1biBZb3VuZyA8YmFuZ2p5QG5vd251cmkubm93Y29tLmNvLmtyPgorCisJKiBbcmVzb3VyY2VzL3N5c3Jlc19Lby5yY10KKyAgICAgICAgQWRkZWQgc3VwcG9ydCBmb3IgS29yZWFuIFtLb10gbGFuZ3VhZ2UuCisKK0ZyaSBBcHIgMjYgMDA6NDk6MDUgMTk5NiAgSHV3IEQuIE0uIERhdmllcyA8aC5kYXZpZXMxQHBoeXNpY3Mub3hmb3JkLmFjLnVrPgorCisJKiBbb2JqZWN0cy9kYy5jXSBbb2JqZWN0cy9mb250LmNdCisJRml4ZWQgcHJvYmxlbSB3aXRoIFNhdmVEQygpL1Jlc3RvcmVEQygpIGFuZCBmb250IGNhY2hlICd1c2VkJyBjb3VudC4KKworCSogW29iamVjdHMvbWV0YWZpbGUuY10gW29iamVjdHMvZGN2YWx1ZXMuY10KKwlGaXhlZCBicm9rZW4gU2V0VGV4dEFsaWduKCkgb24gbWV0YWZpbGVzLgorCisJKiBbb2JqZWN0cy9tZXRhZmlsZS5jXQorCURlbGV0ZSBvYmplY3RzIGluIGhhbmRsZSB0YWJsZSBhdCBlbmQgb2YgUGxheU1ldGFGaWxlKCkuCisKK1dlZCBBcHIgMjQgMTk6MjE6MDEgIE1hcmN1cyBNZWlzc25lciA8bXNtZWlzc25AY2lwLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbaWYxNjMyL3Zlci5zcGVjXSBbbWlzYy92ZXIuY10gW2luY2x1ZGUvdmVyLmhdIChOZXcgZmlsZXMpCisJVkVSLkRMTCAocGFydGlhbGx5KSBpbXBsZW1lbnRlZCAoVmVyRmluZEZpbGUsVmVySW5zdGFsbEZpbGUpCisJW0lmIGl0IGRvZXNuJ3Qgd29yayBmb3IgeW91LCB1c2UgLWRsbCAtdmVyIGFuZCByZXBvcnQgaXQgdG8gbWVdCisKKwkqIFtpZjE2MzIvdXNlcjMyLnNwZWNdIFtpZjE2MzIva2VybmVsMzIuc3BlY10gW2lmMTYzMi9zaGVsbC5zcGVjXQorCSAgW2lmMTYzMi9zaGVsbDMyLnNwZWNdIFttaXNjL29sZTJubHMuY10gW3dpbmRvd3MvbWVzc2FnZS5jXQorCSAgW3dpbmRvd3MvZ3JhcGhpY3MuY10KKwlTaW1wbGUgd2luMzIgZnVuY3Rpb25zLCB3aGVyZSB3ZSBjYW4ganVzdCB1c2UgdGhlIHdpbjE2IGNvdW50ZXJwYXJ0LgorCU1pc2MuIHN0dWJzLiAKKworCSogW21pc2MvbHN0ci5jXQorCVNvbWVvbmUgcmVwb3J0ZWQgYSBfbHN0cmxlbihOVUxMKS4gTlVMTCBpcyBhIHZhbGlkIGFyZ3VtZW50LiBGaXhlZC4KKworCSogW21pc2MvcmVnaXN0cnkuY10KKwlTb21lIGFsbG9jbGVucyB3ZXJlIG9mZiBieSAxLCBvbmUgZG91YmxlIGZjbG9zZSgpIGZpeGVkLgorCVJlcXVlc3RpbmcgdmFsdWUgMCBvZiBhIGtleSB3aXRoIG5vIHZhbHVlcyByZXR1cm5zIGFuIGVycm9yIAorCShzaG91bGQgd2UgYWx3YXlzIHJldHVybiBhIG1hZGUgdXAgdmFsdWUgTlVMTD8gd2hhdCBkb2VzIHdpbjMuMT8pCisKK1R1ZSBBcHIgMjMgMTc6MDA6MDAgMTk5NiBBbGV4IEtvcm9ia2EgPGFsZXhAcGhtMzAucGhhcm0uc3VueXNiLmVkdT4KKworCSogW21pc2Mvc2hlbGwuY10KKwlJbXBsZW1lbnRlZCBGaW5kRW52aXJvbm1lbnRTdHJpbmcoKSwgRG9FbnZpcm9ubWVudFN1YnN0KCksCisJRXh0cmFjdEljb24oKSwgSW50ZXJuYWxFeHRyYWN0SWNvbigpIGFuZCBFeHRyYWN0QXNzb2NpYXRlZEljb24oKS4KKworCSogW21pc2MvdXNlci5jXQorCURvIGV4dGVuc2l2ZSBjbGVhbnVwIG9uIGFwcGxpY2F0aW9uIGV4aXQuCisKKwkqIFt3aW5kb3dzL2hvb2suY10gW3dpbmRvd3Mvd2luLmNdIFt3aW5kb3dzL2NsYXNzLmNdCisJQWRkZWQgbWlzY2VsbGFuZW91cyBjbGVhbnVwIHJvdXRpbmVzLgorCisJKiBbY29udHJvbHMvbWVudS5jXQorCU1vcmUgZWZmaWNpZW50IHBvcHVwIG1lbnUgd2luZG93IGhhbmRsaW5nLgorCitNb24gQXByIDIyIDIxOjM1OjIyIDE5OTYgIEFsYnJlY2h0IEtsZWluZSAgPGtsZWluZUBhay5zYXguZGU+CisKKwkqIFtpbmNsdWRlL3dpbmRvd3MuaF1bb2JqZWN0cy9vZW1iaXRtYXAuY11baW5jbHVkZS9iaXRtYXBzL29ibV90cnR5cGVdCisJQWRkZWQgIlRULWJpdG1hcCIgZm9yIGxhdGVyIHVzYWdlIGluIGEgQ2hvb3NlRm9udCgpIG93bmVyZHJhdyBjb21ib2JveC4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogU2F0IEFwciAyMCAyMzoyMzoxNiAxOTk2ICBSb2JlcnQgUG91bGlvdCA8a3J5bm9zQHFiYy5jbGljLm5ldD4KIAogCSogW3Jlc291cmNlcy9zeXNyZXNfRnIucmNdIFtyZXNvdXJjZXMvVE9ET10KZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggMTJiZDFiNy4uYzMzMzg2MSAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTUzLDYgKzUzLDcgQEAKIAlmaWxlcyBcCiAJaXBjIFwKIAlsb2FkZXIgXAorCW1lbW9yeSBcCiAJbWlzYyBcCiAJbXVsdGltZWRpYSBcCiAJb2JqZWN0cyBcCkBAIC02NSw3ICs2Niw2IEBACiAJZGVidWdnZXIgXAogCWRlYnVnZ2VyL3JlYWRsaW5lIFwKIAlpZjE2MzIgXAotCW1lbW9yeSBcCiAJbWlzY2VtdQogCiBMSUJTVUJESVJTID0gbGlicmFyeQpAQCAtNzksNiArNzksNyBAQAogCWZpbGVzL2ZpbGVzLm8gXAogCWlwYy9pcGMubyBcCiAJbG9hZGVyL2xvYWRlci5vIFwKKwltZW1vcnkvbWVtb3J5Lm8gXAogCW1pc2MvbWlzYy5vIFwKIAltdWx0aW1lZGlhL211bHRpbWVkaWEubyBcCiAJb2JqZWN0cy9vYmplY3RzLm8gXApAQCAtOTAsNyArOTEsNiBAQAogCWRlYnVnZ2VyL2RlYnVnZ2VyLm8gXAogCWRlYnVnZ2VyL3JlYWRsaW5lL3JlYWRsaW5lLm8gXAogCWlmMTYzMi9pZjE2MzIubyBcCi0JbWVtb3J5L21lbW9yeS5vIFwKIAltaXNjZW11L21pc2NlbXUubwogCiBMSUJPQkpTID0gbGlicmFyeS9saWJyYXJ5Lm8KZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA3OGU5OTFkLi5lZWNiNTc1IDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgorI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJ3aW4uaCIKICNpbmNsdWRlICJtZW51LmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCkBAIC02NSw2ICs2NiwxMiBAQAogc3RhdGljIEhCSVRNQVAgaFN0ZENoZWNrID0gMDsKIHN0YXRpYyBIQklUTUFQIGhTdGRNbkFycm93ID0gMDsKIAorLyogd2UgX2Nhbl8gdXNlIGdsb2JhbCBwb3B1cCB3aW5kb3cgYmVjYXVzZSB0aGVyZSdzIG5vIHdheSAyIG1lbnVlcyBjYW4KKyAqIGJlIHRyYWNrZWQgYXQgdGhlIHNhbWUgdGltZS4KKyAqLyAKKworc3RhdGljIFdORCogcFRvcFBXbmQgICA9IDA7CitzdGF0aWMgVUlOVCB1U3ViUFduZExldmVsID0gMDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTUVOVV9Jbml0CkBAIC02NzgsNiArNjg1LDIzIEBACiAgICAgcmV0dXJuIGxwcG9wLT5IZWlnaHQ7CiB9IAogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgTUVOVV9Td2l0Y2hUUFduZFRvCisgKi8KK0JPT0wgTUVOVV9Td2l0Y2hUUFduZFRvKCBIVEFTSyBoVGFzaykKK3sKKyAgLyogVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgd2hlbiBwb3B1cCBpcyBoaWRkZW4gKi8KKworICBUREIqIHRhc2sgPSAoVERCKilHbG9iYWxMb2NrKGhUYXNrKTsKKworICBpZiggIXRhc2sgKSByZXR1cm4gMDsKKworICAvKiBpZiB0aGlzIHRhc2sgZ290IGFzIGZhciBhcyBtZW51IHRyYWNraW5nIGl0IG11c3QgaGF2ZSBhIHF1ZXVlICovCisKKyAgcFRvcFBXbmQtPmhJbnN0YW5jZSA9IHRhc2stPmhJbnN0YW5jZTsKKyAgcFRvcFBXbmQtPmhtZW1UYXNrUSA9IHRhc2stPmhRdWV1ZTsKKyAgcmV0dXJuIDE7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfU2hvd1BvcHVwCkBAIC02ODYsNyArNzEwLDkgQEAKICAqLwogc3RhdGljIEJPT0wgTUVOVV9TaG93UG9wdXAoSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51LCBVSU5UIGlkLCBpbnQgeCwgaW50IHkpCiB7Ci0gICAgUE9QVVBNRU5VICptZW51OworICAgIFBPUFVQTUVOVSAJKm1lbnU7CisgICAgV05EIAkqd25kUHRyID0gTlVMTDsKKyAgICBCT09MCSBza2lwX2luaXQgPSAwOwogCiAgICAgaWYgKCEobWVudSA9IChQT1BVUE1FTlUgKikgVVNFUl9IRUFQX0xJTl9BRERSKCBobWVudSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmIChtZW51LT5Gb2N1c2VkSXRlbSAhPSBOT19TRUxFQ1RFRF9JVEVNKQpAQCAtNjk4LDIxICs3MjQsNDcgQEAKICAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9JTklUTUVOVVBPUFVQLCAoV1BBUkFNKWhtZW51LAogCQkgTUFLRUxPTkcoIGlkLCAobWVudS0+d0ZsYWdzICYgTUZfU1lTTUVOVSkgPyAxIDogMCApKTsKICAgICBNRU5VX1BvcHVwTWVudUNhbGNTaXplKCBtZW51LCBod25kT3duZXIgKTsKLSAgICBpZiAoIW1lbnUtPmhXbmQpCisKKyAgICB3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZE93bmVyICk7CisgICAgaWYgKCF3bmRQdHIpIHJldHVybiBGQUxTRTsKKworICAgIGlmICghcFRvcFBXbmQpCiAgICAgewotCVdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmRPd25lciApOwotCWlmICghd25kUHRyKSByZXR1cm4gRkFMU0U7Ci0JbWVudS0+aFduZCA9IENyZWF0ZVdpbmRvdyggUE9QVVBNRU5VX0NMQVNTX0FUT00sIChTRUdQVFIpMCwKLQkJCQkgICBXU19QT1BVUCB8IFdTX0JPUkRFUiwgeCwgeSwgCi0JCQkJICAgbWVudS0+V2lkdGggKyAyKlNZU01FVFJJQ1NfQ1hCT1JERVIsCi0JCQkJICAgbWVudS0+SGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSLAotCQkJCSAgIDAsIDAsIHduZFB0ci0+aEluc3RhbmNlLCAoU0VHUFRSKWhtZW51ICk7Ci0JaWYgKCFtZW51LT5oV25kKSByZXR1cm4gRkFMU0U7CisJcFRvcFBXbmQgPSBXSU5fRmluZFduZFB0cihDcmVhdGVXaW5kb3coIFBPUFVQTUVOVV9DTEFTU19BVE9NLCAoU0VHUFRSKTAsCisJCQkJICAgCQlXU19QT1BVUCB8IFdTX0JPUkRFUiwgeCwgeSwgCisJCQkJICAgCQltZW51LT5XaWR0aCArIDIqU1lTTUVUUklDU19DWEJPUkRFUiwKKwkJCQkgICAJCW1lbnUtPkhlaWdodCArIDIqU1lTTUVUUklDU19DWUJPUkRFUiwKKwkJCQkgICAJCTAsIDAsIHduZFB0ci0+aEluc3RhbmNlLCAoU0VHUFRSKWhtZW51ICkpOworCWlmICghcFRvcFBXbmQpIHJldHVybiBGQUxTRTsKKwlza2lwX2luaXQgPSBUUlVFOwogICAgIH0KLSAgICBlbHNlIFNldFdpbmRvd1BvcyggbWVudS0+aFduZCwgMCwgeCwgeSwKLQkJICAgICAgIG1lbnUtPldpZHRoICsgMipTWVNNRVRSSUNTX0NYQk9SREVSLAotCQkgICAgICAgbWVudS0+SGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSLAotCQkgICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgKTsKKworICAgIGlmKCB1U3ViUFduZExldmVsICkKKyAgICB7CisJLyogY3JlYXRlIG5ldyB3aW5kb3cgZm9yIHRoZSBzdWJtZW51ICovCisJSFdORCAgaFduZCA9IENyZWF0ZVdpbmRvdyggUE9QVVBNRU5VX0NMQVNTX0FUT00sIChTRUdQVFIpMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfUE9QVVAgfCBXU19CT1JERVIsIHgsIHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUtPldpZHRoICsgMipTWVNNRVRSSUNTX0NYQk9SREVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW51LT5IZWlnaHQgKyAyKlNZU01FVFJJQ1NfQ1lCT1JERVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnUtPmhXbmQsIDAsIHduZFB0ci0+aEluc3RhbmNlLCAoU0VHUFRSKWhtZW51ICk7CisJaWYoICFoV25kICkgcmV0dXJuIEZBTFNFOworCW1lbnUtPmhXbmQgPSBoV25kOworICAgIH0KKyAgICBlbHNlIAorICAgIHsKKwlpZiggIXNraXBfaW5pdCApCisJICB7CisgICAgICAgICAgICBNRU5VX1N3aXRjaFRQV25kVG8oR2V0Q3VycmVudFRhc2soKSk7CisJICAgIFNlbmRNZXNzYWdlKCBwVG9wUFduZC0+aHduZFNlbGYsIFdNX1VTRVIsIChXUEFSQU0paG1lbnUsIDBMKTsKKwkgIH0KKwltZW51LT5oV25kID0gcFRvcFBXbmQtPmh3bmRTZWxmOworICAgIH0KKworICAgIHVTdWJQV25kTGV2ZWwrKzsKKworICAgIFNldFdpbmRvd1BvcyhtZW51LT5oV25kLCAwLCB4LCB5LCBtZW51LT5XaWR0aCArIDIqU1lTTUVUUklDU19DWEJPUkRFUiwgCisJCQkJICAgICAgbWVudS0+SGVpZ2h0ICsgMipTWVNNRVRSSUNTX0NZQk9SREVSLAorCQkgIAkJICAgICAgU1dQX05PQUNUSVZBVEUgfCBTV1BfTk9aT1JERVIgKTsKIAogICAgICAgLyogRGlzcGxheSB0aGUgd2luZG93ICovCiAKQEAgLTEwOTUsNyArMTE0NywxNiBAQAogICAgIH0KICAgICBzdWJtZW51ID0gKFBPUFVQTUVOVSAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhzdWJtZW51ICk7CiAgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhzdWJtZW51ICk7Ci0gICAgaWYgKHN1Ym1lbnUtPmhXbmQpIFNob3dXaW5kb3coIHN1Ym1lbnUtPmhXbmQsIFNXX0hJREUgKTsKKyAgICBpZiAoc3VibWVudS0+aFduZCA9PSBwVG9wUFduZC0+aHduZFNlbGYgKSAKKyAgICAgIHsKKwlTaG93V2luZG93KCBzdWJtZW51LT5oV25kLCBTV19ISURFICk7CisJdVN1YlBXbmRMZXZlbCA9IDA7CisgICAgICB9CisgICAgZWxzZQorICAgICAgeworCURlc3Ryb3lXaW5kb3coIHN1Ym1lbnUtPmhXbmQgKTsKKwlzdWJtZW51LT5oV25kID0gMDsKKyAgICAgIH0KICAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaHN1Ym1lbnUsIE5PX1NFTEVDVEVEX0lURU0gKTsKIH0KIApAQCAtMTU5Niw3ICsxNjU3LDExIEBACiAgICAgVVNFUl9IRUFQX0ZSRUUoIGhNc2cgKTsKICAgICBSZWxlYXNlQ2FwdHVyZSgpOwogICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZCwgaG1lbnUgKTsKLSAgICBpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIFNob3dXaW5kb3coIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKKyAgICBpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApIAorICAgICAgIHsKKyAgICAgICAgIFNob3dXaW5kb3coIG1lbnUtPmhXbmQsIFNXX0hJREUgKTsKKwkgdVN1YlBXbmRMZXZlbCA9IDA7CisgICAgICAgfQogICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnUsIE5PX1NFTEVDVEVEX0lURU0gKTsKICAgICBTZW5kTWVzc2FnZSggaHduZCwgV01fTUVOVVNFTEVDVCwgMCwgTUFLRUxPTkcoIDB4ZmZmZiwgMCApICk7CiAgICAgZkVuZE1lbnVDYWxsZWQgPSBGQUxTRTsKQEAgLTE3NDMsNiArMTgwOCwyNSBAQAogCSAgICByZXR1cm4gMDsKIAl9CiAKKyAgICBjYXNlIFdNX0RFU1RST1k6CisJICAgIC8qIHplcm8gb3V0IGdsb2JhbCBwb2ludGVyIGluIGNhc2Ugc3lzdGVtIHBvcHVwCisJICAgICAqIHdhcyBkZXN0cm95ZWQgYnkgQXBwRXhpdCAKKwkgICAgICovCisKKwkgICAgaWYoIGh3bmQgPT0gcFRvcFBXbmQtPmh3bmRTZWxmICkKKwkJcFRvcFBXbmQgPSAwOworCSAgICBlbHNlCisJCXVTdWJQV25kTGV2ZWwtLTsKKwkgICAgYnJlYWs7CisKKyAgICBjYXNlIFdNX1VTRVI6CisJaWYoIHdQYXJhbSApCisjaWZkZWYgV0lORUxJQjMyCisgICAgICAgICAgICBTZXRXaW5kb3dMb25nKCBod25kLCAwLCAoSE1FTlUpd1BhcmFtICk7CisjZWxzZQorICAgICAgICAgICAgU2V0V2luZG93V29yZCggaHduZCwgMCwgKEhNRU5VKXdQYXJhbSApOworI2VuZGlmCisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAJcmV0dXJuIERlZldpbmRvd1Byb2MoaHduZCwgbWVzc2FnZSwgd1BhcmFtLCBsUGFyYW0pOwogICAgIH0KQEAgLTIxMzksNyArMjIyMyw3IEBACiAgICAgbHBwb3AgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSk7CiAgICAgaWYgKCFscHBvcCB8fCAobHBwb3AtPndNYWdpYyAhPSBNRU5VX01BR0lDKSkgcmV0dXJuIEZBTFNFOwogICAgIGxwcG9wLT53TWFnaWMgPSAwOyAgLyogTWFyayBpdCBhcyBkZXN0cm95ZWQgKi8KLSAgICBpZiAoKGxwcG9wLT53RmxhZ3MgJiBNRl9QT1BVUCkgJiYgbHBwb3AtPmhXbmQpCisgICAgaWYgKChscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICYmIGxwcG9wLT5oV25kICYmIGxwcG9wLT5oV25kICE9IHBUb3BQV25kLT5od25kU2VsZiApCiAgICAgICAgIERlc3Ryb3lXaW5kb3coIGxwcG9wLT5oV25kICk7CiAKICAgICBpZiAobHBwb3AtPmhJdGVtcykKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2RiZy55IGIvZGVidWdnZXIvZGJnLnkKaW5kZXggZTgwOWEzNy4uZTYwNjRjYSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvZGJnLnkKKysrIGIvZGVidWdnZXIvZGJnLnkKQEAgLTEyOSw3ICsxMjksNyBAQAogCiBpbmZvX2NvbW1hbmQ6CiAgICAgICB0SU5GTyB0QlJFQUsgdEVPTCAgICAgICAgIHsgREVCVUdfSW5mb0JyZWFrcG9pbnRzKCk7IH0KLSAgICB8IHRJTkZPIHRDTEFTUyBleHByIHRFT0wgICAgeyBDTEFTU19EdW1wQ2xhc3MoICQzICk7IH0KKyAgICB8IHRJTkZPIHRDTEFTUyBleHByIHRFT0wgICAgeyBDTEFTU19EdW1wQ2xhc3MoIChDTEFTUyAqKSQzICk7IH0KICAgICB8IHRJTkZPIHRNT0RVTEUgZXhwciB0RU9MICAgeyBNT0RVTEVfRHVtcE1vZHVsZSggJDMgKTsgfQogICAgIHwgdElORk8gdFFVRVVFIGV4cHIgdEVPTCAgICB7IFFVRVVFX0R1bXBRdWV1ZSggJDMgKTsgfQogICAgIHwgdElORk8gdFJFR1MgdEVPTCAgICAgICAgICB7IERFQlVHX0luZm9SZWdpc3RlcnMoKTsgfQpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvc3RhY2suYyBiL2RlYnVnZ2VyL3N0YWNrLmMKaW5kZXggZGU1NDE2MC4uYmJmOTAzMyAxMDA2NDQKLS0tIGEvZGVidWdnZXIvc3RhY2suYworKysgYi9kZWJ1Z2dlci9zdGFjay5jCkBAIC03MSw3ICs3MSw3IEBACiAgICAgICAgIERFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIDMyICk7CiAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogICAgICAgICBhZGRyLm9mZiA9IEVCUF9yZWcoREVCVUdfY29udGV4dCk7Ci0gICAgICAgIGZvciAoOzspCisgICAgICAgIHdoaWxlIChhZGRyLm9mZikKICAgICAgICAgewogICAgICAgICAgICAgRlJBTUUzMiAqZnJhbWUgPSAoRlJBTUUzMiAqKWFkZHIub2ZmOwogICAgICAgICAgICAgaWYgKCFEQkdfQ0hFQ0tfUkVBRF9QVFIoICZhZGRyLCBzaXplb2YoRlJBTUUzMikgKSkgcmV0dXJuOwpkaWZmIC0tZ2l0IGEvaWYxNjMyL01ha2VmaWxlLmluIGIvaWYxNjMyL01ha2VmaWxlLmluCmluZGV4IDI4OGU4NGEuLjY4NDk0OGEgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9NYWtlZmlsZS5pbgorKysgYi9pZjE2MzIvTWFrZWZpbGUuaW4KQEAgLTM0LDEyICszNCwxMyBAQAogCXRvb2xoZWxwLnNwZWMgXAogCXVzZXIuc3BlYyBcCiAJdXNlcjMyLnNwZWMgXAorCXZlci5zcGVjIFwKIAl3MzJzeXMuc3BlYyBcCiAJd2luODdlbS5zcGVjIFwKLQl3aW5wcm9jcy5zcGVjIFwKLQl3aW5wcm9jczMyLnNwZWMgXAogCXdpbnNvY2suc3BlYyBcCi0Jd2luc3Bvb2wuc3BlYworCXdpbnNwb29sLnNwZWMgXAorCXdwcm9jcy5zcGVjIFwKKwl3cHJvY3MzMi5zcGVjCiAKIFNQRUNfRklMRVMgPSAkKERMTFM6LnNwZWM9LlMpCiAKZGlmZiAtLWdpdCBhL2lmMTYzMi9jb21tZGxnLnNwZWMgYi9pZjE2MzIvY29tbWRsZy5zcGVjCmluZGV4IDBmNWRjNzUuLjdmODVjMWQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9jb21tZGxnLnNwZWMKKysrIGIvaWYxNjMyL2NvbW1kbGcuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJY29tbWRsZwogdHlwZQl3aW4xNgotaWQJMTQKIAogMSAgIHBhc2NhbDE2IEdldE9wZW5GaWxlTmFtZShwdHIpIEdldE9wZW5GaWxlTmFtZQogMiAgIHBhc2NhbDE2IEdldFNhdmVGaWxlTmFtZShwdHIpIEdldFNhdmVGaWxlTmFtZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2NvbXBvYmouc3BlYyBiL2lmMTYzMi9jb21wb2JqLnNwZWMKaW5kZXggMzk4YzY4Yy4uZTMyNWMyNCAxMDA2NDQKLS0tIGEvaWYxNjMyL2NvbXBvYmouc3BlYworKysgYi9pZjE2MzIvY29tcG9iai5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQljb21wb2JqCiB0eXBlCXdpbjE2Ci1pZAkyMgogCiAxIHBhc2NhbCBDb0J1aWxkVmVyc2lvbigpIENvQnVpbGRWZXJzaW9uCiAyIHBhc2NhbCBDb0luaXRpYWxpemUobG9uZykgQ29Jbml0aWFsaXplCmRpZmYgLS1naXQgYS9pZjE2MzIvZGRlbWwuc3BlYyBiL2lmMTYzMi9kZGVtbC5zcGVjCmluZGV4IDBhMDM3NjEuLjEyYzE0MjAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9kZGVtbC5zcGVjCisrKyBiL2lmMTYzMi9kZGVtbC5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlkZGVtbAogdHlwZQl3aW4xNgotaWQJMjUKIAogMiBzdHViIERkZUluaXRpYWxpemUgIyhwdHIgc2VncHRyIGxvbmcgbG9uZykgRGRlSW5pdGlhbGl6ZQogMyBzdHViIERkZVVuSW5pdGlhbGl6ZSAjKGxvbmcpIERkZVVuSW5pdGlhbGl6ZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IGNiZDc1ZDAuLjBlMjM5NDYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTEsNiArMSw2IEBACiBuYW1lCWdkaQogdHlwZQl3aW4xNgotaWQJMworaGVhcAk2NTQ4OCAgIyA2NTUzNiAtIDE2IChpbnN0YW5jZSBkYXRhKSAtIDMyIChzdG9jayBvYmplY3RzKQogCiAxICAgcGFzY2FsIFNldEJrQ29sb3Iod29yZCBsb25nKSBTZXRCa0NvbG9yCiAyICAgcGFzY2FsMTYgU2V0QmtNb2RlKHdvcmQgd29yZCkgU2V0QmtNb2RlCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggYzJjYWJlNi4uNjRlOWM1NCAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJa2VybmVsCiB0eXBlCXdpbjE2Ci1pZAkxCiAKIDEgICBzdHViIEZhdGFsRXhpdAogMiAgIHN0dWIgRXhpdEtlcm5lbApkaWZmIC0tZ2l0IGEvaWYxNjMyL2tlcm5lbDMyLnNwZWMgYi9pZjE2MzIva2VybmVsMzIuc3BlYwppbmRleCBlNThlMGNmLi43N2MwOTVmIDEwMDY0NAotLS0gYS9pZjE2MzIva2VybmVsMzIuc3BlYworKysgYi9pZjE2MzIva2VybmVsMzIuc3BlYwpAQCAtMzEsNyArMzEsNyBAQAogMDAyNiBzdHViIENvbW1Db25maWdEaWFsb2dBCiAwMDI3IHN0dWIgQ29tbUNvbmZpZ0RpYWxvZ1cKIDAwMjggc3R1YiBDb21wYXJlRmlsZVRpbWUKLTAwMjkgc3R1YiBDb21wYXJlU3RyaW5nQQorMDAyOSBzdGRjYWxsIENvbXBhcmVTdHJpbmdBKGxvbmcgbG9uZyBwdHIgbG9uZyBwdHIgbG9uZykgQ29tcGFyZVN0cmluZ0EKIDAwMzAgc3R1YiBDb21wYXJlU3RyaW5nVwogMDAzMSBzdHViIENvbm5lY3ROYW1lZFBpcGUKIDAwMzIgc3R1YiBDb25zb2xlTWVudUNvbnRyb2wKQEAgLTIzMSw3ICsyMzEsNyBAQAogMDIyNiBzdHViIEdldExhcmdlc3RDb25zb2xlV2luZG93U2l6ZQogMDIyNyAgICBzdGRjYWxsIEdldExhc3RFcnJvcigpIEdldExhc3RFcnJvcgogMDIyOCAgICBzdGRjYWxsIEdldExvY2FsVGltZShwdHIpIEdldExvY2FsVGltZQotMDIyOSBzdHViIEdldExvY2FsZUluZm9BCiswMjI5IHN0ZGNhbGwgR2V0TG9jYWxlSW5mb0EobG9uZyBsb25nIHB0ciBsb25nKSBHZXRMb2NhbGVJbmZvQQogMDIzMCBzdHViIEdldExvY2FsZUluZm9XCiAwMjMxIHN0dWIgR2V0TG9naWNhbERyaXZlU3RyaW5nc0EKIDAyMzIgc3R1YiBHZXRMb2dpY2FsRHJpdmVTdHJpbmdzVwpAQCAtMjU3LDEwICsyNTcsMTAgQEAKIDAyNTIgc3R1YiBHZXRQcml2YXRlUHJvZmlsZUludFcKIDAyNTMgc3R1YiBHZXRQcml2YXRlUHJvZmlsZVNlY3Rpb25BCiAwMjU0IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTZWN0aW9uVwotMDI1NSBzdHViIEdldFByaXZhdGVQcm9maWxlU3RyaW5nQQorMDI1NSBzdGRjYWxsIEdldFByaXZhdGVQcm9maWxlU3RyaW5nQShwdHIgcHRyIHB0ciBwdHIgbG9uZyBwdHIpIEdldFByaXZhdGVQcm9maWxlU3RyaW5nCiAwMjU2IHN0dWIgR2V0UHJpdmF0ZVByb2ZpbGVTdHJpbmdXCiAwMjU3CXN0ZGNhbGwgR2V0UHJvY0FkZHJlc3MobG9uZyBsb25nKQlXSU4zMl9HZXRQcm9jQWRkcmVzcwotMDI1OCBzdHViIEdldFByb2Nlc3NBZmZpbml0eU1hc2sKKzAyNTggc3RkY2FsbCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKGxvbmcgcHRyIHB0cikJR2V0UHJvY2Vzc0FmZmluaXR5TWFzawogMDI1OSBzdGRjYWxsIEdldFByb2Nlc3NIZWFwKCkgR2V0UHJvY2Vzc0hlYXAKIDAyNjAgc3R1YiBHZXRQcm9jZXNzSGVhcHMKIDAyNjEgc3R1YiBHZXRQcm9jZXNzU2h1dGRvd25QYXJhbWV0ZXJzCkBAIC0yNzAsNyArMjcwLDcgQEAKIDAyNjUgc3R1YiBHZXRQcm9maWxlSW50VwogMDI2NiBzdHViIEdldFByb2ZpbGVTZWN0aW9uQQogMDI2NyBzdHViIEdldFByb2ZpbGVTZWN0aW9uVwotMDI2OCBzdHViIEdldFByb2ZpbGVTdHJpbmdBCiswMjY4IHN0ZGNhbGwgR2V0UHJvZmlsZVN0cmluZ0EocHRyIHB0ciBwdHIgcHRyIGxvbmcpIEdldFByb2ZpbGVTdHJpbmcKIDAyNjkgc3R1YiBHZXRQcm9maWxlU3RyaW5nVwogMDI3MCBzdHViIEdldFF1ZXVlZENvbXBsZXRpb25TdGF0dXMKIDAyNzEgc3R1YiBHZXRTaG9ydFBhdGhOYW1lQQpAQCAtMjgyLDcgKzI4Miw3IEBACiAwMjc3IHN0dWIgR2V0U3RyaW5nVHlwZUV4QQogMDI3OCBzdHViIEdldFN0cmluZ1R5cGVFeFcKIDAyNzkgc3R1YiBHZXRTdHJpbmdUeXBlVwotMDI4MCBzdHViIEdldFN5c3RlbURlZmF1bHRMQ0lECiswMjgwIHN0ZGNhbGwgR2V0U3lzdGVtRGVmYXVsdExDSUQoKSBHZXRTeXN0ZW1EZWZhdWx0TENJRAogMDI4MSBzdHViIEdldFN5c3RlbURlZmF1bHRMYW5nSUQKIDAyODIgc3R1YiBHZXRTeXN0ZW1EaXJlY3RvcnlBCiAwMjgzIHN0dWIgR2V0U3lzdGVtRGlyZWN0b3J5VwpAQCAtMzI5LDcgKzMyOSw3IEBACiAwMzIzIHN0dWIgR2xvYmFsR2V0QXRvbU5hbWVBCiAwMzI0IHN0dWIgR2xvYmFsR2V0QXRvbU5hbWVXCiAwMzI1IHN0dWIgR2xvYmFsSGFuZGxlCi0wMzI2IHN0dWIgR2xvYmFsTG9jaworMDMyNiBzdGRjYWxsIEdsb2JhbExvY2sobG9uZykJR2xvYmFsTG9jazMyCiAwMzI3IHN0dWIgR2xvYmFsTWVtb3J5U3RhdHVzCiAwMzI4IHN0dWIgR2xvYmFsUmVBbGxvYwogMDMyOSBzdHViIEdsb2JhbFNpemUKQEAgLTM1NywxMCArMzU3LDEwIEBACiAwMzUxIHN0dWIgSXNCYWRDb2RlUHRyCiAwMzUyIHN0dWIgSXNCYWRIdWdlUmVhZFB0cgogMDM1MyBzdHViIElzQmFkSHVnZVdyaXRlUHRyCi0wMzU0IHN0dWIgSXNCYWRSZWFkUHRyCiswMzU0IHN0ZGNhbGwgSXNCYWRSZWFkUHRyKHB0ciBsb25nKQlXSU4zMl9Jc0JhZFJlYWRQdHIKIDAzNTUgc3R1YiBJc0JhZFN0cmluZ1B0ckEKIDAzNTYgc3R1YiBJc0JhZFN0cmluZ1B0clcKLTAzNTcgc3R1YiBJc0JhZFdyaXRlUHRyCiswMzU3IHN0ZGNhbGwgSXNCYWRXcml0ZVB0cihwdHIgbG9uZykJV0lOMzJfSXNCYWRXcml0ZVB0cgogMDM1OCBzdHViIElzREJDU0xlYWRCeXRlCiAwMzU5IHN0dWIgSXNEQkNTTGVhZEJ5dGVFeAogMDM2MCBzdHViIElzVmFsaWRDb2RlUGFnZQpAQCAtMzgwLDcgKzM4MCw3IEBACiAwMzc0IHN0dWIgTG9jYWxGbGFncwogMDM3NSBzdHViIExvY2FsRnJlZQogMDM3NiBzdHViIExvY2FsSGFuZGxlCi0wMzc3IHN0dWIgTG9jYWxMb2NrCiswMzc3IHN0ZGNhbGwgTG9jYWxMb2NrKGxvbmcpCUdsb2JhbExvY2szMgogMDM3OCBzdHViIExvY2FsUmVBbGxvYwogMDM3OSBzdHViIExvY2FsU2hyaW5rCiAwMzgwIHN0dWIgTG9jYWxTaXplCkBAIC01MDIsNyArNTAyLDcgQEAKIDA0OTYgc3R1YiBTZXRMYXN0Q29uc29sZUV2ZW50QWN0aXZlCiAwNDk3ICAgIHN0ZGNhbGwgU2V0TGFzdEVycm9yKGxvbmcpIFNldExhc3RFcnJvcgogMDQ5OCBzdHViIFNldExvY2FsVGltZQotMDQ5OSBzdHViIFNldExvY2FsZUluZm9BCiswNDk5IHN0ZGNhbGwgU2V0TG9jYWxlSW5mb0EobG9uZyBsb25nIHB0cikgU2V0TG9jYWxlSW5mb0EKIDA1MDAgc3R1YiBTZXRMb2NhbGVJbmZvVwogMDUwMSBzdHViIFNldE1haWxzbG90SW5mbwogMDUwMiBzdHViIFNldE5hbWVkUGlwZUhhbmRsZVN0YXRlCkBAIC01MTQsNyArNTE0LDcgQEAKIDA1MDggc3R1YiBTZXRTeXN0ZW1UaW1lQWRqdXN0bWVudAogMDUwOSBzdHViIFNldFRhcGVQYXJhbWV0ZXJzCiAwNTEwIHN0dWIgU2V0VGFwZVBvc2l0aW9uCi0wNTExIHN0dWIgU2V0VGhyZWFkQWZmaW5pdHlNYXNrCiswNTExIHN0ZGNhbGwgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKGxvbmcgbG9uZykJU2V0VGhyZWFkQWZmaW5pdHlNYXNrCiAwNTEyIHN0dWIgU2V0VGhyZWFkQ29udGV4dAogMDUxMyBzdHViIFNldFRocmVhZExvY2FsZQogMDUxNCBzdHViIFNldFRocmVhZFByaW9yaXR5CmRpZmYgLS1naXQgYS9pZjE2MzIva2V5Ym9hcmQuc3BlYyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCmluZGV4IDU4MjAzNjMuLmJmM2JhNDMgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9rZXlib2FyZC5zcGVjCisrKyBiL2lmMTYzMi9rZXlib2FyZC5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlrZXlib2FyZAogdHlwZQl3aW4xNgotaWQJNwogCiAjMQlwYXNjYWwJSW5xdWlyZQogIzIJcGFzY2FsCUVuYWJsZQpkaWZmIC0tZ2l0IGEvaWYxNjMyL2x6ZXhwYW5kLnNwZWMgYi9pZjE2MzIvbHpleHBhbmQuc3BlYwppbmRleCAzZTZiMmM5Li5jYTBlOWQzIDEwMDY0NAotLS0gYS9pZjE2MzIvbHpleHBhbmQuc3BlYworKysgYi9pZjE2MzIvbHpleHBhbmQuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJbHpleHBhbmQKIHR5cGUJd2luMTYKLWlkCTI2CiAKIDEgIHBhc2NhbCAgIExaQ29weSh3b3JkIHdvcmQpIExaQ29weQogMiAgcGFzY2FsMTYgTFpPcGVuRmlsZShwdHIgcHRyIHdvcmQpIExaT3BlbkZpbGUKZGlmZiAtLWdpdCBhL2lmMTYzMi9tbXN5c3RlbS5zcGVjIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKaW5kZXggY2IyODIwNC4uZDJlYmQwMCAxMDA2NDQKLS0tIGEvaWYxNjMyL21tc3lzdGVtLnNwZWMKKysrIGIvaWYxNjMyL21tc3lzdGVtLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCW1tc3lzdGVtCiB0eXBlCXdpbjE2Ci1pZAkxMAogCiAjMSAgICAgIHBhc2NhbCAgTU1TWVNURU1fV0VQKHdvcmQgd29yZCB3b3JkIHB0cikgTU1TWVNURU1fV0VQCiAyICAgICAgcGFzY2FsICBTTkRQTEFZU09VTkQocHRyIHdvcmQpIHNuZFBsYXlTb3VuZApkaWZmIC0tZ2l0IGEvaWYxNjMyL21vdXNlLnNwZWMgYi9pZjE2MzIvbW91c2Uuc3BlYwppbmRleCBmZTg1OTlmLi5mYTVkYWM4IDEwMDY0NAotLS0gYS9pZjE2MzIvbW91c2Uuc3BlYworKysgYi9pZjE2MzIvbW91c2Uuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJbW91c2UKIHR5cGUJd2luMTYKLWlkCTEzCiAKIDEgc3R1YiBJTlFVSVJFCiAyIHN0dWIgRU5BQkxFCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMi5zcGVjIGIvaWYxNjMyL29sZTIuc3BlYwppbmRleCBmN2M4YWQyLi5iODZhMGY4IDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMi5zcGVjCisrKyBiL2lmMTYzMi9vbGUyLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCU9MRTIKIHR5cGUJd2luMTYKLWlkCTE1CiAKIDEgcGFzY2FsIE9sZUJ1aWxkVmVyc2lvbigpIE9sZUJ1aWxkVmVyc2lvbgogMiBwYXNjYWwgT2xlSW5pdGlhbGl6ZShwdHIpIE9sZUluaXRpYWxpemUKZGlmZiAtLWdpdCBhL2lmMTYzMi9vbGUyY29udi5zcGVjIGIvaWYxNjMyL29sZTJjb252LnNwZWMKaW5kZXggMzk4MDhhOC4uMWEzM2Q3MSAxMDA2NDQKLS0tIGEvaWYxNjMyL29sZTJjb252LnNwZWMKKysrIGIvaWYxNjMyL29sZTJjb252LnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCW9sZTJjb252CiB0eXBlCXdpbjE2Ci1pZAkxNgogCiAxIHN0dWIgR0VURklMVEVSSU5GTwogMiBzdHViIElNUE9SVEdSCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMmRpc3Auc3BlYyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCmluZGV4IDEzNjRmNWEuLjhiNTA1MjAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUyZGlzcC5zcGVjCisrKyBiL2lmMTYzMi9vbGUyZGlzcC5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlvbGUyZGlzcAogdHlwZQl3aW4xNgotaWQJMTcKIAogMSBzdHViIERMTEdFVENMQVNTT0JKRUNUCiAyIHBhc2NhbCBTeXNBbGxvY1N0cmluZyhwdHIpCVN5c0FsbG9jU3RyaW5nCmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMm5scy5zcGVjIGIvaWYxNjMyL29sZTJubHMuc3BlYwppbmRleCA1N2IxMzZhLi5hZTU4OTJiIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlMm5scy5zcGVjCisrKyBiL2lmMTYzMi9vbGUybmxzLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCW9sZTJubHMKIHR5cGUJd2luMTYKLWlkCTE4CiAKIDEgcGFzY2FsIEdldFVzZXJEZWZhdWx0TENJRCgpICAgICAgR2V0VXNlckRlZmF1bHRMQ0lECiAyIHBhc2NhbCBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpICAgIEdldFN5c3RlbURlZmF1bHRMQ0lECmRpZmYgLS1naXQgYS9pZjE2MzIvb2xlMnByb3guc3BlYyBiL2lmMTYzMi9vbGUycHJveC5zcGVjCmluZGV4IGUyODIyY2IuLjM0MjAxZTAgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGUycHJveC5zcGVjCisrKyBiL2lmMTYzMi9vbGUycHJveC5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlvbGUycHJveAogdHlwZQl3aW4xNgotaWQJMTkKIAogMSBzdHViIERMTEdFVENMQVNTT0JKRUNUCiAjMiBXRVAKZGlmZiAtLWdpdCBhL2lmMTYzMi9vbGVjbGkuc3BlYyBiL2lmMTYzMi9vbGVjbGkuc3BlYwppbmRleCA5Mzc2ZDY5Li4yOTFkYjdmIDEwMDY0NAotLS0gYS9pZjE2MzIvb2xlY2xpLnNwZWMKKysrIGIvaWYxNjMyL29sZWNsaS5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlvbGVjbGkKIHR5cGUJd2luMTYKLWlkCTIwCiAKICMxIFdFUAogMiBzdHViIE9MRURFTEVURQpkaWZmIC0tZ2l0IGEvaWYxNjMyL29sZXN2ci5zcGVjIGIvaWYxNjMyL29sZXN2ci5zcGVjCmluZGV4IGE3OTExNWQuLjkyMmRhNTQgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9vbGVzdnIuc3BlYworKysgYi9pZjE2MzIvb2xlc3ZyLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCW9sZXN2cgogdHlwZQl3aW4xNgotaWQJMjEKIAogIzEgV0VQCiAyICBwYXNjYWwgT2xlUmVnaXN0ZXJTZXJ2ZXIocHRyIHB0ciBwdHIgd29yZCB3b3JkKSBPbGVSZWdpc3RlclNlcnZlcgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3JlbGF5LmMgYi9pZjE2MzIvcmVsYXkuYwppbmRleCAxMTk3YWY3Li40MWRkYzI0IDEwMDY0NAotLS0gYS9pZjE2MzIvcmVsYXkuYworKysgYi9pZjE2MzIvcmVsYXkuYwpAQCAtNSw3ICs1LDYgQEAKIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAKLSNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAicmVnaXN0ZXJzLmgiCkBAIC0xOSw1NSArMTgsNiBAQAogZHByaW50Zl9yZWxheQogI2VuZGlmCiAKLSNkZWZpbmUgRExMX0VOVFJZKG5hbWUsZmxhZ3MpIFwKLSAgeyAjbmFtZSwgbmFtZSMjX0NvZGVfU3RhcnQsIG5hbWUjI19EYXRhX1N0YXJ0LCBcCi0gICAgbmFtZSMjX01vZHVsZV9TdGFydCwgbmFtZSMjX01vZHVsZV9FbmQsIChmbGFncykgfQotCi1CVUlMVElOX0RMTCBkbGxfYnVpbHRpbl90YWJsZVtdID0KLXsKLSAgICAvKiBXaW4xNiBETExzICovCi0gICAgRExMX0VOVFJZKCBLRVJORUwsICAgICBETExfRkxBR19BTFdBWVNfVVNFRCksCi0gICAgRExMX0VOVFJZKCBVU0VSLCAgICAgICBETExfRkxBR19BTFdBWVNfVVNFRCksCi0gICAgRExMX0VOVFJZKCBHREksICAgICAgICBETExfRkxBR19BTFdBWVNfVVNFRCksCi0gICAgRExMX0VOVFJZKCBXSU44N0VNLCAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBTSEVMTCwgICAgICAwKSwKLSAgICBETExfRU5UUlkoIFNPVU5ELCAgICAgIDApLAotICAgIERMTF9FTlRSWSggS0VZQk9BUkQsICAgMCksCi0gICAgRExMX0VOVFJZKCBXSU5TT0NLLCAgICAwKSwKLSAgICBETExfRU5UUlkoIFNUUkVTUywgICAgIDApLAotICAgIERMTF9FTlRSWSggTU1TWVNURU0sICAgMCksCi0gICAgRExMX0VOVFJZKCBTWVNURU0sICAgICAwKSwKLSAgICBETExfRU5UUlkoIFRPT0xIRUxQLCAgIDApLAotICAgIERMTF9FTlRSWSggTU9VU0UsICAgICAgMCksCi0gICAgRExMX0VOVFJZKCBDT01NRExHLCAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEUyLCAgICAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEUyQ09OViwgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEUyRElTUCwgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEUyTkxTLCAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEUyUFJPWCwgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEVDTEksICAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBPTEVTVlIsICAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBDT01QT0JKLCAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBTVE9SQUdFLCAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBXSU5QUk9DUywgICBETExfRkxBR19BTFdBWVNfVVNFRCksCi0gICAgRExMX0VOVFJZKCBEREVNTCwgICAgICBETExfRkxBR19OT1RfVVNFRCksCi0gICAgRExMX0VOVFJZKCBMWkVYUEFORCwgICAwKSwKLSAgICBETExfRU5UUlkoIFczMlNZUywgICAgIDApLAotICAgIC8qIFdpbjMyIERMTHMgKi8KLSAgICBETExfRU5UUlkoIEFEVkFQSTMyLCAgIDApLAotICAgIERMTF9FTlRSWSggQ09NQ1RMMzIsICAgMCksCi0gICAgRExMX0VOVFJZKCBDT01ETEczMiwgICAwKSwKLSAgICBETExfRU5UUlkoIE9MRTMyLCAgICAgIDApLAotICAgIERMTF9FTlRSWSggR0RJMzIsICAgICAgMCksCi0gICAgRExMX0VOVFJZKCBLRVJORUwzMiwgICBETExfRkxBR19BTFdBWVNfVVNFRCksCi0gICAgRExMX0VOVFJZKCBTSEVMTDMyLCAgICAwKSwKLSAgICBETExfRU5UUlkoIFVTRVIzMiwgICAgIDApLAotICAgIERMTF9FTlRSWSggV0lOUFJPQ1MzMiwgRExMX0ZMQUdfQUxXQVlTX1VTRUQpLAotICAgIERMTF9FTlRSWSggV0lOU1BPT0wsICAgMCksCi0gICAgLyogTGFzdCBlbnRyeSAqLwotICAgIHsgTlVMTCwgfQotfTsKLQogICAvKiBTYXZlZCAxNi1iaXQgc3RhY2sgZm9yIGN1cnJlbnQgcHJvY2VzcyAoV2luMTYgb25seSkgKi8KIFdPUkQgSUYxNjMyX1NhdmVkMTZfc3MgPSAwOwogV09SRCBJRjE2MzJfU2F2ZWQxNl9zcCA9IDA7CkBAIC0xMTYsMTcgKzY2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZW50cnlfcG9pbnQsIGludCBhcmdzMzIgKQogewogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWU7Ci0gICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgV09SRCBvcmRpbmFsOwogICAgIGNoYXIgKmFyZ3MxNiwgKm5hbWU7CiAgICAgaW50IGk7CiAKICAgICBpZiAoIWRlYnVnZ2luZ19yZWxheSkgcmV0dXJuOwogCiAgICAgZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7Ci0gICAgdGFibGUgPSAmZGxsX2J1aWx0aW5fdGFibGVbZnJhbWUtPmRsbF9pZC0xXTsKLSAgICBuYW1lICA9IE1PRFVMRV9HZXRFbnRyeVBvaW50TmFtZSggdGFibGUtPmhNb2R1bGUsIGZyYW1lLT5vcmRpbmFsX251bWJlciApOwotICAgIHByaW50ZiggIkNhbGwgJXMuJWQ6ICUuKnMoIiwKLSAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCBuYW1lICsgMSApOworICAgIHBNb2R1bGUgPSBCVUlMVElOX0dldEVudHJ5UG9pbnQoIGZyYW1lLT5lbnRyeV9jcywgZnJhbWUtPmVudHJ5X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcmRpbmFsLCAmbmFtZSApOworICAgIHByaW50ZiggIkNhbGwgJS4qcy4lZDogJS4qcygiLAorICAgICAgICAgICAgKigoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlKSwKKyAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLAorICAgICAgICAgICAgb3JkaW5hbCwgKm5hbWUsIG5hbWUgKyAxICk7CiAKICAgICBhcmdzMTYgPSAoY2hhciAqKWZyYW1lLT5hcmdzOwogICAgIGZvciAoaSA9IDA7IGkgPCBzdHJsZW4oYXJncyk7IGkrKykKQEAgLTE4NCw3ICsxMzcsOCBAQAogdm9pZCBSRUxBWV9EZWJ1Z0NhbGxGcm9tMTZSZXQoIGludCBmdW5jX3R5cGUsIGludCByZXRfdmFsLCBpbnQgYXJnczMyICkKIHsKICAgICBTVEFDSzE2RlJBTUUgKmZyYW1lOwotICAgIHN0cnVjdCBkbGxfdGFibGVfcyAqdGFibGU7CisgICAgTkVfTU9EVUxFICpwTW9kdWxlOworICAgIFdPUkQgb3JkaW5hbDsKICAgICBjaGFyICpuYW1lOwogCiAgICAgaWYgKCooRFdPUkQgKilQVFJfU0VHX1RPX0xJTihJRjE2MzJfU3RhY2szMl9iYXNlKSAhPSAweERFQURCRUVGKQpAQCAtMTk0LDExICsxNDgsMTQgQEAKICAgICB9CiAgICAgaWYgKCFkZWJ1Z2dpbmdfcmVsYXkpIHJldHVybjsKIAotICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwotICAgIHRhYmxlID0gJmRsbF9idWlsdGluX3RhYmxlW2ZyYW1lLT5kbGxfaWQtMV07Ci0gICAgbmFtZSAgPSBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIHRhYmxlLT5oTW9kdWxlLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIgKTsKLSAgICBwcmludGYoICJSZXQgICVzLiVkOiAlLipzKCkgIiwKLSAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCBuYW1lICsgMSApOworICAgIGZyYW1lICAgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgcE1vZHVsZSA9IEJVSUxUSU5fR2V0RW50cnlQb2ludCggZnJhbWUtPmVudHJ5X2NzLCBmcmFtZS0+ZW50cnlfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yZGluYWwsICZuYW1lICk7CisgICAgcHJpbnRmKCAiUmV0ICAlLipzLiVkOiAlLipzKCkgIiwKKyAgICAgICAgICAgICooKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksCisgICAgICAgICAgICAoY2hhciAqKXBNb2R1bGUgKyBwTW9kdWxlLT5uYW1lX3RhYmxlICsgMSwKKyAgICAgICAgICAgIG9yZGluYWwsICpuYW1lLCBuYW1lICsgMSApOworCiAgICAgc3dpdGNoKGZ1bmNfdHlwZSkKICAgICB7CiAgICAgY2FzZSAwOiAvKiBsb25nICovCkBAIC0yMzIsMTIgKzE4OSwxNiBAQAogICovCiB2b2lkIFJFTEFZX1VuaW1wbGVtZW50ZWQxNih2b2lkKQogeworICAgIFdPUkQgb3JkaW5hbDsKKyAgICBjaGFyICpuYW1lOwogICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7Ci0gICAgc3RydWN0IGRsbF90YWJsZV9zICp0YWJsZSA9ICZkbGxfYnVpbHRpbl90YWJsZVtmcmFtZS0+ZGxsX2lkLTFdOwotICAgIGNoYXIgKm5hbWUgPSBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIHRhYmxlLT5oTW9kdWxlLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIgKTsKLQotICAgIGZwcmludGYoIHN0ZGVyciwgIk5vIGhhbmRsZXIgZm9yIHJvdXRpbmUgJXMuJWQgKCUuKnMpXG4iLAotICAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBmcmFtZS0+b3JkaW5hbF9udW1iZXIsICpuYW1lLCBuYW1lICsgMSApOworICAgIE5FX01PRFVMRSAqcE1vZHVsZSAgPSBCVUlMVElOX0dldEVudHJ5UG9pbnQoIGZyYW1lLT5lbnRyeV9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS0+ZW50cnlfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9yZGluYWwsICZuYW1lICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiTm8gaGFuZGxlciBmb3Igcm91dGluZSAlLipzLiVkICglLipzKVxuIiwKKyAgICAgICAgICAgICAqKChCWVRFICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLAorICAgICAgICAgICAgIChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLAorICAgICAgICAgICAgIG9yZGluYWwsICpuYW1lLCBuYW1lICsgMSApOwogICAgIGV4aXQoMSk7CiB9CiAKZGlmZiAtLWdpdCBhL2lmMTYzMi9yZWxheTMyLmMgYi9pZjE2MzIvcmVsYXkzMi5jCmluZGV4IDE0ZDk4YTQuLmM2N2FjNjggMTAwNjQ0Ci0tLSBhL2lmMTYzMi9yZWxheTMyLmMKKysrIGIvaWYxNjMyL3JlbGF5MzIuYwpAQCAtMTIsNzAgKzEyLDE2IEBACiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiY2FsbGJhY2suaCIKLSNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJwZWV4ZS5oIgogI2luY2x1ZGUgInJlbGF5MzIuaCIKICNpbmNsdWRlICJzdHJ1Y3QzMi5oIgogI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIKLSNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgogCi10eXBlZGVmIHN0cnVjdAotewotICAgIGNoYXIgKm5hbWU7Ci0gICAgdm9pZCAqZGVmaW5pdGlvbjsKLX0gV0lOMzJfZnVuY3Rpb247Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgaW50IGJhc2U7Ci0gICAgaW50IHNpemU7Ci0gICAgV0lOMzJfZnVuY3Rpb24gZnVuY3Rpb25zWzFdOwotfSBXSU4zMl9ETExfSU5GTzsKLQotCi12b2lkICpSRUxBWTMyX0dldEVudHJ5UG9pbnQoQlVJTFRJTl9ETEwgKmRsbCwgY2hhciAqaXRlbSwgaW50IGhpbnQpCi17Ci0gICAgY29uc3QgV0lOMzJfRExMX0lORk8gKmluZm8gPSAoY29uc3QgV0lOMzJfRExMX0lORk8gKilkbGwtPmRhdGFfc3RhcnQ7Ci0gICAgaW50IGk7Ci0KLSAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsICJMb29raW5nIGZvciAlcyBpbiAlcywgaGludCAleFxuIiwKLSAgICAgICAgICAgICAgICAgICBpdGVtID8gaXRlbTogIihubyBuYW1lKSIsIGRsbC0+bmFtZSwgaGludCk7Ci0gICAgaWYoIWRsbCkgcmV0dXJuIDA7Ci0KLSAgICAvKiBpbXBvcnQgYnkgb3JkaW5hbCAqLwotICAgIGlmKCFpdGVtKQotICAgIHsKLSAgICAgICAgaWYoaGludCAmJiBoaW50IDwgaW5mby0+c2l6ZSkKLSAgICAgICAgICAgIHJldHVybiBpbmZvLT5mdW5jdGlvbnNbaGludCAtIGluZm8tPmJhc2VdLmRlZmluaXRpb247Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIC8qIGhpbnQgaXMgY29ycmVjdCAqLwotICAgIGlmIChoaW50ICYmIGhpbnQgPCBpbmZvLT5zaXplICYmIAotICAgICAgICBpbmZvLT5mdW5jdGlvbnNbaGludF0ubmFtZSAmJgotICAgICAgICBzdHJjbXAoaXRlbSxpbmZvLT5mdW5jdGlvbnNbaGludF0ubmFtZSk9PTApCi0gICAgICAgIHJldHVybiBpbmZvLT5mdW5jdGlvbnNbaGludF0uZGVmaW5pdGlvbjsKLQotICAgIC8qIGhpbnQgaXMgaW5jb3JyZWN0LCBzZWFyY2ggZm9yIG5hbWUgKi8KLSAgICBmb3IoaT0wO2kgPCBpbmZvLT5zaXplO2krKykKLSAgICAgICAgaWYgKGluZm8tPmZ1bmN0aW9uc1tpXS5uYW1lICYmICFzdHJjbXAoaXRlbSxpbmZvLT5mdW5jdGlvbnNbaV0ubmFtZSkpCi0gICAgICAgICAgICByZXR1cm4gaW5mby0+ZnVuY3Rpb25zW2ldLmRlZmluaXRpb247Ci0KLSAgICAvKiBmdW5jdGlvbiBhdCBoaW50IGhhcyBubyBuYW1lICh1bmltcGxlbWVudGVkKSAqLwotICAgIGlmKGhpbnQgJiYgaGludCA8IGluZm8tPnNpemUgJiYgIWluZm8tPmZ1bmN0aW9uc1toaW50XS5uYW1lKQotICAgIHsKLS8qICAgICAgICBpbmZvLT5mdW5jdGlvbnNbaGludF0ubmFtZT14c3RyZHVwKGl0ZW0pOyAqLwotICAgICAgICBkcHJpbnRmX21vZHVsZShzdGRkZWIsIlJldHVybmluZyB1bmltcGxlbWVudGVkIGZ1bmN0aW9uICVzLiVkICglcz8pXG4iLAotICAgICAgICAgICAgICAgICAgICAgICBkbGwtPm5hbWUsaGludCxpdGVtKTsKLSAgICAgICAgcmV0dXJuIGluZm8tPmZ1bmN0aW9uc1toaW50XS5kZWZpbml0aW9uOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KIAogTE9ORyBSRUxBWTMyX0NhbGxXaW5kb3dQcm9jQ29udlN0cnVjdCggV05EUFJPQyBmdW5jLCBpbnQgaHduZCwgaW50IG1lc3NhZ2UsCiAJaW50IHdQYXJhbSwgTFBBUkFNIGxQYXJhbTE2KQpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NoZWxsLnNwZWMgYi9pZjE2MzIvc2hlbGwuc3BlYwppbmRleCBmN2IyYmVhLi43NjIzZmFjIDEwMDY0NAotLS0gYS9pZjE2MzIvc2hlbGwuc3BlYworKysgYi9pZjE2MzIvc2hlbGwuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJc2hlbGwKIHR5cGUJd2luMTYKLWlkCTUKIAogICAxIHBhc2NhbCAgIFJlZ09wZW5LZXkobG9uZyBwdHIgcHRyKSBSZWdPcGVuS2V5CiAgIDIgcGFzY2FsICAgUmVnQ3JlYXRlS2V5KGxvbmcgcHRyIHB0cikgUmVnQ3JlYXRlS2V5CkBAIC0yMCwxMiArMTksMzAgQEAKICAzNCBwYXNjYWwxNiBFeHRyYWN0SWNvbih3b3JkIHB0ciBzX3dvcmQpIEV4dHJhY3RJY29uCiAgMzYgcGFzY2FsMTYgRXh0cmFjdEFzc29jaWF0ZWRJY29uKHdvcmQgcHRyIHB0cikgRXh0cmFjdEFzc29jaWF0ZWRJY29uCiAgMzcgcGFzY2FsICAgRG9FbnZpcm9ubWVudFN1YnN0KHB0ciB3b3JkKSBEb0Vudmlyb25tZW50U3Vic3QKLSAzOCBzdHViIEZpbmRFbnZpcm9ubWVudFN0cmluZwotIDM5IHN0dWIgSW50ZXJuYWxFeHRyYWN0SWNvbgorIDM4IHBhc2NhbCAgIEZpbmRFbnZpcm9ubWVudFN0cmluZyhwdHIpIEZpbmRFbnZpcm9ubWVudFN0cmluZworIDM5IHBhc2NhbDE2IEludGVybmFsRXh0cmFjdEljb24od29yZCBwdHIgc193b3JkIHdvcmQpIEludGVybmFsRXh0cmFjdEljb24KKyA0MCBzdHViIEV4dHJhY3RJY29uRXgKKyA5OCBzdHViIFNITDMyMTZfVEhVTktEQVRBMTYKKyA5OSBzdHViIFNITDE2MzJfVEhVTktEQVRBMTYKKworIzEwMCAgIDQgIDA1NTAgIEhFUkVUSEFSQkVUWUdBUlMgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCisjMTAxICAgOCAgMDEwZSAgRklOREVYRURMR1BST0MgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCisjMTAxIERMTEVOVFJZUE9JTlQgI3dpbjk1IFNIRUxMLkRMTAorCiAxMDIgcGFzY2FsMTYgUmVnaXN0ZXJTaGVsbEhvb2socHRyKSBSZWdpc3RlclNoZWxsSG9vawogMTAzIHBhc2NhbDE2IFNoZWxsSG9va1Byb2MoKSBTaGVsbEhvb2tQcm9jCiAKLSMgIDggICA3ICAwMDAwICBXRVAgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCi0jMTAwICAgNCAgMDU1MCAgSEVSRVRIQVJCRVRZR0FSUyBleHBvcnRlZCwgc2hhcmVkIGRhdGEKLSMxMDEgICA4ICAwMTBlICBGSU5ERVhFRExHUFJPQyBleHBvcnRlZCwgc2hhcmVkIGRhdGEKLSMgMzIgICA5ICAwODI5ICBXQ0kgZXhwb3J0ZWQsIHNoYXJlZCBkYXRhCisjICAxNTcgUkVTVEFSVERJQUxPRworIyAgMTY2IFBJQ0tJQ09ORExHCisKKzI2MiBwYXNjYWwxNiBEcml2ZVR5cGUobG9uZykgR2V0RHJpdmVUeXBlCisKKyMgIDI2MyBTSDE2VE8zMkRSSVZFSU9DVEwKKyMgIDI2NCBTSDE2VE8zMklOVDI1MjYKKyMgIDMwMCBTSEdFVEZJTEVJTkZPCisjICA0MDAgU0hGT1JNQVREUklWRQorIyAgNDAxIFNIQ0hFQ0tEUklWRQorIyAgNDAyIF9SVU5ETExDSEVDS0RSSVZFCisKKyMgOCBXRVAgCisjMzIgV0NJCmRpZmYgLS1naXQgYS9pZjE2MzIvc2hlbGwzMi5zcGVjIGIvaWYxNjMyL3NoZWxsMzIuc3BlYwppbmRleCAxZTBhNTRiLi5lMGQ1OThmIDEwMDY0NAotLS0gYS9pZjE2MzIvc2hlbGwzMi5zcGVjCisrKyBiL2lmMTYzMi9zaGVsbDMyLnNwZWMKQEAgLTg2LDcgKzg2LDcgQEAKIDAwODEgc3R1YiBTaGVTaG9ydGVuUGF0aFcKIDAwODIgc3R1YiBTaGVsbEFib3V0QQogMDA4MyBzdHViIFNoZWxsQWJvdXRXCi0wMDg0IHN0dWIgU2hlbGxFeGVjdXRlQQorMDA4NCBzdGRjYWxsIFNoZWxsRXhlY3V0ZUEod29yZCBwdHIgcHRyIHB0ciBwdHIgc193b3JkKSBTaGVsbEV4ZWN1dGUKIDAwODUgc3R1YiBTaGVsbEV4ZWN1dGVFeAogMDA4NiBzdHViIFNoZWxsRXhlY3V0ZUV4QQogMDA4NyBzdHViIFNoZWxsRXhlY3V0ZUV4VwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3NvdW5kLnNwZWMgYi9pZjE2MzIvc291bmQuc3BlYwppbmRleCAyM2I2NTZmLi5hMGFiNjI0IDEwMDY0NAotLS0gYS9pZjE2MzIvc291bmQuc3BlYworKysgYi9pZjE2MzIvc291bmQuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJc291bmQKIHR5cGUJd2luMTYKLWlkCTYKIAogMSAgcGFzY2FsMTYgT3BlblNvdW5kKCkgT3BlblNvdW5kCiAyICBwYXNjYWwxNiBDbG9zZVNvdW5kKCkgQ2xvc2VTb3VuZApkaWZmIC0tZ2l0IGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYyBiL2lmMTYzMi9zdG9yYWdlLnNwZWMKaW5kZXggMmMwM2IxZS4uZjA5YzEzYiAxMDA2NDQKLS0tIGEvaWYxNjMyL3N0b3JhZ2Uuc3BlYworKysgYi9pZjE2MzIvc3RvcmFnZS5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlzdG9yYWdlCiB0eXBlCXdpbjE2Ci1pZAkyMwogIAogMSBzdHViIFN0Z0NyZWF0ZURvY0ZpbGUKIDIgc3R1YiBTdGdDcmVhdGVEb2NGaWxlT25JTG9ja0J5dGVzCmRpZmYgLS1naXQgYS9pZjE2MzIvc3RyZXNzLnNwZWMgYi9pZjE2MzIvc3RyZXNzLnNwZWMKaW5kZXggNjljODMwOS4uZGVjNjVmYyAxMDA2NDQKLS0tIGEvaWYxNjMyL3N0cmVzcy5zcGVjCisrKyBiL2lmMTYzMi9zdHJlc3Muc3BlYwpAQCAtMiw3ICsyLDYgQEAKICMKIG5hbWUJc3RyZXNzCiB0eXBlCXdpbjE2Ci1pZAk5CiAKIDIgICBwYXNjYWwgYWxsb2NtZW0obG9uZykJCUFsbG9jTWVtCiAzICAgcGFzY2FsIGZyZWVhbGxtZW0oKQkJCUZyZWVBbGxNZW0KZGlmZiAtLWdpdCBhL2lmMTYzMi9zeXN0ZW0uc3BlYyBiL2lmMTYzMi9zeXN0ZW0uc3BlYwppbmRleCA5NzUzNjRjLi4wYjcyN2ExIDEwMDY0NAotLS0gYS9pZjE2MzIvc3lzdGVtLnNwZWMKKysrIGIvaWYxNjMyL3N5c3RlbS5zcGVjCkBAIC0xLDYgKzEsNSBAQAogbmFtZQlzeXN0ZW0KIHR5cGUJd2luMTYKLWlkCTExCiAKIDEgc3R1YiBJbnF1aXJlU3lzdGVtCiAyIHN0dWIgQ3JlYXRlU3lzdGVtVGltZXIKZGlmZiAtLWdpdCBhL2lmMTYzMi90b29saGVscC5zcGVjIGIvaWYxNjMyL3Rvb2xoZWxwLnNwZWMKaW5kZXggOTA4NTA1My4uYzM4MzdlOSAxMDA2NDQKLS0tIGEvaWYxNjMyL3Rvb2xoZWxwLnNwZWMKKysrIGIvaWYxNjMyL3Rvb2xoZWxwLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCXRvb2xoZWxwCiB0eXBlCXdpbjE2Ci1pZAkxMgogCiA1MCBwYXNjYWwxNiBHbG9iYWxIYW5kbGVUb1NlbCh3b3JkKSBHbG9iYWxIYW5kbGVUb1NlbAogNTEgcGFzY2FsMTYgR2xvYmFsRmlyc3QocHRyIHdvcmQpIEdsb2JhbEZpcnN0CmRpZmYgLS1naXQgYS9pZjE2MzIvdXNlci5zcGVjIGIvaWYxNjMyL3VzZXIuc3BlYwppbmRleCA3MjFmZGUwLi5mNWU3ZDkxIDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlci5zcGVjCisrKyBiL2lmMTYzMi91c2VyLnNwZWMKQEAgLTEsNiArMSw2IEBACiBuYW1lCXVzZXIKIHR5cGUJd2luMTYKLWlkCTIKK2hlYXAJNjU1MjAKIAogMSAgIHBhc2NhbDE2IE1lc3NhZ2VCb3god29yZCBwdHIgcHRyIHdvcmQpIE1lc3NhZ2VCb3gKIDIgICBzdHViIE9sZEV4aXRXaW5kb3dzCkBAIC0zMDAsNyArMzAwLDcgQEAKIDI5NCBzdHViIExvY2tXaW5kb3dVcGRhdGUKIDI5OSByZWdpc3RlciBNb3VzZV9FdmVudCgpIE1vdXNlX0V2ZW50CiAzMDAgc3R1YiBVbmxvYWRJbnN0YWxsZWREcml2ZXJzCi0jMzAxIEJPWk9TTElWRUhFUkUgOi0pKQorIzMwMSBCT1pPU0xJVkVIRVJFIDotKSkJPC0gdGhpcyBpcyBhY3R1YWxseSBFZGl0V25kUHJvYwogIzMwNiBCRUFSMzA2CiAzMDggcGFzY2FsICAgRGVmRGxnUHJvYyh3b3JkIHdvcmQgd29yZCBsb25nKSBEZWZEbGdQcm9jCiAzMDkgcGFzY2FsMTYgR2V0Q2xpcEN1cnNvcihwdHIpIEdldENsaXBDdXJzb3IKQEAgLTQ4MSwxMCArNDgxLDEwIEBACiA2NTIgc3R1YiBHZXRLZXlib2FyZExheW91dExpc3QKIDY1NCBzdHViIFVubG9hZEtleWJvYXJkTGF5b3V0CiA2NTUgc3R1YiBQb3N0UG9zdGVkTWVzc2FnZXMKLTY1NiBzdHViIERyYXdGcmFtZUNvbnRyb2wKKzY1NiBwYXNjYWwxNiBEcmF3RnJhbWVDb250cm9sKHdvcmQgcHRyIHdvcmQgd29yZCkgRHJhd0ZyYW1lQ29udHJvbAogNjU3IHN0dWIgRHJhd0NhcHRpb25UZW1wCiA2NTggc3R1YiBEaXNwYXRjaElucHV0Ci02NTkgc3R1YiBEcmF3RWRnZQorNjU5IHBhc2NhbDE2IERyYXdFZGdlKHdvcmQgcHRyIHdvcmQgd29yZCkgRHJhd0VkZ2UKIDY2MCBzdHViIERyYXdDYXB0aW9uCiA2NjEgc3R1YiBTZXRTeXNDb2xvcnNUZW1wCiA2NjIgc3R1YiBEcmF3TWVudWJhclRlbXAKZGlmZiAtLWdpdCBhL2lmMTYzMi91c2VyMzIuc3BlYyBiL2lmMTYzMi91c2VyMzIuc3BlYwppbmRleCAxM2U3YWI3Li42ZjY4MjE1IDEwMDY0NAotLS0gYS9pZjE2MzIvdXNlcjMyLnNwZWMKKysrIGIvaWYxNjMyL3VzZXIzMi5zcGVjCkBAIC0yNDAsNyArMjQwLDcgQEAKIDAyMjggc3R1YiBHZXRDdXJzb3JQb3MKIDAyMjkgc3RkY2FsbCBHZXREQyhsb25nKSBHZXREQwogMDIzMCBzdHViIEdldERDRXgKLTAyMzEgc3R1YiBHZXREZXNrdG9wV2luZG93CiswMjMxIHN0ZGNhbGwgR2V0RGVza3RvcFdpbmRvdygpIEdldERlc2t0b3BXaW5kb3cKIDAyMzIgc3R1YiBHZXREaWFsb2dCYXNlVW5pdHMKIDAyMzMgc3R1YiBHZXREbGdDdHJsSUQKIDAyMzQgc3RkY2FsbCBHZXREbGdJdGVtKGxvbmcgbG9uZykgR2V0RGxnSXRlbQpAQCAtMjk4LDggKzI5OCw4IEBACiAwMjg2IHN0dWIgR2V0U2hlbGxXaW5kb3cKIDAyODcgc3R1YiBHZXRTdWJNZW51CiAwMjg4IAlzdGRjYWxsIEdldFN5c0NvbG9yKGxvbmcpIEdldFN5c0NvbG9yCi0wMjg5IHN0dWIgR2V0U3lzQ29sb3JCcnVzaAotMDI5MCBzdHViIEdldFN5c3RlbU1lbnUKKzAyODkgc3RkY2FsbCBHZXRTeXNDb2xvckJydXNoKGxvbmcpIEdldFN5c0NvbG9yQnJ1c2gKKzAyOTAgc3RkY2FsbCBHZXRTeXN0ZW1NZW51KGxvbmcgbG9uZykgR2V0U3lzdGVtTWVudQogMDI5MSBzdGRjYWxsIEdldFN5c3RlbU1ldHJpY3MobG9uZykgR2V0U3lzdGVtTWV0cmljcwogMDI5MiBzdHViIEdldFRhYmJlZFRleHRFeHRlbnRBCiAwMjkzIHN0dWIgR2V0VGFiYmVkVGV4dEV4dGVudFcKQEAgLTMxMCwxNCArMzEwLDE0IEBACiAwMjk4IHN0dWIgR2V0VXNlck9iamVjdEluZm9ybWF0aW9uQQogMDI5OSBzdHViIEdldFVzZXJPYmplY3RJbmZvcm1hdGlvblcKIDAzMDAgc3R1YiBHZXRVc2VyT2JqZWN0U2VjdXJpdHkKLTAzMDEgc3R1YiBHZXRXaW5kb3cKKzAzMDEgc3RkY2FsbCBHZXRXaW5kb3cobG9uZyBsb25nKSBHZXRXaW5kb3cKIDAzMDIgc3R1YiBHZXRXaW5kb3dDb250ZXh0SGVscElkCiAwMzAzIHN0ZGNhbGwgR2V0V2luZG93REMobG9uZykgR2V0V2luZG93REMKIDAzMDQgc3R1YiBHZXRXaW5kb3dMb25nQQogMDMwNSBzdHViIEdldFdpbmRvd0xvbmdXCiAwMzA2IHN0dWIgR2V0V2luZG93UGxhY2VtZW50CiAwMzA3IHN0dWIgR2V0V2luZG93UmVjdAotMDMwOCBzdHViIEdldFdpbmRvd1RleHRBCiswMzA4IHN0ZGNhbGwgR2V0V2luZG93VGV4dEEobG9uZyBzZWdwdHIgbG9uZykgV0lOMTZfR2V0V2luZG93VGV4dAogMDMwOSBzdHViIEdldFdpbmRvd1RleHRMZW5ndGhBCiAwMzEwIHN0dWIgR2V0V2luZG93VGV4dExlbmd0aFcKIDAzMTEgc3R1YiBHZXRXaW5kb3dUZXh0VwpAQCAtMzk4LDcgKzM5OCw3IEBACiAwMzg2IHN0dWIgTWVudUl0ZW1Gcm9tUG9pbnQKIDAzODcgc3R1YiBNZW51V2luZG93UHJvY0EKIDAzODggc3R1YiBNZW51V2luZG93UHJvY1cKLTAzODkgc3R1YiBNZXNzYWdlQmVlcAorMDM4OSBzdGRjYWxsIE1lc3NhZ2VCZWVwKGxvbmcpIE1lc3NhZ2VCZWVwCiAwMzkwCXN0ZGNhbGwgTWVzc2FnZUJveEEobG9uZyBwdHIgcHRyIGxvbmcpCU1lc3NhZ2VCb3gKIDAzOTEgc3R1YiBNZXNzYWdlQm94RXhBCiAwMzkyIHN0dWIgTWVzc2FnZUJveEV4VwpkaWZmIC0tZ2l0IGEvaWYxNjMyL3Zlci5zcGVjIGIvaWYxNjMyL3Zlci5zcGVjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwY2FkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9pZjE2MzIvdmVyLnNwZWMKQEAgLTAsMCArMSwxNiBAQAorbmFtZQl2ZXIKK3R5cGUJd2luMTYKKworIzEgRExMRU5UUllQT0lOVAorCisyIHBhc2NhbCBHZXRGaWxlUmVzb3VyY2VTaXplKHB0ciBzZWdwdHIgc2VncHRyIHB0cikgR2V0RmlsZVJlc291cmNlU2l6ZQorMyBwYXNjYWwgR2V0RmlsZVJlc291cmNlKHB0ciBzZWdwdHIgc2VncHRyIGxvbmcgbG9uZyBwdHIpIEdldEZpbGVSZXNvdXJjZQorNiBwYXNjYWwgR2V0RmlsZVZlcnNpb25JbmZvU2l6ZShwdHIgcHRyKSBHZXRGaWxlVmVyc2lvbkluZm9TaXplCis3IHBhc2NhbCBHZXRGaWxlVmVyc2lvbkluZm8ocHRyIGxvbmcgbG9uZyBwdHIpIEdldEZpbGVWZXJzaW9uSW5mbworOCBwYXNjYWwgVmVyRmluZEZpbGUod29yZCBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0ciBwdHIpIFZlckZpbmRGaWxlCis5IHBhc2NhbCBWZXJJbnN0YWxsRmlsZSh3b3JkIHB0ciBwdHIgcHRyIHB0ciBwdHIgcHRyIHB0cikgVmVySW5zdGFsbEZpbGUKKzEwIHBhc2NhbCBWZXJMYW5ndWFnZU5hbWUod29yZCBwdHIgd29yZCkgVmVyTGFuZ3VhZ2VOYW1lCisxMSBwYXNjYWwgVmVyUXVlcnlWYWx1ZShzZWdwdHIgcHRyIHB0ciBwdHIpIFZlclF1ZXJ5VmFsdWUKKzIwIHN0dWIgR0VURklMRVZFUlNJT05JTkZPUkFXCisjMjEgVkVSRlRIS19USFVOS0RBVEExNgorIzIyIFZFUlRIS1NMX1RIVU5LREFUQTE2CmRpZmYgLS1naXQgYS9pZjE2MzIvdzMyc3lzLnNwZWMgYi9pZjE2MzIvdzMyc3lzLnNwZWMKaW5kZXggMDRkZDk2OC4uZmY1YTNkZCAxMDA2NDQKLS0tIGEvaWYxNjMyL3czMnN5cy5zcGVjCisrKyBiL2lmMTYzMi93MzJzeXMuc3BlYwpAQCAtMSw2ICsxLDUgQEAKIG5hbWUJdzMyc3lzCiB0eXBlCXdpbjE2Ci1pZAkyNwogCiAjMSBXRVAKIDIgc3R1YiBJU1BFRk9STUFUCmRpZmYgLS1naXQgYS9pZjE2MzIvd2luODdlbS5zcGVjIGIvaWYxNjMyL3dpbjg3ZW0uc3BlYwppbmRleCA3Y2VlMTk4Li5kYTAwZWY3IDEwMDY0NAotLS0gYS9pZjE2MzIvd2luODdlbS5zcGVjCisrKyBiL2lmMTYzMi93aW44N2VtLnNwZWMKQEAgLTEsNiArMSw1IEBACiBuYW1lCXdpbjg3ZW0KIHR5cGUJd2luMTYKLWlkCTQKIAogMSByZWdpc3RlciBfZnBNYXRoKCkgV0lOODdfZnBtYXRoCiAzIHBhc2NhbDE2IF9fV2luRW04N0luZm8ocHRyIHdvcmQpIFdJTjg3X1dpbkVtODdJbmZvCmRpZmYgLS1naXQgYS9pZjE2MzIvd2luc29jay5zcGVjIGIvaWYxNjMyL3dpbnNvY2suc3BlYwppbmRleCA1Mjk3NTA3MS4uZWU1OGU1NSAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnNvY2suc3BlYworKysgYi9pZjE2MzIvd2luc29jay5zcGVjCkBAIC01LDcgKzUsNiBAQAogIyAgCiBuYW1lCXdpbnNvY2sKIHR5cGUJd2luMTYKLWlkCTgKIAogMSAgIHBhc2NhbDE2IGFjY2VwdCh3b3JkIHB0ciBwdHIpIFdJTlNPQ0tfYWNjZXB0CiAyICAgcGFzY2FsMTYgYmluZCh3b3JkIHB0ciB3b3JkKSBXSU5TT0NLX2JpbmQKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5wcm9jcy5zcGVjIGIvaWYxNjMyL3dwcm9jcy5zcGVjCnNpbWlsYXJpdHkgaW5kZXggOTklCnJlbmFtZSBmcm9tIGlmMTYzMi93aW5wcm9jcy5zcGVjCnJlbmFtZSB0byBpZjE2MzIvd3Byb2NzLnNwZWMKaW5kZXggMDU2YzlmNi4uZmI3YzYxNCAxMDA2NDQKLS0tIGEvaWYxNjMyL3dpbnByb2NzLnNwZWMKKysrIGIvaWYxNjMyL3dwcm9jcy5zcGVjCkBAIC0xLDYgKzEsNSBAQAotbmFtZQl3aW5wcm9jcworbmFtZQl3cHJvY3MKIHR5cGUJd2luMTYKLWlkCTI0CiAKIDEgIHBhc2NhbCBCdXR0b25XbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIEJ1dHRvblduZFByb2MKIDIgIHBhc2NhbCBTdGF0aWNXbmRQcm9jKHdvcmQgd29yZCB3b3JkIGxvbmcpIFN0YXRpY1duZFByb2MKZGlmZiAtLWdpdCBhL2lmMTYzMi93aW5wcm9jczMyLnNwZWMgYi9pZjE2MzIvd3Byb2NzMzIuc3BlYwpzaW1pbGFyaXR5IGluZGV4IDk4JQpyZW5hbWUgZnJvbSBpZjE2MzIvd2lucHJvY3MzMi5zcGVjCnJlbmFtZSB0byBpZjE2MzIvd3Byb2NzMzIuc3BlYwppbmRleCBkNDBkYWZhLi4yODdhMGEzIDEwMDY0NAotLS0gYS9pZjE2MzIvd2lucHJvY3MzMi5zcGVjCisrKyBiL2lmMTYzMi93cHJvY3MzMi5zcGVjCkBAIC0xLDQgKzEsNCBAQAotbmFtZQl3aW5wcm9jczMyCituYW1lCXdwcm9jczMyCiB0eXBlCXdpbjMyCiAKIDEgIHN0ZGNhbGwgQnV0dG9uV25kUHJvYyhsb25nIGxvbmcgbG9uZyBsb25nKSBCdXR0b25XbmRQcm9jMzIKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fdHJ0eXBlIGIvaW5jbHVkZS9iaXRtYXBzL29ibV90cnR5cGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc0YTAwMgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fdHJ0eXBlCkBAIC0wLDAgKzEsMjAgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fdHJ0eXBlW10gPSB7CisiMTQgMTQgMyAxIiwKKyIgCXMgd2hpdGUgYyB3aGl0ZSIsCisiLglzIGJsYWNrIGMgYmxhY2siLAorIm8JcyBka2dyYXkgYyAjODA4MDgwIiwKKyIgICAgICAgICAgICAgICIsCisiIG9vb29vb29vICAgICAiLAorIiBvbyBvbyBvbyAgICAgIiwKKyIgbyAgb28gIG8gICAgICIsCisiIG8gIG8uLi4uLi4uLiAiLAorIiAgICBvLi4gLi4gLi4gIiwKKyIgICAgby4gIC4uICAuICIsCisiICAgIG8uICAuLiAgLiAiLAorIiAgICBvbyAgLi4gICAgIiwKKyIgb29vb29vby4uICAgICIsCisiICAgICAgICAuLiAgICAiLAorIiAgICAgICAgLi4gICAgIiwKKyIgICAgICAuLi4uLi4gICIsCisiICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY2xhc3MuaCBiL2luY2x1ZGUvY2xhc3MuaAppbmRleCAwNzM3NDVmLi4wNDJjNzQ2IDEwMDY0NAotLS0gYS9pbmNsdWRlL2NsYXNzLmgKKysrIGIvaW5jbHVkZS9jbGFzcy5oCkBAIC0xMSwzMCArMTEsMjEgQEAKIAogI2RlZmluZSBDTEFTU19NQUdJQyAgIDB4NGI0ZSAgICAgIC8qICdOSycgKi8KIAotI2lmbmRlZiBXSU5FTElCCi0jcHJhZ21hIHBhY2soMSkKLSNlbmRpZgotCi0gIC8qICEhIERvbid0IGNoYW5nZSB0aGlzIHN0cnVjdHVyZSAoc2VlIEdldENsYXNzTG9uZygpKSAqLwogdHlwZWRlZiBzdHJ1Y3QgdGFnQ0xBU1MKIHsKLSAgICBIQ0xBU1MgICAgICAgaE5leHQ7ICAgICAgICAgLyogTmV4dCBjbGFzcyAqLwotICAgIFdPUkQgICAgICAgICB3TWFnaWM7ICAgICAgICAvKiBNYWdpYyBudW1iZXIgKG11c3QgYmUgQ0xBU1NfTUFHSUMpICovCi0gICAgQVRPTSAgICAgICAgIGF0b21OYW1lOyAgICAgIC8qIE5hbWUgb2YgdGhlIGNsYXNzICovCi0gICAgSEFORExFICAgICAgIGhkY2U7ICAgICAgICAgIC8qIENsYXNzIERDRSAoaWYgQ1NfQ0xBU1NEQykgKi8KLSAgICBXT1JEICAgICAgICAgY1dpbmRvd3M7ICAgICAgLyogQ291bnQgb2YgZXhpc3Rpbmcgd2luZG93cyBvZiB0aGlzIGNsYXNzICovCi0gICAgV05EQ0xBU1MgICAgIHdjIFdJTkVfUEFDS0VEOyAgLyogQ2xhc3MgaW5mb3JtYXRpb24gKi8KLSAgICBXT1JEICAgICAgICAgd0V4dHJhWzFdOyAgICAgLyogQ2xhc3MgZXh0cmEgYnl0ZXMgKi8KKyAgICBzdHJ1Y3QgdGFnQ0xBU1MgKm5leHQ7ICAgICAgLyogTmV4dCBjbGFzcyAqLworICAgIEhDTEFTUyAgICAgICAgICAgc2VsZjsgICAgICAvKiBIYW5kbGUgdG8gdGhpcyBjbGFzcyAqLworICAgIFdPUkQgICAgICAgICAgICAgd01hZ2ljOyAgICAvKiBNYWdpYyBudW1iZXIgKG11c3QgYmUgQ0xBU1NfTUFHSUMpICovCisgICAgQVRPTSAgICAgICAgICAgICBhdG9tTmFtZTsgIC8qIE5hbWUgb2YgdGhlIGNsYXNzICovCisgICAgSEFORExFICAgICAgICAgICBoZGNlOyAgICAgIC8qIENsYXNzIERDRSAoaWYgQ1NfQ0xBU1NEQykgKi8KKyAgICBXT1JEICAgICAgICAgICAgIGNXaW5kb3dzOyAgLyogQ291bnQgb2YgZXhpc3Rpbmcgd2luZG93cyBvZiB0aGlzIGNsYXNzICovCisgICAgV05EQ0xBU1MgICAgICAgICB3YzsgICAgICAgIC8qIENsYXNzIGluZm9ybWF0aW9uICovCisgICAgV09SRCAgICAgICAgICAgICB3RXh0cmFbMV07IC8qIENsYXNzIGV4dHJhIGJ5dGVzICovCiB9IENMQVNTOwogCi0jaWZuZGVmIFdJTkVMSUIKLSNwcmFnbWEgcGFjayg0KQotI2VuZGlmCi0KLWV4dGVybiB2b2lkIENMQVNTX0R1bXBDbGFzcyggSENMQVNTIGhDbGFzcyApOworZXh0ZXJuIHZvaWQgQ0xBU1NfRHVtcENsYXNzKCBDTEFTUyAqY2xhc3MgKTsKIGV4dGVybiB2b2lkIENMQVNTX1dhbGtDbGFzc2VzKHZvaWQpOwotZXh0ZXJuIEhDTEFTUyBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBISU5TVEFOQ0UgaGluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMQVNTICoqcHRyICk7Ci1leHRlcm4gQ0xBU1MgKiBDTEFTU19GaW5kQ2xhc3NQdHIoIEhDTEFTUyBoY2xhc3MgKTsKK2V4dGVybiB2b2lkIENMQVNTX0ZyZWVNb2R1bGVDbGFzc2VzKCBITU9EVUxFIGhNb2R1bGUgKTsKK2V4dGVybiBDTEFTUyAqIENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggU0VHUFRSIG5hbWUsIEhJTlNUQU5DRSBoaW5zdGFuY2UgKTsKIAogI2VuZGlmICAvKiBDTEFTU19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RsbHMuaCBiL2luY2x1ZGUvZGxscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGQzNGNjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvZGxscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAgUm9iZXJ0IEouIEFtc3RhZHQsIDE5OTMKLSAqLwotCi0jaWZuZGVmIF9fV0lORV9ETExTX0gKLSNkZWZpbmUgX19XSU5FX0RMTFNfSAotCi0jaW5jbHVkZSAid2ludHlwZXMuaCIKLQotCi10eXBlZGVmIHN0cnVjdCBkbGxfdGFibGVfcwotewotICAgIGNoYXIgICAgICAgKm5hbWU7ICAgICAgICAgIC8qIERMTCBuYW1lICovCi0gICAgY29uc3QgQllURSAqY29kZV9zdGFydDsgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgRExMIGNvZGUgKi8KLSAgICBjb25zdCBCWVRFICpkYXRhX3N0YXJ0OyAgICAvKiAzMi1iaXQgYWRkcmVzcyBvZiBETEwgZGF0YSAqLwotICAgIEJZVEUgICAgICAgKm1vZHVsZV9zdGFydDsgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIHRoZSBtb2R1bGUgZGF0YSAqLwotICAgIEJZVEUgICAgICAgKm1vZHVsZV9lbmQ7Ci0gICAgaW50ICAgICAgICAgZmxhZ3M7ICAgICAgICAgLyogZmxhZ3MgKHNlZSBiZWxvdykgKi8KLSAgICBITU9EVUxFICAgICBoTW9kdWxlOyAgICAgICAvKiBtb2R1bGUgY3JlYXRlZCBmb3IgdGhpcyBETEwgKi8KLX0gQlVJTFRJTl9ETEw7Ci0KLS8qIERMTCBmbGFncyAqLwotI2RlZmluZSBETExfRkxBR19OT1RfVVNFRCAgICAweDAxICAvKiBVc2Ugb3JpZ2luYWwgV2luZG93cyBETEwgaWYgcG9zc2libGUgKi8KLSNkZWZpbmUgRExMX0ZMQUdfQUxXQVlTX1VTRUQgMHgwMiAgLyogQWx3YXlzIHVzZSBidWlsdC1pbiBETEwgKi8KLSNkZWZpbmUgRExMX0ZMQUdfV0lOMzIgICAgICAgMHgwNCAgLyogRExMIGlzIGEgV2luMzIgRExMICovCi0KLSNkZWZpbmUgREVDTEFSRV9ETEwobmFtZSkgXAotZXh0ZXJuIGNvbnN0IEJZVEUgbmFtZSMjX0NvZGVfU3RhcnRbXTsgXAotZXh0ZXJuIGNvbnN0IEJZVEUgbmFtZSMjX0RhdGFfU3RhcnRbXTsgXAotZXh0ZXJuIEJZVEUgbmFtZSMjX01vZHVsZV9TdGFydFtdOyBcCi1leHRlcm4gQllURSBuYW1lIyNfTW9kdWxlX0VuZFtdOwotCi0vKiAxNi1iaXQgRExMcyAqLwotREVDTEFSRV9ETEwoS0VSTkVMKQotREVDTEFSRV9ETEwoVVNFUikKLURFQ0xBUkVfRExMKEdESSkKLURFQ0xBUkVfRExMKFdJTjg3RU0pCi1ERUNMQVJFX0RMTChNTVNZU1RFTSkKLURFQ0xBUkVfRExMKFNIRUxMKQotREVDTEFSRV9ETEwoU09VTkQpCi1ERUNMQVJFX0RMTChLRVlCT0FSRCkKLURFQ0xBUkVfRExMKFdJTlNPQ0spCi1ERUNMQVJFX0RMTChTVFJFU1MpCi1ERUNMQVJFX0RMTChTWVNURU0pCi1ERUNMQVJFX0RMTChUT09MSEVMUCkKLURFQ0xBUkVfRExMKE1PVVNFKQotREVDTEFSRV9ETEwoQ09NTURMRykKLURFQ0xBUkVfRExMKE9MRTIpCi1ERUNMQVJFX0RMTChPTEUyQ09OVikKLURFQ0xBUkVfRExMKE9MRTJESVNQKQotREVDTEFSRV9ETEwoT0xFMk5MUykKLURFQ0xBUkVfRExMKE9MRTJQUk9YKQotREVDTEFSRV9ETEwoT0xFQ0xJKQotREVDTEFSRV9ETEwoT0xFU1ZSKQotREVDTEFSRV9ETEwoQ09NUE9CSikKLURFQ0xBUkVfRExMKFNUT1JBR0UpCi1ERUNMQVJFX0RMTChXSU5QUk9DUykKLURFQ0xBUkVfRExMKERERU1MKQotREVDTEFSRV9ETEwoTFpFWFBBTkQpCi1ERUNMQVJFX0RMTChXMzJTWVMpCi0KLS8qIDMyLWJpdCBETExzICovCi0KLURFQ0xBUkVfRExMKEFEVkFQSTMyKQotREVDTEFSRV9ETEwoQ09NQ1RMMzIpCi1ERUNMQVJFX0RMTChDT01ETEczMikKLURFQ0xBUkVfRExMKE9MRTMyKQotREVDTEFSRV9ETEwoR0RJMzIpCi1ERUNMQVJFX0RMTChLRVJORUwzMikKLURFQ0xBUkVfRExMKFNIRUxMMzIpCi1ERUNMQVJFX0RMTChVU0VSMzIpCi1ERUNMQVJFX0RMTChXSU5QUk9DUzMyKQotREVDTEFSRV9ETEwoV0lOU1BPT0wpCi0KLWV4dGVybiBCVUlMVElOX0RMTCBkbGxfYnVpbHRpbl90YWJsZVtdOwotCi0jZW5kaWYgLyogX19XSU5FX0RMTFNfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9nZGkuaCBiL2luY2x1ZGUvZ2RpLmgKaW5kZXggMTZhNjMxYy4uMzlhNjVmNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9nZGkuaAorKysgYi9pbmNsdWRlL2dkaS5oCkBAIC0yNTgsNyArMjU4LDYgQEAKIAogI2Vsc2UKIAotZXh0ZXJuIExQU1RSIEdESV9IZWFwOwogZXh0ZXJuIFdPUkQgR0RJX0hlYXBTZWw7CiAKICNkZWZpbmUgR0RJX0hFQVBfQUxMT0Moc2l6ZSkgXApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9oZWFwLmggYi9pbmNsdWRlL2hlYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTQxODE1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9oZWFwLmgKQEAgLTAsMCArMSwxNSBAQAorLyoKKyAqIFdpbjMyIGhlYXAgZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NiBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCisjaWZuZGVmIF9fV0lORV9IRUFQX0gKKyNkZWZpbmUgX19XSU5FX0hFQVBfSAorCisjaW5jbHVkZSAid2luYmFzZS5oIgorI2luY2x1ZGUgIndpbm50LmgiCisKK2V4dGVybiBIQU5ETEUzMiBTeXN0ZW1IZWFwOworCisjZW5kaWYgIC8qIF9fV0lORV9IRUFQX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvaG9vay5oIGIvaW5jbHVkZS9ob29rLmgKaW5kZXggNjEwYjgxNi4uNGQ4MjUxNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9ob29rLmgKKysrIGIvaW5jbHVkZS9ob29rLmgKQEAgLTQsOCArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5NCBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCi0jaWZuZGVmIEhPT0tfSAotI2RlZmluZSBIT09LX0gKKyNpZm5kZWYgX19XSU5FX0hPT0tfSAorI2RlZmluZSBfX1dJTkVfSE9PS19ICiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAibGR0LmgiCkBAIC0zNCw1ICszNCw3IEBACiAKIGV4dGVybiBEV09SRCBIT09LX0NhbGxIb29rcyggc2hvcnQgaWQsIHNob3J0IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdQQVJBTSB3UGFyYW0sIExQQVJBTSBsUGFyYW0gKTsKK2V4dGVybiB2b2lkIEhPT0tfRnJlZU1vZHVsZUhvb2tzKCBITU9EVUxFIGhNb2R1bGUgKTsKK2V4dGVybiB2b2lkIEhPT0tfRnJlZVF1ZXVlSG9va3MoIEhRVUVVRSBoUXVldWUgKTsKIAotI2VuZGlmICAvKiBIT09LX0ggKi8KKyNlbmRpZiAgLyogX19XSU5FX0hPT0tfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9rZXJuZWwzMi5oIGIvaW5jbHVkZS9rZXJuZWwzMi5oCmluZGV4IDJhMDc4ZDMuLjliNWIwMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUva2VybmVsMzIuaAorKysgYi9pbmNsdWRlL2tlcm5lbDMyLmgKQEAgLTExOSwxNCArMTE5LDQgQEAKICNkZWZpbmUgRklMRV9BVFRSSUJVVEVfQVRPTUlDX1dSSVRFICAgICAweDAyMDAKICNkZWZpbmUgRklMRV9BVFRSSUJVVEVfWEFDVElPTl9XUklURSAgICAweDA0MDAKIAotLyogQ291bGQgdGhpcyB0eXBlIGJlIGNvbnNpZGVyZWQgb3BhcXVlPyAqLwotdHlwZWRlZiBzdHJ1Y3QgewotCUxQVk9JRAlEZWJ1Z0luZm87Ci0JTE9ORyBMb2NrQ291bnQ7Ci0JTE9ORyBSZWN1cnNpb25Db3VudDsKLQlIQU5ETEUgT3duaW5nVGhyZWFkOwotCUhBTkRMRSBMb2NrU2VtYXBob3JlOwotCURXT1JEIFJlc2VydmVkOwotfUNSSVRJQ0FMX1NFQ1RJT047Ci0KICNlbmRpZiAgLyogX19XSU5FX0tFUk5FTDMyX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWRpLmggYi9pbmNsdWRlL21kaS5oCmluZGV4IDk5ZDc5NzQuLmFkZGUwYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbWRpLmgKKysrIGIvaW5jbHVkZS9tZGkuaApAQCAtMzUsMTQgKzM1LDE0IEBACiAgICAgSFdORCAgIGZsYWdDaGlsZE1heGltaXplZDsKICAgICBIV05EICAgaHduZEFjdGl2ZUNoaWxkOwogICAgIEhNRU5VICBoV2luZG93TWVudTsKLSAgICBXT1JEICAgaWRGaXJzdENoaWxkOyAgICAgICAvKiBvcmRlciBpcyAzLjEtbGlrZSB1cCB0byB0aGlzIHBvaW50ICovCisgICAgV09SRCAgIGlkRmlyc3RDaGlsZDsKICAgICBIQU5ETEUgaEZyYW1lVGl0bGU7CiAgICAgV09SRCAgIHNiTmVlZFVwZGF0ZTsKICAgICBXT1JEICAgc2JSZWNhbGM7CiAgICAgSEJJVE1BUCBvYm1DbG9zZTsKICAgICBIQklUTUFQIG9ibVJlc3RvcmU7Ci0gICAgSFdORCAgIGh3bmRIaXRUZXN0OwogICAgIEhXTkQgICBzZWxmOwogfSBNRElDTElFTlRJTkZPOwogCiAjZW5kaWYgLyogTURJX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tb2R1bGUuaCBiL2luY2x1ZGUvbW9kdWxlLmgKaW5kZXggMDFjNzg0MC4uZTZjYTc2MyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9tb2R1bGUuaAorKysgYi9pbmNsdWRlL21vZHVsZS5oCkBAIC05NCw2ICs5NCwxMCBAQAogICAgIFNFR1BUUiByZXNlcnZlZDsKIH0gTE9BRFBBUkFNUzsKIAorLyogUmVzb3VyY2UgdHlwZXMgKi8KK3R5cGVkZWYgc3RydWN0IHJlc291cmNlX3R5cGVpbmZvX3MgTkVfVFlQRUlORk87Cit0eXBlZGVmIHN0cnVjdCByZXNvdXJjZV9uYW1laW5mb19zIE5FX05BTUVJTkZPOworCiAjZGVmaW5lIE5FX1NFR19UQUJMRShwTW9kdWxlKSBcCiAgICAgKChTRUdUQUJMRUVOVFJZICopKChjaGFyICopKHBNb2R1bGUpICsgKHBNb2R1bGUpLT5zZWdfdGFibGUpKQogCkBAIC0xMTEsMjAgKzExNSwzMCBAQAogI3ByYWdtYSBwYWNrKDQpCiAjZW5kaWYKIAotZXh0ZXJuIEJPT0wgTU9EVUxFX0luaXQodm9pZCk7CisvKiBtb2R1bGUuYyAqLwogZXh0ZXJuIE5FX01PRFVMRSAqTU9EVUxFX0dldFB0ciggSE1PRFVMRSBoTW9kdWxlICk7CiBleHRlcm4gdm9pZCBNT0RVTEVfRHVtcE1vZHVsZSggSE1PRFVMRSBobW9kdWxlICk7CiBleHRlcm4gdm9pZCBNT0RVTEVfV2Fsa01vZHVsZXModm9pZCk7CiBleHRlcm4gaW50IE1PRFVMRV9PcGVuRmlsZSggSE1PRFVMRSBoTW9kdWxlICk7CiBleHRlcm4gTFBTVFIgTU9EVUxFX0dldE1vZHVsZU5hbWUoIEhNT0RVTEUgaE1vZHVsZSApOwotZXh0ZXJuIHZvaWQgTU9EVUxFX1JlZ2lzdGVyTW9kdWxlKCBITU9EVUxFIGhNb2R1bGUgKTsKK2V4dGVybiB2b2lkIE1PRFVMRV9SZWdpc3Rlck1vZHVsZSggTkVfTU9EVUxFICpwTW9kdWxlICk7CitleHRlcm4gSElOU1RBTkNFIE1PRFVMRV9HZXRJbnN0YW5jZSggSE1PRFVMRSBoTW9kdWxlICk7CiBleHRlcm4gV09SRCBNT0RVTEVfR2V0T3JkaW5hbCggSE1PRFVMRSBoTW9kdWxlLCBjb25zdCBjaGFyICpuYW1lICk7CiBleHRlcm4gU0VHUFRSIE1PRFVMRV9HZXRFbnRyeVBvaW50KCBITU9EVUxFIGhNb2R1bGUsIFdPUkQgb3JkaW5hbCApOwogZXh0ZXJuIEJPT0wgTU9EVUxFX1NldEVudHJ5UG9pbnQoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBvcmRpbmFsLCBXT1JEIG9mZnNldCApOwotZXh0ZXJuIExQU1RSIE1PRFVMRV9HZXRFbnRyeVBvaW50TmFtZSggSE1PRFVMRSBoTW9kdWxlLCBXT1JEIG9yZGluYWwgKTsKIGV4dGVybiBGQVJQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggY29uc3QgY2hhciAqbmFtZSApOwogZXh0ZXJuIEZBUlBST0MgTU9EVUxFX0dldFduZFByb2NFbnRyeTMyKCBjb25zdCBjaGFyICpuYW1lICk7CiAKKy8qIGJ1aWx0aW4uYyAqLworZXh0ZXJuIEJPT0wgQlVJTFRJTl9Jbml0KHZvaWQpOworZXh0ZXJuIEhNT0RVTEUgQlVJTFRJTl9Mb2FkTW9kdWxlKCBMUENTVFIgbmFtZSwgQk9PTCBmb3JjZSApOworZXh0ZXJuIE5FX01PRFVMRSAqQlVJTFRJTl9HZXRFbnRyeVBvaW50KCBXT1JEIGNzLCBXT1JEIGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXT1JEICpwT3JkLCBjaGFyICoqcHBOYW1lICk7CitleHRlcm4gRFdPUkQgQlVJTFRJTl9HZXRQcm9jQWRkcmVzczMyKCBORV9NT0RVTEUgKnBNb2R1bGUsIGNoYXIgKmZ1bmN0aW9uICk7CitleHRlcm4gQk9PTCBCVUlMVElOX1BhcnNlRExMT3B0aW9ucyggY29uc3QgY2hhciAqc3RyICk7CitleHRlcm4gdm9pZCBCVUlMVElOX1ByaW50RExMcyh2b2lkKTsKKworLyogbmVfaW1hZ2UuYyAqLwogZXh0ZXJuIEJPT0wgTkVfTG9hZFNlZ21lbnQoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBzZWdudW0gKTsKIGV4dGVybiB2b2lkIE5FX0ZpeHVwUHJvbG9ncyggTkVfTU9EVUxFICpwTW9kdWxlICk7CiBleHRlcm4gdm9pZCBORV9Jbml0aWFsaXplRExMcyggSE1PRFVMRSBoTW9kdWxlICk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL29wdGlvbnMuaCBiL2luY2x1ZGUvb3B0aW9ucy5oCmluZGV4IDlmNmExZGIuLjFiYmJkZDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvb3B0aW9ucy5oCisrKyBiL2luY2x1ZGUvb3B0aW9ucy5oCkBAIC0xOSw3ICsxOSw4IEBACiAgICAgTEFOR19EYSwgIC8qIERhbmlzaCAqLwogICAgIExBTkdfQ3osICAvKiBDemVjaCAqLwogICAgIExBTkdfRW8sICAvKiBFc3BlcmFudG8gKi8KLSAgICBMQU5HX0l0ICAgLyogSXRhbGlhbiAqLworICAgIExBTkdfSXQsICAvKiBJdGFsaWFuICovCisgICAgTEFOR19LbyAgIC8qIEtvcmVhbiAqLwogfSBXSU5FX0xBTkdVQUdFOwogCiBleHRlcm4gY29uc3QgY2hhciAqbGFuZ05hbWVzW107CmRpZmYgLS1naXQgYS9pbmNsdWRlL3BlX2ltYWdlLmggYi9pbmNsdWRlL3BlX2ltYWdlLmgKaW5kZXggZjUyNzQ4MS4uYjljNzRkOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wZV9pbWFnZS5oCisrKyBiL2luY2x1ZGUvcGVfaW1hZ2UuaApAQCAtMyw3ICszLDYgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJkbGxzLmgiCiAKIHN0cnVjdCBwZV9kYXRhIHsKIAlzdHJ1Y3QgcGVfaGVhZGVyX3MgKnBlX2hlYWRlcjsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcmVsYXkzMi5oIGIvaW5jbHVkZS9yZWxheTMyLmgKaW5kZXggMDZiODc0MS4uMWViMjY5MiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9yZWxheTMyLmgKKysrIGIvaW5jbHVkZS9yZWxheTMyLmgKQEAgLTcsMTEgKzcsOCBAQAogI2lmbmRlZiBfX1dJTkVfUkVMQVkzMl9ICiAjZGVmaW5lIF9fV0lORV9SRUxBWTMyX0gKIAotI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJzdHJ1Y3QzMi5oIgogCi12b2lkICpSRUxBWTMyX0dldEVudHJ5UG9pbnQoQlVJTFRJTl9ETEwgKmRsbCwgY2hhciAqaXRlbSwgaW50IGhpbnQpOwotCiB0eXBlZGVmIHN0cnVjdCB0YWdXTkRDTEFTU0F7CiAJVUlOVAlzdHlsZTsKIAlXTkRQUk9DCWxwZm5XbmRQcm9jOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zdGFja2ZyYW1lLmggYi9pbmNsdWRlL3N0YWNrZnJhbWUuaAppbmRleCAwYjQ0NTFkLi5kMGM4NDAwIDEwMDY0NAotLS0gYS9pbmNsdWRlL3N0YWNrZnJhbWUuaAorKysgYi9pbmNsdWRlL3N0YWNrZnJhbWUuaApAQCAtMTksMTEgKzE5LDExIEBACiB7CiAgICAgV09SRCAgICBzYXZlZF9zczsgICAgICAgICAgICAgICAgLyogc2F2ZWQgcHJldmlvdXMgMTYtYml0IHN0YWNrICovCiAgICAgV09SRCAgICBzYXZlZF9zcDsKLSAgICBXT1JEICAgIGVzOwotICAgIFdPUkQgICAgZHM7ICAgICAgICAgICAgICAgICAgICAgIC8qIDE2LWJpdCBkcyAqLwotICAgIERXT1JEICAgZW50cnlfcG9pbnQgV0lORV9QQUNLRUQ7IC8qIGVudHJ5IHBvaW50IHRvIGNhbGwgKi8KLSAgICBXT1JEICAgIG9yZGluYWxfbnVtYmVyOyAgICAgICAgICAvKiBvcmRpbmFsIG51bWJlciBvZiBlbnRyeSBwb2ludCAqLwotICAgIFdPUkQgICAgZGxsX2lkOyAgICAgICAgICAgICAgICAgIC8qIERMTCBpZCBvZiBlbnRyeSBwb2ludCAqLworICAgIFdPUkQgICAgZW50cnlfaXA7ICAgICAgICAgICAgICAgIC8qIGlwIG9mIGVudHJ5IHBvaW50ICovCisgICAgV09SRCAgICBkczsgICAgICAgICAgICAgICAgICAgICAgLyogZHMgKi8KKyAgICBXT1JEICAgIGVudHJ5X2NzOyAgICAgICAgICAgICAgICAvKiBjcyBvZiBlbnRyeSBwb2ludCAqLworICAgIFdPUkQgICAgZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIGVzICovCisgICAgRFdPUkQgICBlbnRyeV9wb2ludCBXSU5FX1BBQ0tFRDsgLyogMzItYml0IGVudHJ5IHBvaW50IHRvIGNhbGwgKi8KICAgICBXT1JEICAgIGJwOyAgICAgICAgICAgICAgICAgICAgICAvKiAxNi1iaXQgYnAgKi8KICAgICBXT1JEICAgIGlwOyAgICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gYWRkcmVzcyAqLwogICAgIFdPUkQgICAgY3M7CmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzZXIuaCBiL2luY2x1ZGUvdXNlci5oCmluZGV4IDVlMThkOGYuLmMxNzM2NGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdXNlci5oCisrKyBiL2luY2x1ZGUvdXNlci5oCkBAIC0xMCw5ICsxMCw2IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibG9jYWwuaCIKIAotZXh0ZXJuIEJPT0wgVVNFUl9IZWFwSW5pdCh2b2lkKTsKLS8qIFVTRVIgbG9jYWwgaGVhcCAqLwotCiAjaWZkZWYgV0lORUxJQgogCiAjZGVmaW5lIFVTRVJfSEVBUF9BTExPQyhzaXplKSBMb2NhbEFsbG9jIChMTUVNX0ZJWEVELCBzaXplKQpAQCAtMjMsNyArMjAsNiBAQAogCiAjZWxzZSAgLyogV0lORUxJQiAqLwogCi1leHRlcm4gTFBTVFIgVVNFUl9IZWFwOwogZXh0ZXJuIFdPUkQgVVNFUl9IZWFwU2VsOwogCiAjZGVmaW5lIFVTRVJfSEVBUF9BTExPQyhzaXplKSBcCmRpZmYgLS1naXQgYS9pbmNsdWRlL3Zlci5oIGIvaW5jbHVkZS92ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmJjZDhlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92ZXIuaApAQCAtMCwwICsxLDE2OCBAQAorLyogRGVmaW5pdGlvbnMgZm9yIHRoZSBWRVJzaW9uIGluZm9saWJyYXJ5IChWRVIuRExMKQorICogCisgKiBDb3B5cmlnaHQgMTk5NiBNYXJjdXMgTWVpc3NuZXIKKyAqLworI2lmbmRlZiBfX1dJTkVfVkVSX0gKKyNkZWZpbmUgX19XSU5FX1ZFUl9ICisKKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisKKy8qIHJlc291cmNlIGlkcyBmb3IgZGlmZmVyZW50IHZlcnNpb24gaW5mb3MgKi8KKyNkZWZpbmUJVlNfRklMRV9JTkZPCU1BS0VJTlRSRVNPVVJDRSgxNikKKyNkZWZpbmUJVlNfVkVSU0lPTl9JTkZPCU1BS0VJTlRSRVNPVVJDRSgxKQorI2RlZmluZQlWU19VU0VSX0lORk8JTUFLRUlOVFJFU09VUkNFKDEwMCkKKworI2RlZmluZQlWU19GRklfU0lHTkFUVVJFCTB4ZmVlZjA0YmRMCS8qIEZpbGVJbmZvIE1hZ2ljICovCisjZGVmaW5lCVZTX0ZGSV9TVFJVQ1ZFUlNJT04JMHgwMDAxMDAwMEwJLyogc3RydWMgdmVyc2lvbiAxLjAgKi8KKyNkZWZpbmUJVlNfRkZJX0ZJTEVGTEFHU01BU0sJMHgwMDAwMDAzZkwJLyogdmFsaWQgZmxhZ3MgKi8KKworLyogVlNfVkVSU0lPTi5kd0ZpbGVGbGFncyAqLworI2RlZmluZQlWU19GRl9ERUJVRwkJMHgwMUwKKyNkZWZpbmUJVlNfRkZfUFJFUkVMRUFTRQkweDAyTAorI2RlZmluZQlWU19GRl9QQVRDSEVECQkweDA0TAorI2RlZmluZQlWU19GRl9QUklWQVRFQlVJTEQJMHgwOEwKKyNkZWZpbmUJVlNfRkZfSU5GT0lORkVSUkVECTB4MTBMCisjZGVmaW5lCVZTX0ZGX1NQRUNJQUxCVUlMRAkweDIwTAorCisvKiBWU19WRVJTSU9OLmR3RmlsZU9TICovCisKKy8qIG1ham9yIG9zIHZlcnNpb24gKi8KKyNkZWZpbmUJVk9TX1VOS05PV04JCTB4MDAwMDAwMDBMCisjZGVmaW5lCVZPU19ET1MJCQkweDAwMDEwMDAwTAorI2RlZmluZQlWT1NfT1MyMTYJCTB4MDAwMjAwMDBMCisjZGVmaW5lCVZPU19PUzIzMgkJMHgwMDAzMDAwMEwKKyNkZWZpbmUJVk9TX05UCQkJMHgwMDA0MDAwMEwKKworLyogbWlub3Igb3MgdmVyc2lvbiAqLworI2RlZmluZQlWT1NfX0JBU0UJCTB4MDAwMDAwMDBMCisjZGVmaW5lCVZPU19fV0lORE9XUzE2CQkweDAwMDAwMDAxTAorI2RlZmluZQlWT1NfX1BNMTYJCTB4MDAwMDAwMDJMCisjZGVmaW5lCVZPU19fUE0zMgkJMHgwMDAwMDAwM0wKKyNkZWZpbmUJVk9TX19XSU5ET1dTMzIJCTB4MDAwMDAwMDRMCisKKy8qIHBvc3NpYmxlIHZlcnNpb25zICovCisjZGVmaW5lCVZPU19ET1NfV0lORE9XUzE2CShWT1NfRE9TfFZPU19fV0lORE9XUzE2KQorI2RlZmluZQlWT1NfRE9TX1dJTkRPV1MzMgkoVk9TX0RPU3xWT1NfX1dJTkRPV1MzMikKKyNkZWZpbmUJVk9TX09TMjE2X1BNMTYJCShWT1NfT1MyMTZ8Vk9TX19QTTE2KQorI2RlZmluZQlWT1NfT1MyMzJfUE0zMgkJKFZPU19PUzIzMnxWT1NfX1BNMzIpCisjZGVmaW5lCVZPU19OVF9XSU5ET1dTMzIJKFZPU19OVHxWT1NfX1dJTkRPV1MzMikKKworLyogVlNfVkVSU0lPTi5kd0ZpbGVUeXBlICovCisjZGVmaW5lCVZGVF9VTktOT1dOCQkweDAwMDAwMDAwTAorI2RlZmluZQlWRlRfQVBQCQkJMHgwMDAwMDAwMUwKKyNkZWZpbmUJVkZUX0RMTAkJCTB4MDAwMDAwMDJMCisjZGVmaW5lCVZGVF9EUlYJCQkweDAwMDAwMDAzTAorI2RlZmluZQlWRlRfRk9OVAkJMHgwMDAwMDAwNEwKKyNkZWZpbmUJVkZUX1ZYRAkJCTB4MDAwMDAwMDVMCisvKiA/P29uZSB0eXBlIG1pc3Npbmc/PwkJMHgwMDAwMDAwNkwgLU1hcmN1cyAqLworI2RlZmluZQlWRlRfU1RBVElDX0xJQgkJMHgwMDAwMDAwN0wKKworLyogVlNfVkVSU0lPTi5kd0ZpbGVTdWJ0eXBlIGZvciBWRlRfRFJWICovCisjZGVmaW5lCVZGVDJfVU5LTk9XTgkJMHgwMDAwMDAwMEwKKyNkZWZpbmUJVkZUMl9EUlZfUFJJTlRFUgkweDAwMDAwMDAxTAorI2RlZmluZQlWRlQyX0RSVl9LRVlCT0FSRAkweDAwMDAwMDAyTAorI2RlZmluZQlWRlQyX0RSVl9MQU5HVUFHRQkweDAwMDAwMDAzTAorI2RlZmluZQlWRlQyX0RSVl9ESVNQTEFZCTB4MDAwMDAwMDRMCisjZGVmaW5lCVZGVDJfRFJWX01PVVNFCQkweDAwMDAwMDA1TAorI2RlZmluZQlWRlQyX0RSVl9ORVRXT1JLCTB4MDAwMDAwMDZMCisjZGVmaW5lCVZGVDJfRFJWX1NZU1RFTQkJMHgwMDAwMDAwN0wKKyNkZWZpbmUJVkZUMl9EUlZfSU5TVEFMTEFCTEUJMHgwMDAwMDAwOEwKKyNkZWZpbmUJVkZUMl9EUlZfU09VTkQJCTB4MDAwMDAwMDlMCisjZGVmaW5lCVZGVDJfRFJWX0NPTU0JCTB4MDAwMDAwMGFMCisjZGVmaW5lCVZGVDJfRFJWX0lOUFVUTUVUSE9ECTB4MDAwMDAwMGJMCisKKy8qIFZTX1ZFUlNJT04uZHdGaWxlU3VidHlwZSBmb3IgVkZUX0ZPTlQgKi8KKyNkZWZpbmUJVkZUMl9GT05UX1JBU1RFUgkweDAwMDAwMDAxTAorI2RlZmluZQlWRlQyX0ZPTlRfVkVDVE9SCTB4MDAwMDAwMDJMCisjZGVmaW5lCVZGVDJfRk9OVF9UUlVFVFlQRQkweDAwMDAwMDAzTAorCisvKiBWZXJGaW5kRmlsZSBGbGFncyAqLworCS8qIGlucHV0ICovCisjZGVmaW5lCVZGRkZfSVNTSEFSRURGSUxFCTB4MDAwMQorCisJLyogb3V0cHV0IChyZXR1cm5lZCkgKi8KKyNkZWZpbmUJVkZGX0NVUk5FREVTVAkJMHgwMDAxCisjZGVmaW5lCVZGRl9GSUxFSU5VU0UJCTB4MDAwMgorI2RlZmluZQlWRkZfQlVGRlRPU01BTEwJCTB4MDAwMworCisvKiBWZXJJbnN0YWxsRmlsZSBGbGFncyAqLworCS8qIGlucHV0ICovCisjZGVmaW5lCVZJRkZfRk9SQ0VJTlNUQUxMCTB4MDAwMQorI2RlZmluZQlWSUZGX0RPTlRERUxFVEVPTEQJMHgwMDAyCisKKwkvKiBvdXRwdXQgKHJldHVybikgKi8KKyNkZWZpbmUJVklGX1RFTVBGSUxFCQkweDAwMDAwMDAxTAorI2RlZmluZQlWSUZfTUlTTUFUQ0gJCTB4MDAwMDAwMDJMCisjZGVmaW5lCVZJRl9TUkNPTEQJCTB4MDAwMDAwMDRMCisjZGVmaW5lCVZJRl9ESUZGTEFORwkJMHgwMDAwMDAwOEwKKyNkZWZpbmUJVklGX0RJRkZDT0RFUEcJCTB4MDAwMDAwMTBMCisjZGVmaW5lCVZJRl9ESUZGVFlQRQkJMHgwMDAwMDAyMEwKKyNkZWZpbmUJVklGX1dSSVRFUFJPVAkJMHgwMDAwMDA0MEwKKyNkZWZpbmUJVklGX0ZJTEVJTlVTRQkJMHgwMDAwMDA4MEwKKyNkZWZpbmUJVklGX09VVE9GU1BBQ0UJCTB4MDAwMDAxMDBMCisjZGVmaW5lCVZJRl9BQ0NFU1NWSU9MQVRJT04JMHgwMDAwMDIwMEwKKyNkZWZpbmUJVklGX1NIQVJJTkdWSU9MQVRJT04JMHgwMDAwMDQwMEwKKyNkZWZpbmUJVklGX0NBTk5PVENSRUFURQkweDAwMDAwODAwTAorI2RlZmluZQlWSUZfQ0FOTk9UREVMRVRFCTB4MDAwMDEwMDBMCisjZGVmaW5lCVZJRl9DQU5OT1RSRU5BTUUJMHgwMDAwMjAwMEwKKyNkZWZpbmUJVklGX0NBTk5PVERFTEVURUNVUgkweDAwMDA0MDAwTAorI2RlZmluZQlWSUZfT1VUT0ZNRU1PUlkJCTB4MDAwMDgwMDBMCisjZGVmaW5lCVZJRl9DQU5OT1RSRUFEU1JDCTB4MDAwMTAwMDBMCisjZGVmaW5lCVZJRl9DQU5OT1RSRUFERFNUCTB4MDAwMjAwMDBMCisjZGVmaW5lCVZJRl9CVUZUT1NNQUxMCQkweDAwMDQwMDAwTAorCit0eXBlZGVmIHN0cnVjdCB0YWdWU19GSVhFREZJTEVJTkZPIHsKKwlEV09SRCAgIGR3U2lnbmF0dXJlOworCURXT1JEICAgZHdTdHJ1Y1ZlcnNpb247CisJRFdPUkQgICBkd0ZpbGVWZXJzaW9uTVM7CisJRFdPUkQgICBkd0ZpbGVWZXJzaW9uTFM7CisJRFdPUkQgICBkd1Byb2R1Y3RWZXJzaW9uTVM7CisJRFdPUkQgICBkd1Byb2R1Y3RWZXJzaW9uTFM7CisJRFdPUkQgICBkd0ZpbGVGbGFnc01hc2s7CisJRFdPUkQgICBkd0ZpbGVGbGFnczsKKwlEV09SRCAgIGR3RmlsZU9TOworCURXT1JEICAgZHdGaWxlVHlwZTsKKwlEV09SRCAgIGR3RmlsZVN1YnR5cGU7CisJRFdPUkQgICBkd0ZpbGVEYXRlTVM7CisJRFdPUkQgICBkd0ZpbGVEYXRlTFM7Cit9IFZTX0ZJWEVERklMRUlORk87CisKK0RXT1JEIFdJTkFQSQorR2V0RmlsZVJlc291cmNlU2l6ZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLExQRFdPUkQgb2ZmKTsKKworRFdPUkQgV0lOQVBJCitHZXRGaWxlUmVzb3VyY2UoTFBDU1RSIGZpbGVuYW1lLFNFR1BUUiByZXN0eXBlLFNFR1BUUiByZXNpZCwKKwkJRFdPUkQgb2ZmLERXT1JEIHJlc2xlbixMUFZPSUQgZGF0YQorKTsKKworRFdPUkQgV0lOQVBJCitHZXRGaWxlVmVyc2lvbkluZm9TaXplKExQQ1NUUiBmaWxlbmFtZSxMUERXT1JEIGhhbmRsZSk7CisKK0RXT1JEIFdJTkFQSQorR2V0RmlsZVZlcnNpb25JbmZvKExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsTFBWT0lEIGRhdGEpOworCitEV09SRCBXSU5BUEkKK1ZlckZpbmRGaWxlKAorCVVJTlQgZmxhZ3MsTFBDU1RSIGZpbGVuYW1lLExQQ1NUUiB3aW5kaXIsTFBDU1RSIGFwcGRpciwKKwlMUFNUUiBjdXJkaXIsVUlOVCAqY3VyZGlybGVuLExQU1RSIGRlc3RkaXIsVUlOVCpkZXN0ZGlybGVuCispOworCitEV09SRCBXSU5BUEkKK1Zlckluc3RhbGxGaWxlKAorCVVJTlQgZmxhZ3MsTFBDU1RSIHNyY2ZpbGVuYW1lLExQQ1NUUiBkZXN0ZmlsZW5hbWUsTFBDU1RSIHNyY2RpciwKKwlMUENTVFIgZGVzdGRpcixMUFNUUiB0bXBmaWxlLFVJTlQqdG1wZmlsZWxlbgorKTsKKworRFdPUkQgV0lOQVBJCitWZXJMYW5ndWFnZU5hbWUoVUlOVCBsYW5nLExQU1RSIGxhbmduYW1lLFVJTlQgbGFuZ25hbWVsZW4pOworCitEV09SRCBXSU5BUEkKK1ZlclF1ZXJ5VmFsdWUoU0VHUFRSIGJsb2NrLExQQ1NUUiBzdWJibG9jayxTRUdQVFIgKmJ1ZmZlcixVSU5UICpidWZsZW4pOworCisvKgorICAgMjAgR0VURklMRVZFUlNJT05JTkZPUkFXCisgICAyMSBWRVJGVEhLX1RIVU5LREFUQTE2CisgICAyMiBWRVJUSEtTTF9USFVOS0RBVEExNgorKi8KKworI2VuZGlmCS8qIF9fV0lORV9WRVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW4uaCBiL2luY2x1ZGUvd2luLmgKaW5kZXggYTRlY2YxYi4uOTczODg4MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW4uaAorKysgYi9pbmNsdWRlL3dpbi5oCkBAIC0yOSwzNSArMjksMzUgQEAKIAogdHlwZWRlZiBzdHJ1Y3QgdGFnV05ECiB7Ci0gICAgc3RydWN0IHRhZ1dORCAqbmV4dDsgICAgICAgICAvKiBOZXh0IHNpYmxpbmcgKi8KLSAgICBzdHJ1Y3QgdGFnV05EICpjaGlsZDsgICAgICAgIC8qIEZpcnN0IGNoaWxkICovCi0gICAgc3RydWN0IHRhZ1dORCAqcGFyZW50OyAgICAgICAvKiBXaW5kb3cgcGFyZW50IChmcm9tIENyZWF0ZVdpbmRvdykgKi8KLSAgICBzdHJ1Y3QgdGFnV05EICpvd25lcjsgICAgICAgIC8qIFdpbmRvdyBvd25lciAqLwotICAgIERXT1JEICAgICAgICBkd01hZ2ljOyAgICAgICAgLyogTWFnaWMgbnVtYmVyIChtdXN0IGJlIFdORF9NQUdJQykgKi8KLSAgICBIV05EICAgICAgICAgaHduZFNlbGY7ICAgICAgIC8qIEhhbmRsZSBvZiB0aGlzIHdpbmRvdyAqLwotICAgIEhDTEFTUyAgICAgICBoQ2xhc3M7ICAgICAgICAgLyogV2luZG93IGNsYXNzICovCi0gICAgSEFORExFICAgICAgIGhJbnN0YW5jZTsgICAgICAvKiBXaW5kb3cgaEluc3RhbmNlIChmcm9tIENyZWF0ZVdpbmRvdykgKi8KLSAgICBSRUNUICAgICAgICAgcmVjdENsaWVudDsgICAgIC8qIENsaWVudCBhcmVhIHJlbC4gdG8gcGFyZW50IGNsaWVudCBhcmVhICovCi0gICAgUkVDVCAgICAgICAgIHJlY3RXaW5kb3c7ICAgICAvKiBXaG9sZSB3aW5kb3cgcmVsLiB0byBwYXJlbnQgY2xpZW50IGFyZWEgKi8KLSAgICBSRUNUICAgICAgICAgcmVjdE5vcm1hbDsgICAgIC8qIFdpbmRvdyByZWN0LiB3aGVuIGluIG5vcm1hbCBzdGF0ZSAqLwotICAgIFBPSU5UICAgICAgICBwdEljb25Qb3M7ICAgICAgLyogSWNvbiBwb3NpdGlvbiAqLwotICAgIFBPSU5UICAgICAgICBwdE1heFBvczsgICAgICAgLyogTWF4aW1pemVkIHdpbmRvdyBwb3NpdGlvbiAqLwotICAgIEhHTE9CQUwgICAgICBobWVtVGFza1E7ICAgICAgLyogVGFzayBxdWV1ZSBnbG9iYWwgbWVtb3J5IGhhbmRsZSAqLwotICAgIEhSR04gICAgICAgICBocmduVXBkYXRlOyAgICAgLyogVXBkYXRlIHJlZ2lvbiAqLwotICAgIEhXTkQgICAgICAgICBod25kTGFzdEFjdGl2ZTsgLyogTGFzdCBhY3RpdmUgcG9wdXAgaHduZCAqLwotICAgIFdORFBST0MgICAgICBscGZuV25kUHJvYzsgICAgLyogV2luZG93IHByb2NlZHVyZSAqLwotICAgIERXT1JEICAgICAgICBkd1N0eWxlOyAgICAgICAgLyogV2luZG93IHN0eWxlIChmcm9tIENyZWF0ZVdpbmRvdykgKi8KLSAgICBEV09SRCAgICAgICAgZHdFeFN0eWxlOyAgICAgIC8qIEV4dGVuZGVkIHN0eWxlIChmcm9tIENyZWF0ZVdpbmRvd0V4KSAqLwotICAgIEhBTkRMRSAgICAgICBoZGNlOyAgICAgICAgICAgLyogV2luZG93IERDRSAoaWYgQ1NfT1dOREMgb3IgQ1NfQ0xBU1NEQykgKi8KLSAgICBIQU5ETEUgICAgICAgaFZTY3JvbGw7ICAgICAgIC8qIFZlcnRpY2FsIHNjcm9sbC1iYXIgaW5mbyAqLwotICAgIEhBTkRMRSAgICAgICBoSFNjcm9sbDsgICAgICAgLyogSG9yaXpvbnRhbCBzY3JvbGwtYmFyIGluZm8gKi8KLSAgICBVSU5UICAgICAgICAgd0lEbWVudTsgICAgICAgIC8qIElEIG9yIGhtZW51IChmcm9tIENyZWF0ZVdpbmRvdykgKi8KLSAgICBIQU5ETEUgICAgICAgaFRleHQ7ICAgICAgICAgIC8qIEhhbmRsZSBvZiB3aW5kb3cgdGV4dCAqLwotICAgIFdPUkQgICAgICAgICBmbGFnczsgICAgICAgICAgLyogTWlzYy4gZmxhZ3MgKHNlZSBiZWxvdykgKi8KLSAgICBXaW5kb3cgICAgICAgd2luZG93OyAgICAgICAgIC8qIFggd2luZG93IChvbmx5IGZvciB0b3AtbGV2ZWwgd2luZG93cykgKi8KLSAgICBITUVOVSAgICAgICAgaFN5c01lbnU7CSAvKiB3aW5kb3cncyBjb3B5IG9mIFN5c3RlbSBNZW51ICovCi0gICAgSEFORExFICAgICAgIGhQcm9wOyAgICAgICAgICAvKiBIYW5kbGUgb2YgUHJvcGVydGllcyBMaXN0ICovCi0gICAgV09SRCAgICAgICAgIHdFeHRyYVsxXTsgICAgICAvKiBXaW5kb3cgZXh0cmEgYnl0ZXMgKi8KKyAgICBzdHJ1Y3QgdGFnV05EICpuZXh0OyAgICAgICAgICAvKiBOZXh0IHNpYmxpbmcgKi8KKyAgICBzdHJ1Y3QgdGFnV05EICpjaGlsZDsgICAgICAgICAvKiBGaXJzdCBjaGlsZCAqLworICAgIHN0cnVjdCB0YWdXTkQgKnBhcmVudDsgICAgICAgIC8qIFdpbmRvdyBwYXJlbnQgKGZyb20gQ3JlYXRlV2luZG93KSAqLworICAgIHN0cnVjdCB0YWdXTkQgKm93bmVyOyAgICAgICAgIC8qIFdpbmRvdyBvd25lciAqLworICAgIENMQVNTICAgICAgICAgKmNsYXNzOyAgICAgICAgIC8qIFdpbmRvdyBjbGFzcyAqLworICAgIERXT1JEICAgICAgICAgIGR3TWFnaWM7ICAgICAgIC8qIE1hZ2ljIG51bWJlciAobXVzdCBiZSBXTkRfTUFHSUMpICovCisgICAgSFdORCAgICAgICAgICAgaHduZFNlbGY7ICAgICAgLyogSGFuZGxlIG9mIHRoaXMgd2luZG93ICovCisgICAgSEFORExFICAgICAgICAgaEluc3RhbmNlOyAgICAgLyogV2luZG93IGhJbnN0YW5jZSAoZnJvbSBDcmVhdGVXaW5kb3cpICovCisgICAgUkVDVCAgICAgICAgICAgcmVjdENsaWVudDsgICAgLyogQ2xpZW50IGFyZWEgcmVsLiB0byBwYXJlbnQgY2xpZW50IGFyZWEgKi8KKyAgICBSRUNUICAgICAgICAgICByZWN0V2luZG93OyAgICAvKiBXaG9sZSB3aW5kb3cgcmVsLiB0byBwYXJlbnQgY2xpZW50IGFyZWEgKi8KKyAgICBSRUNUICAgICAgICAgICByZWN0Tm9ybWFsOyAgICAvKiBXaW5kb3cgcmVjdC4gd2hlbiBpbiBub3JtYWwgc3RhdGUgKi8KKyAgICBQT0lOVCAgICAgICAgICBwdEljb25Qb3M7ICAgICAvKiBJY29uIHBvc2l0aW9uICovCisgICAgUE9JTlQgICAgICAgICAgcHRNYXhQb3M7ICAgICAgLyogTWF4aW1pemVkIHdpbmRvdyBwb3NpdGlvbiAqLworICAgIEhHTE9CQUwgICAgICAgIGhtZW1UYXNrUTsgICAgIC8qIFRhc2sgcXVldWUgZ2xvYmFsIG1lbW9yeSBoYW5kbGUgKi8KKyAgICBIUkdOICAgICAgICAgICBocmduVXBkYXRlOyAgICAvKiBVcGRhdGUgcmVnaW9uICovCisgICAgSFdORCAgICAgICAgICAgaHduZExhc3RBY3RpdmU7LyogTGFzdCBhY3RpdmUgcG9wdXAgaHduZCAqLworICAgIFdORFBST0MgICAgICAgIGxwZm5XbmRQcm9jOyAgIC8qIFdpbmRvdyBwcm9jZWR1cmUgKi8KKyAgICBEV09SRCAgICAgICAgICBkd1N0eWxlOyAgICAgICAvKiBXaW5kb3cgc3R5bGUgKGZyb20gQ3JlYXRlV2luZG93KSAqLworICAgIERXT1JEICAgICAgICAgIGR3RXhTdHlsZTsgICAgIC8qIEV4dGVuZGVkIHN0eWxlIChmcm9tIENyZWF0ZVdpbmRvd0V4KSAqLworICAgIEhBTkRMRSAgICAgICAgIGhkY2U7ICAgICAgICAgIC8qIFdpbmRvdyBEQ0UgKGlmIENTX09XTkRDIG9yIENTX0NMQVNTREMpICovCisgICAgSEFORExFICAgICAgICAgaFZTY3JvbGw7ICAgICAgLyogVmVydGljYWwgc2Nyb2xsLWJhciBpbmZvICovCisgICAgSEFORExFICAgICAgICAgaEhTY3JvbGw7ICAgICAgLyogSG9yaXpvbnRhbCBzY3JvbGwtYmFyIGluZm8gKi8KKyAgICBVSU5UICAgICAgICAgICB3SURtZW51OyAgICAgICAvKiBJRCBvciBobWVudSAoZnJvbSBDcmVhdGVXaW5kb3cpICovCisgICAgSEFORExFICAgICAgICAgaFRleHQ7ICAgICAgICAgLyogSGFuZGxlIG9mIHdpbmRvdyB0ZXh0ICovCisgICAgV09SRCAgICAgICAgICAgZmxhZ3M7ICAgICAgICAgLyogTWlzYy4gZmxhZ3MgKHNlZSBiZWxvdykgKi8KKyAgICBXaW5kb3cgICAgICAgICB3aW5kb3c7ICAgICAgICAvKiBYIHdpbmRvdyAob25seSBmb3IgdG9wLWxldmVsIHdpbmRvd3MpICovCisgICAgSE1FTlUgICAgICAgICAgaFN5c01lbnU7ICAgICAgLyogd2luZG93J3MgY29weSBvZiBTeXN0ZW0gTWVudSAqLworICAgIEhBTkRMRSAgICAgICAgIGhQcm9wOyAgICAgICAgIC8qIEhhbmRsZSBvZiBQcm9wZXJ0aWVzIExpc3QgKi8KKyAgICBXT1JEICAgICAgICAgICB3RXh0cmFbMV07ICAgICAvKiBXaW5kb3cgZXh0cmEgYnl0ZXMgKi8KIH0gV05EOwogCiAgIC8qIFdORCBmbGFncyB2YWx1ZXMgKi8KQEAgLTcxLDkgKzcxLDYgQEAKICNkZWZpbmUgV0lOX05DQUNUSVZBVEVEICAgICAgICAweDAwODAgLyogbGFzdCBXTV9OQ0FDVElWQVRFIHdhcyBwb3NpdGl2ZSAqLwogI2RlZmluZSBXSU5fTUFOQUdFRCAgICAgICAgICAgIDB4MDEwMCAvKiBXaW5kb3cgbWFuYWdlZCBieSB0aGUgWCB3bSAqLwogCi0jZGVmaW5lIFdJTl9DTEFTU19JTkZPKHduZFB0cikgICAoQ0xBU1NfRmluZENsYXNzUHRyKCh3bmRQdHIpLT5oQ2xhc3MpLT53YykKLSNkZWZpbmUgV0lOX0NMQVNTX1NUWUxFKHduZFB0cikgIChXSU5fQ0xBU1NfSU5GTyh3bmRQdHIpLnN0eWxlKQotCiAgIC8qIFdpbmRvdyBmdW5jdGlvbnMgKi8KIGV4dGVybiBXTkQgKldJTl9GaW5kV25kUHRyKCBIV05EIGh3bmQgKTsKIGV4dGVybiBXTkQgKldJTl9HZXREZXNrdG9wKHZvaWQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5iYXNlLmggYi9pbmNsdWRlL3dpbmJhc2UuaAppbmRleCA2NmQ4ZTFhLi5lOTEzNDA3IDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmJhc2UuaAorKysgYi9pbmNsdWRlL3dpbmJhc2UuaApAQCAtMTAyLDYgKzEwMiwxNSBAQAogICBpbnQgc3M7CiB9IGV4Y2VwdGlvbl9pbmZvOwogCisvKiBDb3VsZCB0aGlzIHR5cGUgYmUgY29uc2lkZXJlZCBvcGFxdWU/ICovCit0eXBlZGVmIHN0cnVjdCB7CisJTFBWT0lECURlYnVnSW5mbzsKKwlMT05HIExvY2tDb3VudDsKKwlMT05HIFJlY3Vyc2lvbkNvdW50OworCUhBTkRMRSBPd25pbmdUaHJlYWQ7CisJSEFORExFIExvY2tTZW1hcGhvcmU7CisJRFdPUkQgUmVzZXJ2ZWQ7Cit9Q1JJVElDQUxfU0VDVElPTjsKIAogLypEV09SRCBXSU5BUEkgR2V0VmVyc2lvbiggdm9pZCApOyovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2luZG93cy5oIGIvaW5jbHVkZS93aW5kb3dzLmgKaW5kZXggNWFkMTZmYi4uM2EwZmY3OCAxMDA2NDQKLS0tIGEvaW5jbHVkZS93aW5kb3dzLmgKKysrIGIvaW5jbHVkZS93aW5kb3dzLmgKQEAgLTEzNzEsNiArMTM3MSw3IEBACiAjZGVmaW5lIE9CTV9GTE9QUFkgICAgICAgICAgMzI3MzEKICNkZWZpbmUgT0JNX0hESVNLICAgICAgICAgICAzMjczMAogI2RlZmluZSBPQk1fQ0RST00gICAgICAgICAgIDMyNzI5CisjZGVmaW5lIE9CTV9UUlRZUEUgICAgICAgICAgMzI3MjgKIAogI2RlZmluZSBPQk1fT0xEX0NMT1NFICAgICAgIDMyNzY3CiAjZGVmaW5lIE9CTV9TSVpFICAgICAgICAgICAgMzI3NjYKQEAgLTI4MTEsNyArMjgxMiw3IEBACiBCT09MICAgICAgIEV4aXRXaW5kb3dzKERXT1JELFdPUkQpOwogQk9PTCAgICAgICBFeHRGbG9vZEZpbGwoSERDLElOVCxJTlQsQ09MT1JSRUYsV09SRCk7CiBCT09MICAgICAgIEV4dFRleHRPdXQoSERDLHNob3J0LHNob3J0LFdPUkQsTFBSRUNULExQU1RSLFdPUkQsTFBJTlQpOwotSElDT04gICAgICBFeHRyYWN0SWNvbihISU5TVEFOQ0UsTFBDU1RSLFVJTlQpOworSElDT04gICAgICBFeHRyYWN0SWNvbihISU5TVEFOQ0UsTFBDU1RSLFdPUkQpOwogV09SRCAgICAgICBGYXJHZXRPd25lcihIQU5ETEUpOwogdm9pZCAgICAgICBGYXJTZXRPd25lcihIQU5ETEUsSEFORExFKTsKIHZvaWQgICAgICAgRmF0YWxBcHBFeGl0KFVJTlQsTFBDU1RSKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludHlwZXMuaCBiL2luY2x1ZGUvd2ludHlwZXMuaAppbmRleCA5NDMwZjU2Li5hZmNlMjYyIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbnR5cGVzLmgKKysrIGIvaW5jbHVkZS93aW50eXBlcy5oCkBAIC0xOSw2ICsxOSwxMSBAQAogIyBlbmRpZgogI2VuZGlmCiAKK3R5cGVkZWYgc2hvcnQgSU5UMTY7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFVJTlQxNjsKK3R5cGVkZWYgaW50IElOVDMyOwordHlwZWRlZiB1bnNpZ25lZCBpbnQgVUlOVDMyOworCiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IFdPUkQ7CiB0eXBlZGVmIHVuc2lnbmVkIGxvbmcgRFdPUkQ7CiB0eXBlZGVmIHVuc2lnbmVkIHNob3J0IEJPT0w7CkBAIC00Miw4ICs0Nyw5IEBACiB0eXBlZGVmIERXT1JEIFNFR1BUUjsKICNlbmRpZiAgLyogV0lORUxJQjMyICovCiAKK3R5cGVkZWYgVUlOVDE2IEhBTkRMRTE2OwordHlwZWRlZiBVSU5UMzIgSEFORExFMzI7CiB0eXBlZGVmIFVJTlQgSEFORExFOwotdHlwZWRlZiBEV09SRCBIQU5ETEUzMjsKIHR5cGVkZWYgVUlOVCBXUEFSQU07CiB0eXBlZGVmIExPTkcgTFBBUkFNOwogdHlwZWRlZiBMT05HIExSRVNVTFQ7CkBAIC02OSw3ICs3NSwxMCBAQAogdHlwZWRlZiBEV09SRCBBQ0NFU1NfTUFTSzsKIHR5cGVkZWYgQUNDRVNTX01BU0sgUkVHU0FNOwogCi0jZGVmaW5lIERFQ0xBUkVfSEFORExFKGEpIHR5cGVkZWYgSEFORExFIGE7CisjZGVmaW5lIERFQ0xBUkVfSEFORExFKGEpIFwKKyAgICB0eXBlZGVmIEhBTkRMRSBhOyBcCisgICAgdHlwZWRlZiBIQU5ETEUxNiBhIyMxNjsgXAorICAgIHR5cGVkZWYgSEFORExFMzIgYSMjMzI7CiAKIERFQ0xBUkVfSEFORExFKEhCSVRNQVApOwogREVDTEFSRV9IQU5ETEUoSEJSVVNIKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvd2ludXNlci5oIGIvaW5jbHVkZS93aW51c2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlMjc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvd2ludXNlci5oCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBVU0VSIGRlZmluaXRpb25zCisgKgorICogQ29weXJpZ2h0IDE5OTYgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2lmbmRlZiBfX1dJTkVfV0lOVVNFUl9ICisjZGVmaW5lIF9fV0lORV9XSU5VU0VSX0gKKworI2luY2x1ZGUgIndpbnR5cGVzLmgiCisKKworLyogV2luZG93IGNsYXNzZXMgKi8KKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBVSU5UMzIgICAgICBzdHlsZTsKKyAgICBXTkRQUk9DMzIgICBscGZuV25kUHJvYzsKKyAgICBJTlQzMiAgICAgICBjYkNsc0V4dHJhOworICAgIElOVDMyICAgICAgIGNiV25kRXh0cmE7CisgICAgSElOU1RBTkNFMzIgaEluc3RhbmNlOworICAgIEhJQ09OMzIgICAgIGhJY29uOworICAgIEhDVVJTT1IzMiAgIGhDdXJzb3I7CisgICAgSEJSVVNIMzIgICAgaGJyQmFja2dyb3VuZDsKKyAgICBMUENTVFIgICAgICBscHN6TWVudU5hbWU7CisgICAgTFBDU1RSICAgICAgbHBzekNsYXNzTmFtZTsKK30gV05EQ0xBU1MzMkEsICpMUFdORENMQVNTMzJBOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIFVJTlQzMiAgICAgIHN0eWxlOworICAgIFdORFBST0MzMiAgIGxwZm5XbmRQcm9jOworICAgIElOVDMyICAgICAgIGNiQ2xzRXh0cmE7CisgICAgSU5UMzIgICAgICAgY2JXbmRFeHRyYTsKKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2U7CisgICAgSElDT04zMiAgICAgaEljb247CisgICAgSENVUlNPUjMyICAgaEN1cnNvcjsKKyAgICBIQlJVU0gzMiAgICBoYnJCYWNrZ3JvdW5kOworICAgIExQQ1dTVFIgICAgIGxwc3pNZW51TmFtZTsKKyAgICBMUENXU1RSICAgICBscHN6Q2xhc3NOYW1lOworfSBXTkRDTEFTUzMyVywgKkxQV05EQ0xBU1MzMlc7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDE2ICAgICAgc3R5bGU7CisgICAgV05EUFJPQyAgICAgbHBmblduZFByb2MgV0lORV9QQUNLRUQ7CisgICAgSU5UMTYgICAgICAgY2JDbHNFeHRyYTsKKyAgICBJTlQxNiAgICAgICBjYlduZEV4dHJhOworICAgIEhBTkRMRTE2ICAgIGhJbnN0YW5jZTsKKyAgICBISUNPTjE2ICAgICBoSWNvbjsKKyAgICBIQ1VSU09SMTYgICBoQ3Vyc29yOworICAgIEhCUlVTSDE2ICAgIGhickJhY2tncm91bmQ7CisgICAgU0VHUFRSICAgICAgbHBzek1lbnVOYW1lIFdJTkVfUEFDS0VEOworICAgIFNFR1BUUiAgICAgIGxwc3pDbGFzc05hbWUgV0lORV9QQUNLRUQ7Cit9IFdORENMQVNTMTYsICpMUFdORENMQVNTMTY7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyICAgICAgY2JTaXplOworICAgIFVJTlQzMiAgICAgIHN0eWxlOworICAgIFdORFBST0MzMiAgIGxwZm5XbmRQcm9jOworICAgIElOVDMyICAgICAgIGNiQ2xzRXh0cmE7CisgICAgSU5UMzIgICAgICAgY2JXbmRFeHRyYTsKKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2U7CisgICAgSElDT04zMiAgICAgaEljb247CisgICAgSENVUlNPUjMyICAgaEN1cnNvcjsKKyAgICBIQlJVU0gzMiAgICBoYnJCYWNrZ3JvdW5kOworICAgIExQQ1NUUiAgICAgIGxwc3pNZW51TmFtZTsKKyAgICBMUENTVFIgICAgICBscHN6Q2xhc3NOYW1lOworICAgIEhJQ09OMzIgICAgIGhJY29uU207Cit9IFdORENMQVNTRVgzMkEsICpMUFdORENMQVNTRVgzMkE7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgVUlOVDMyICAgICAgY2JTaXplOworICAgIFVJTlQzMiAgICAgIHN0eWxlOworICAgIFdORFBST0MzMiAgIGxwZm5XbmRQcm9jOworICAgIElOVDMyICAgICAgIGNiQ2xzRXh0cmE7CisgICAgSU5UMzIgICAgICAgY2JXbmRFeHRyYTsKKyAgICBISU5TVEFOQ0UzMiBoSW5zdGFuY2U7CisgICAgSElDT04zMiAgICAgaEljb247CisgICAgSENVUlNPUjMyICAgaEN1cnNvcjsKKyAgICBIQlJVU0gzMiAgICBoYnJCYWNrZ3JvdW5kOworICAgIExQQ1dTVFIgICAgIGxwc3pNZW51TmFtZTsKKyAgICBMUENXU1RSICAgICBscHN6Q2xhc3NOYW1lOworICAgIEhJQ09OMzIgICAgIGhJY29uU207Cit9IFdORENMQVNTRVgzMlcsICpMUFdORENMQVNTRVgzMlc7CisKK3R5cGVkZWYgdm9pZCBXTkRDTEFTU0VYMTY7ICAvKiBUaGVyZSdzIG5vIFdORENMQVNTRVggaW4gV2luMTYgKi8KKworREVDTF9XSU5FTElCX1RZUEVfQVcoV05EQ0xBU1MpOworREVDTF9XSU5FTElCX1RZUEVfQVcoTFBXTkRDTEFTUyk7CitERUNMX1dJTkVMSUJfVFlQRV9BVyhXTkRDTEFTU0VYKTsKK0RFQ0xfV0lORUxJQl9UWVBFX0FXKExQV05EQ0xBU1NFWCk7CisKKworI2VuZGlmICAvKiBfX1dJTkVfV0lOVVNFUl9IICovCmRpZmYgLS1naXQgYS9saWJyYXJ5L21pc2NzdHVicy5jIGIvbGlicmFyeS9taXNjc3R1YnMuYwppbmRleCA4NDZmNzAyLi40MDdkZTk2IDEwMDY0NAotLS0gYS9saWJyYXJ5L21pc2NzdHVicy5jCisrKyBiL2xpYnJhcnkvbWlzY3N0dWJzLmMKQEAgLTEyOSwxMSArMTI5LDYgQEAKICAgcmV0dXJuIDA7CiB9CiAKLXZvaWQgKlJFTEFZMzJfR2V0RW50cnlQb2ludChCVUlMVElOX0RMTCAqZGxsLCBjaGFyICppdGVtLCBpbnQgaGludCkKLXsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KIGV4dGVybiBMUkVTVUxUIEFDVElWQVRFQVBQX2NhbGxiYWNrKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKIGV4dGVybiBMUkVTVUxUIEFib3V0RGxnUHJvYyhIV05ELFVJTlQsV1BBUkFNLExQQVJBTSk7CiBleHRlcm4gTFJFU1VMVCBCdXR0b25XbmRQcm9jKEhXTkQsVUlOVCxXUEFSQU0sTFBBUkFNKTsKQEAgLTE2Niw3ICsxNjEsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2IChub3QgYSBXaW5kb3dzIEFQSSBmdW5jdGlvbikKICAqCi0gKiBSZXR1cm4gYW4gZW50cnkgcG9pbnQgZnJvbSB0aGUgV0lOUFJPQ1MgZGxsLgorICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdQUk9DUyBkbGwuCiAgKi8KIFdORFBST0MgTU9EVUxFX0dldFduZFByb2NFbnRyeTE2KCBjaGFyICpuYW1lICkKIHsKQEAgLTIwMSw3ICsxOTYsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTMyIChub3QgYSBXaW5kb3dzIEFQSSBmdW5jdGlvbikKICAqCi0gKiBSZXR1cm4gYW4gZW50cnkgcG9pbnQgZnJvbSB0aGUgV0lOUFJPQ1MzMiBkbGwuCisgKiBSZXR1cm4gYW4gZW50cnkgcG9pbnQgZnJvbSB0aGUgV1BST0NTMzIgZGxsLgogICovCiBXTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY2hhciAqbmFtZSApCiB7CmRpZmYgLS1naXQgYS9sb2FkZXIvTWFrZWZpbGUuaW4gYi9sb2FkZXIvTWFrZWZpbGUuaW4KaW5kZXggNzRkNmE3MS4uN2FlNGNmOCAxMDA2NDQKLS0tIGEvbG9hZGVyL01ha2VmaWxlLmluCisrKyBiL2xvYWRlci9NYWtlZmlsZS5pbgpAQCAtMiw2ICsyLDcgQEAKIE1PRFVMRSA9IGxvYWRlcgogCiBDX1NSQ1MgPSBcCisJYnVpbHRpbi5jIFwKIAltYWluLmMgXAogCW1vZHVsZS5jIFwKIAluZV9pbWFnZS5jIFwKZGlmZiAtLWdpdCBhL2xvYWRlci9idWlsdGluLmMgYi9sb2FkZXIvYnVpbHRpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZjA3NGQKLS0tIC9kZXYvbnVsbAorKysgYi9sb2FkZXIvYnVpbHRpbi5jCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogQnVpbHQtaW4gbW9kdWxlcworICoKKyAqIENvcHlyaWdodCAxOTk2IEFsZXhhbmRyZSBKdWxsaWFyZAorICovCisKKyNpZm5kZWYgV0lORUxJQgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZ2RpLmgiCisjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAibW9kdWxlLmgiCisjaW5jbHVkZSAibmVleGUuaCIKKyNpbmNsdWRlICJ1c2VyLmgiCisjaW5jbHVkZSAic3RkZGVidWcuaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgorCisKKy8qIEJ1aWx0LWluIG1vZHVsZXMgZGVzY3JpcHRvcnMgKi8KKy8qIERvbid0IGNoYW5nZSB0aGVzZSBzdHJ1Y3R1cmVzISAoc2VlIHRvb2xzL2J1aWxkLmMpICovCisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgY29uc3QgQllURSAqY29kZV9zdGFydDsgICAgICAgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIERMTCBjb2RlICovCisgICAgY29uc3QgQllURSAqZGF0YV9zdGFydDsgICAgICAgIC8qIDMyLWJpdCBhZGRyZXNzIG9mIERMTCBkYXRhICovCit9IFdJTjE2X0RFU0NSSVBUT1I7CisKK3R5cGVkZWYgc3RydWN0Cit7CisgICAgaW50ICAgICAgICAgICAgICAgICBiYXNlOyAgICAgIC8qIE9yZGluYWwgYmFzZSAqLworICAgIGludCAgICAgICAgICAgICAgICAgc2l6ZTsgICAgICAvKiBOdW1iZXIgb2YgZnVuY3Rpb25zICovCisgICAgY29uc3Qgdm9pZCAgICAgICAgKipmdW5jdGlvbnM7IC8qIFBvaW50ZXIgdG8gZnVuY3Rpb25zIHRhYmxlICovCisgICAgY29uc3QgY2hhciAqIGNvbnN0ICpuYW1lczsgICAgIC8qIFBvaW50ZXIgdG8gbmFtZXMgdGFibGUgKi8KK30gV0lOMzJfREVTQ1JJUFRPUjsKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBjb25zdCBjaGFyICpuYW1lOyAgICAgICAgICAgICAgLyogRExMIG5hbWUgKi8KKyAgICB2b2lkICAgICAgICptb2R1bGVfc3RhcnQ7ICAgICAgLyogMzItYml0IGFkZHJlc3Mgb2YgdGhlIG1vZHVsZSBkYXRhICovCisgICAgaW50ICAgICAgICAgbW9kdWxlX3NpemU7ICAgICAgIC8qIFNpemUgb2YgdGhlIG1vZHVsZSBkYXRhICovCisgICAgdW5pb24KKyAgICB7CisgICAgICAgIFdJTjE2X0RFU0NSSVBUT1Igd2luMTY7ICAgIC8qIERlc2NyaXB0b3IgZm9yIFdpbjE2IERMTCAqLworICAgICAgICBXSU4zMl9ERVNDUklQVE9SIHdpbjMyOyAgICAvKiBEZXNjcmlwdG9yIGZvciBXaW4zMiBETEwgKi8KKyAgICB9IHU7Cit9IERMTF9ERVNDUklQVE9SOworCit0eXBlZGVmIHN0cnVjdAoreworICAgIGNvbnN0IERMTF9ERVNDUklQVE9SICpkZXNjcjsgICAvKiBETEwgZGVzY3JpcHRvciAqLworICAgIGludCAgICAgICAgICAgICAgICAgICBmbGFnczsgICAvKiBmbGFncyAoc2VlIGJlbG93KSAqLworfSBCVUlMVElOX0RMTDsKKworCisvKiBETEwgZmxhZ3MgKi8KKyNkZWZpbmUgRExMX0ZMQUdfTk9UX1VTRUQgICAgMHgwMSAgLyogVXNlIG9yaWdpbmFsIFdpbmRvd3MgRExMIGlmIHBvc3NpYmxlICovCisjZGVmaW5lIERMTF9GTEFHX0FMV0FZU19VU0VEIDB4MDIgIC8qIEFsd2F5cyB1c2UgYnVpbHQtaW4gRExMICovCisjZGVmaW5lIERMTF9GTEFHX1dJTjMyICAgICAgIDB4MDQgIC8qIERMTCBpcyBhIFdpbjMyIERMTCAqLworCisKKy8qIDE2LWJpdCBETExzICovCisKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBLRVJORUxfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBVU0VSX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgR0RJX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgV0lOODdFTV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE1NU1lTVEVNX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgU0hFTExfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBTT1VORF9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIEtFWUJPQVJEX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgV0lOU09DS19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNUUkVTU19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNZU1RFTV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFRPT0xIRUxQX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgTU9VU0VfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBDT01NRExHX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTJDT05WX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFMkRJU1BfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBPTEUyTkxTX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgT0xFMlBST1hfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBPTEVDTElfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBPTEVTVlJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBDT01QT0JKX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgU1RPUkFHRV9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFdQUk9DU19EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIERERU1MX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgTFpFWFBBTkRfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBWRVJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBXMzJTWVNfRGVzY3JpcHRvcjsKKworLyogMzItYml0IERMTHMgKi8KKworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIEFEVkFQSTMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgQ09NQ1RMMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBDT01ETEczMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIE9MRTMyX0Rlc2NyaXB0b3I7CitleHRlcm4gY29uc3QgRExMX0RFU0NSSVBUT1IgR0RJMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBLRVJORUwzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFNIRUxMMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBVU0VSMzJfRGVzY3JpcHRvcjsKK2V4dGVybiBjb25zdCBETExfREVTQ1JJUFRPUiBXUFJPQ1MzMl9EZXNjcmlwdG9yOworZXh0ZXJuIGNvbnN0IERMTF9ERVNDUklQVE9SIFdJTlNQT09MX0Rlc2NyaXB0b3I7CisKKy8qIFRhYmxlIG9mIGFsbCBidWlsdC1pbiBETExzICovCisKK3N0YXRpYyBCVUlMVElOX0RMTCBCdWlsdGluRExMc1tdID0KK3sKKyAgICAvKiBXaW4xNiBETExzICovCisgICAgeyAmS0VSTkVMX0Rlc2NyaXB0b3IsICAgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKKyAgICB7ICZVU0VSX0Rlc2NyaXB0b3IsICAgICBETExfRkxBR19BTFdBWVNfVVNFRCB9LAorICAgIHsgJkdESV9EZXNjcmlwdG9yLCAgICAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCisgICAgeyAmV0lOODdFTV9EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZTSEVMTF9EZXNjcmlwdG9yLCAgICAwIH0sCisgICAgeyAmU09VTkRfRGVzY3JpcHRvciwgICAgMCB9LAorICAgIHsgJktFWUJPQVJEX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZXSU5TT0NLX0Rlc2NyaXB0b3IsICAwIH0sCisgICAgeyAmU1RSRVNTX0Rlc2NyaXB0b3IsICAgMCB9LAorICAgIHsgJk1NU1lTVEVNX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZTWVNURU1fRGVzY3JpcHRvciwgICAwIH0sCisgICAgeyAmVE9PTEhFTFBfRGVzY3JpcHRvciwgMCB9LAorICAgIHsgJk1PVVNFX0Rlc2NyaXB0b3IsICAgIDAgfSwKKyAgICB7ICZDT01NRExHX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJk9MRTJfRGVzY3JpcHRvciwgICAgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmT0xFMkNPTlZfRGVzY3JpcHRvciwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZPTEUyRElTUF9EZXNjcmlwdG9yLCBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJk9MRTJOTFNfRGVzY3JpcHRvciwgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmT0xFMlBST1hfRGVzY3JpcHRvciwgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZPTEVDTElfRGVzY3JpcHRvciwgICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJk9MRVNWUl9EZXNjcmlwdG9yLCAgIERMTF9GTEFHX05PVF9VU0VEIH0sCisgICAgeyAmQ09NUE9CSl9EZXNjcmlwdG9yLCAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZTVE9SQUdFX0Rlc2NyaXB0b3IsICBETExfRkxBR19OT1RfVVNFRCB9LAorICAgIHsgJldQUk9DU19EZXNjcmlwdG9yLCAgIERMTF9GTEFHX0FMV0FZU19VU0VEIH0sCisgICAgeyAmRERFTUxfRGVzY3JpcHRvciwgICAgRExMX0ZMQUdfTk9UX1VTRUQgfSwKKyAgICB7ICZMWkVYUEFORF9EZXNjcmlwdG9yLCAwIH0sCisgICAgeyAmVkVSX0Rlc2NyaXB0b3IsICAgICAgMCB9LAorICAgIHsgJlczMlNZU19EZXNjcmlwdG9yLCAgIDAgfSwKKyAgICAvKiBXaW4zMiBETExzICovCisgICAgeyAmQURWQVBJMzJfRGVzY3JpcHRvciwgMCB9LAorICAgIHsgJkNPTUNUTDMyX0Rlc2NyaXB0b3IsIDAgfSwKKyAgICB7ICZDT01ETEczMl9EZXNjcmlwdG9yLCAwIH0sCisgICAgeyAmT0xFMzJfRGVzY3JpcHRvciwgICAgMCB9LAorICAgIHsgJkdESTMyX0Rlc2NyaXB0b3IsICAgIDAgfSwKKyAgICB7ICZLRVJORUwzMl9EZXNjcmlwdG9yLCBETExfRkxBR19BTFdBWVNfVVNFRCB9LAorICAgIHsgJlNIRUxMMzJfRGVzY3JpcHRvciwgIDAgfSwKKyAgICB7ICZVU0VSMzJfRGVzY3JpcHRvciwgICAwIH0sCisgICAgeyAmV1BST0NTMzJfRGVzY3JpcHRvciwgRExMX0ZMQUdfQUxXQVlTX1VTRUQgfSwKKyAgICB7ICZXSU5TUE9PTF9EZXNjcmlwdG9yLCAwIH0sCisgICAgLyogTGFzdCBlbnRyeSAqLworICAgIHsgTlVMTCwgMCB9Cit9OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU5fSW5pdAorICoKKyAqIExvYWQgYWxsIGJ1aWx0LWluIG1vZHVsZXMgbWFya2VkIGFzICdhbHdheXMgdXNlZCcuCisgKi8KK0JPT0wgQlVJTFRJTl9Jbml0KHZvaWQpCit7CisgICAgQlVJTFRJTl9ETEwgKmRsbDsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisKKyAgICBmb3IgKGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKKyAgICAgICAgaWYgKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19BTFdBWVNfVVNFRCkKKyAgICAgICAgICAgIGlmICghQlVJTFRJTl9Mb2FkTW9kdWxlKGRsbC0+ZGVzY3ItPm5hbWUsIFRSVUUpKSByZXR1cm4gRkFMU0U7CisKKyAgICAvKiBJbml0aWFsaXplIEtFUk5FTC4xNzggKF9fV0lORkxBR1MpIHdpdGggdGhlIGNvcnJlY3QgZmxhZ3MgdmFsdWUgKi8KKworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoICJLRVJORUwiICksIDE3OCwgR2V0V2luRmxhZ3MoKSApOworCisgICAgLyogU2V0IHRoZSBVU0VSIGFuZCBHREkgaGVhcCBzZWxlY3RvcnMgKi8KKworICAgIHBNb2R1bGUgICAgICA9IE1PRFVMRV9HZXRQdHIoIEdldE1vZHVsZUhhbmRsZSggIlVTRVIiICkpOworICAgIFVTRVJfSGVhcFNlbCA9IChORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDEpLT5zZWxlY3RvcjsKKyAgICBwTW9kdWxlICAgICAgPSBNT0RVTEVfR2V0UHRyKCBHZXRNb2R1bGVIYW5kbGUoICJHREkiICkpOworICAgIEdESV9IZWFwU2VsICA9IChORV9TRUdfVEFCTEUoIHBNb2R1bGUgKSArIHBNb2R1bGUtPmRncm91cCAtIDEpLT5zZWxlY3RvcjsKKworICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU5fTG9hZE1vZHVsZQorICoKKyAqIExvYWQgYSBidWlsdC1pbiBtb2R1bGUuIElmIHRoZSAnZm9yY2UnIHBhcmFtZXRlciBpcyBGQUxTRSwgd2Ugb25seQorICogbG9hZCB0aGUgbW9kdWxlIGlmIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZCB2aWEgdGhlIC1kbGwgb3B0aW9uLgorICovCitITU9EVUxFIEJVSUxUSU5fTG9hZE1vZHVsZSggTFBDU1RSIG5hbWUsIEJPT0wgZm9yY2UgKQoreworICAgIEhNT0RVTEUgaE1vZHVsZTsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisgICAgQlVJTFRJTl9ETEwgKnRhYmxlOworICAgIGNoYXIgZGxsbmFtZVsxNl0sICpwOworCisgICAgLyogRml4IHRoZSBuYW1lIGluIGNhc2Ugd2UgaGF2ZSBhIGZ1bGwgcGF0aCBhbmQgZXh0ZW5zaW9uICovCisKKyAgICBpZiAoKHAgPSBzdHJyY2hyKCBuYW1lLCAnXFwnICkpKSBuYW1lID0gcCArIDE7CisgICAgbHN0cmNweW4oIGRsbG5hbWUsIG5hbWUsIHNpemVvZihkbGxuYW1lKSApOworICAgIGlmICgocCA9IHN0cnJjaHIoIGRsbG5hbWUsICcuJyApKSkgKnAgPSAnXDAnOworCisgICAgZm9yICh0YWJsZSA9IEJ1aWx0aW5ETExzOyB0YWJsZS0+ZGVzY3I7IHRhYmxlKyspCisgICAgICAgIGlmICghbHN0cmNtcGkoIHRhYmxlLT5kZXNjci0+bmFtZSwgZGxsbmFtZSApKSBicmVhazsKKyAgICBpZiAoIXRhYmxlLT5kZXNjcikgcmV0dXJuIDA7CisgICAgaWYgKCh0YWJsZS0+ZmxhZ3MgJiBETExfRkxBR19OT1RfVVNFRCkgJiYgIWZvcmNlKSByZXR1cm4gMDsKKworICAgIGhNb2R1bGUgPSBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fTU9WRUFCTEUsIHRhYmxlLT5kZXNjci0+bW9kdWxlX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5kZXNjci0+bW9kdWxlX3NpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApOworICAgIGlmICghaE1vZHVsZSkgcmV0dXJuIDA7CisgICAgRmFyU2V0T3duZXIoIGhNb2R1bGUsIGhNb2R1bGUgKTsKKworICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJCdWlsdC1pbiAlczogaG1vZHVsZT0lMDR4XG4iLAorICAgICAgICAgICAgICAgICAgICB0YWJsZS0+ZGVzY3ItPm5hbWUsIGhNb2R1bGUgKTsKKyAgICBwTW9kdWxlID0gKE5FX01PRFVMRSAqKUdsb2JhbExvY2soIGhNb2R1bGUgKTsKKyAgICBwTW9kdWxlLT5zZWxmID0gaE1vZHVsZTsKKworICAgIGlmIChwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikKKyAgICB7CisgICAgICAgIHBNb2R1bGUtPnBlX21vZHVsZSA9IChQRV9NT0RVTEUgKil0YWJsZTsKKyAgICB9CisgICAgZWxzZSAgLyogV2luMTYgbW9kdWxlICovCisgICAgeworICAgICAgICBjb25zdCBXSU4xNl9ERVNDUklQVE9SICpkZXNjciA9ICZ0YWJsZS0+ZGVzY3ItPnUud2luMTY7CisgICAgICAgIGludCBtaW5zaXplOworCisgICAgICAgIC8qIEFsbG9jYXRlIHRoZSBjb2RlIHNlZ21lbnQgKi8KKworICAgICAgICBTRUdUQUJMRUVOVFJZICpwU2VnVGFibGUgPSBORV9TRUdfVEFCTEUoIHBNb2R1bGUgKTsKKyAgICAgICAgcFNlZ1RhYmxlLT5zZWxlY3RvciA9IEdMT0JBTF9DcmVhdGVCbG9jayhHTUVNX0ZJWEVELCBkZXNjci0+Y29kZV9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2VnVGFibGUtPm1pbnNpemUsIGhNb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSwgVFJVRSwgRkFMU0UsIE5VTEwgKTsKKyAgICAgICAgaWYgKCFwU2VnVGFibGUtPnNlbGVjdG9yKSByZXR1cm4gMDsKKyAgICAgICAgcFNlZ1RhYmxlKys7CisKKyAgICAgICAgLyogQWxsb2NhdGUgdGhlIGRhdGEgc2VnbWVudCAqLworCisgICAgICAgIG1pbnNpemUgPSBwU2VnVGFibGUtPm1pbnNpemUgPyBwU2VnVGFibGUtPm1pbnNpemUgOiAweDEwMDAwOworICAgICAgICBtaW5zaXplICs9IHBNb2R1bGUtPmhlYXBfc2l6ZTsKKyAgICAgICAgaWYgKG1pbnNpemUgPiAweDEwMDAwKSBtaW5zaXplID0gMHgxMDAwMDsKKyAgICAgICAgcFNlZ1RhYmxlLT5zZWxlY3RvciA9IEdMT0JBTF9BbGxvYyggR01FTV9GSVhFRCwgbWluc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSApOworICAgICAgICBpZiAoIXBTZWdUYWJsZS0+c2VsZWN0b3IpIHJldHVybiAwOworICAgICAgICBpZiAocFNlZ1RhYmxlLT5taW5zaXplKSBtZW1jcHkoIEdsb2JhbExvY2soIHBTZWdUYWJsZS0+c2VsZWN0b3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjci0+ZGF0YV9zdGFydCwgcFNlZ1RhYmxlLT5taW5zaXplKTsKKyAgICAgICAgaWYgKHBNb2R1bGUtPmhlYXBfc2l6ZSkKKyAgICAgICAgICAgIExvY2FsSW5pdCggcFNlZ1RhYmxlLT5zZWxlY3RvciwgcFNlZ1RhYmxlLT5taW5zaXplLCBtaW5zaXplICk7CisgICAgfQorCisgICAgTU9EVUxFX1JlZ2lzdGVyTW9kdWxlKCBwTW9kdWxlICk7CisgICAgcmV0dXJuIGhNb2R1bGU7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQlVJTFRJTl9HZXRFbnRyeVBvaW50CisgKgorICogUmV0dXJuIHRoZSBidWlsdC1pbiBtb2R1bGUsIG9yZGluYWwgYW5kIG5hbWUgY29ycmVzcG9uZGluZworICogdG8gYSBDUzpJUCBhZGRyZXNzLiBUaGlzIGlzIHVzZWQgb25seSBieSByZWxheSBkZWJ1Z2dpbmcuCisgKi8KK05FX01PRFVMRSAqQlVJTFRJTl9HZXRFbnRyeVBvaW50KCBXT1JEIGNzLCBXT1JEIGlwLCBXT1JEICpwT3JkLCBjaGFyICoqcHBOYW1lICkKK3sKKyAgICBXT1JEIG9yZGluYWwsIGksIG1heF9vZmZzZXQ7CisgICAgcmVnaXN0ZXIgQllURSAqcDsKKyAgICBORV9NT0RVTEUgKnBNb2R1bGU7CisKKyAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggRmFyR2V0T3duZXIoIEdsb2JhbEhhbmRsZShjcykgKSkpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8qIFNlYXJjaCBmb3IgdGhlIG9yZGluYWwgKi8KKworICAgIHAgPSAoQllURSAqKXBNb2R1bGUgKyBwTW9kdWxlLT5lbnRyeV90YWJsZTsKKyAgICBtYXhfb2Zmc2V0ID0gMDsKKyAgICBvcmRpbmFsID0gMTsKKyAgICAqcE9yZCA9IDA7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBbMV0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOiAgICAvKiB1bnVzZWQgKi8KKyAgICAgICAgICAgIG9yZGluYWwgKz0gKnA7CisgICAgICAgICAgICBwICs9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAgICAvKiBjb2RlIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIGkgPSAqcDsKKyAgICAgICAgICAgIHAgKz0gMjsKKyAgICAgICAgICAgIHdoaWxlIChpLS0gPiAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHArKzsKKyAgICAgICAgICAgICAgICBpZiAoKCooV09SRCAqKXAgPD0gaXApICYmICgqKFdPUkQgKilwID49IG1heF9vZmZzZXQpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4X29mZnNldCA9ICooV09SRCAqKXA7CisgICAgICAgICAgICAgICAgICAgICpwT3JkID0gb3JkaW5hbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcCArPSAyOworICAgICAgICAgICAgICAgIG9yZGluYWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDB4ZmY6IC8qIG1vdmVhYmxlIChzaG91bGQgbm90IGhhcHBlbiBpbiBidWlsdC1pbiBtb2R1bGVzKSAqLworICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiQnVpbHQtaW4gbW9kdWxlIGhhcyBtb3ZlYWJsZSBlbnRyeVxuIiApOworICAgICAgICAgICAgb3JkaW5hbCArPSAqcDsKKyAgICAgICAgICAgIHAgKz0gMiArICpwICogNjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgIC8qIG90aGVyIHNlZ21lbnQgKi8KKyAgICAgICAgICAgIG9yZGluYWwgKz0gKnA7CisgICAgICAgICAgICBwICs9IDIgKyAqcCAqIDM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNlYXJjaCBmb3IgdGhlIG5hbWUgaW4gdGhlIHJlc2lkZW50IG5hbWVzIHRhYmxlICovCisgICAgLyogKGJ1aWx0LWluIG1vZHVsZXMgaGF2ZSBubyBub24tcmVzaWRlbnQgdGFibGUpICAgKi8KKyAgICAKKyAgICBwID0gKEJZVEUgKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZTsKKyAgICAqcHBOYW1lID0gIj8/PyI7CisgICAgd2hpbGUgKCpwKQorICAgIHsKKyAgICAgICAgcCArPSAqcCArIDEgKyBzaXplb2YoV09SRCk7CisgICAgICAgIGlmICgqKFdPUkQgKikocCArICpwICsgMSkgPT0gKnBPcmQpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwcE5hbWUgPSAoY2hhciAqKXA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwTW9kdWxlOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU5fR2V0UHJvY0FkZHJlc3MzMgorICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIEdldFByb2NBZGRyZXNzKCkgZm9yIGJ1aWx0LWluIFdpbjMyIG1vZHVsZXMuCisgKiBGSVhNRTogdGhpcyBzaG91bGQgYmUgdW5pZmllZCB3aXRoIHRoZSByZWFsIEdldFByb2NBZGRyZXNzMzIoKS4KKyAqLworRFdPUkQgQlVJTFRJTl9HZXRQcm9jQWRkcmVzczMyKCBORV9NT0RVTEUgKnBNb2R1bGUsIGNoYXIgKmZ1bmN0aW9uICkKK3sKKyAgICBCVUlMVElOX0RMTCAqZGxsID0gKEJVSUxUSU5fRExMICopcE1vZHVsZS0+cGVfbW9kdWxlOworICAgIGNvbnN0IFdJTjMyX0RFU0NSSVBUT1IgKmluZm8gPSAmZGxsLT5kZXNjci0+dS53aW4zMjsKKworICAgIGlmICghZGxsKSByZXR1cm4gMDsKKworICAgIGlmIChISVdPUkQoZnVuY3Rpb24pKSAgLyogRmluZCBmdW5jdGlvbiBieSBuYW1lICovCisgICAgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9va2luZyBmb3IgZnVuY3Rpb24gJXMgaW4gJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiwgZGxsLT5kZXNjci0+bmFtZSApOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgaW5mby0+c2l6ZTsgaSsrKQorICAgICAgICAgICAgaWYgKGluZm8tPm5hbWVzW2ldICYmICFzdHJjbXAoIGZ1bmN0aW9uLCBpbmZvLT5uYW1lc1tpXSApKQorICAgICAgICAgICAgICAgIHJldHVybiAoRFdPUkQpaW5mby0+ZnVuY3Rpb25zW2ldOworICAgIH0KKyAgICBlbHNlICAvKiBGaW5kIGZ1bmN0aW9uIGJ5IG9yZGluYWwgKi8KKyAgICB7CisgICAgICAgIFdPUkQgb3JkaW5hbCA9IExPV09SRChmdW5jdGlvbik7CisgICAgICAgIGRwcmludGZfbW9kdWxlKCBzdGRkZWIsICJMb29raW5nIGZvciBvcmRpbmFsICVkIGluICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgb3JkaW5hbCwgZGxsLT5kZXNjci0+bmFtZSApOworICAgICAgICBpZiAob3JkaW5hbCAmJiBvcmRpbmFsIDwgaW5mby0+c2l6ZSkKKyAgICAgICAgICAgIHJldHVybiAoRFdPUkQpaW5mby0+ZnVuY3Rpb25zW29yZGluYWwgLSBpbmZvLT5iYXNlXTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgQlVJTFRJTl9QYXJzZURMTE9wdGlvbnMKKyAqCisgKiBTZXQgcnVudGltZSBETEwgdXNhZ2UgZmxhZ3MKKyAqLworQk9PTCBCVUlMVElOX1BhcnNlRExMT3B0aW9ucyggY29uc3QgY2hhciAqc3RyICkKK3sKKyAgICBCVUlMVElOX0RMTCAqZGxsOworICAgIGNvbnN0IGNoYXIgKnA7CisKKyAgICB3aGlsZSAoKnN0cikKKyAgICB7CisgICAgICAgIHdoaWxlICgqc3RyICYmIGlzc3BhY2UoKnN0cikpIHN0cisrOworICAgICAgICBpZiAoISpzdHIpIHJldHVybiBUUlVFOworICAgICAgICBpZiAoKCpzdHIgIT0gJysnKSAmJiAoKnN0ciAhPSAnLScpKSByZXR1cm4gRkFMU0U7CisgICAgICAgIHN0cisrOworICAgICAgICBpZiAoIShwID0gc3RyY2hyKCBzdHIsICcsJyApKSkgcCA9IHN0ciArIHN0cmxlbihzdHIpOworICAgICAgICB3aGlsZSAoKHAgPiBzdHIpICYmIGlzc3BhY2UocFstMV0pKSBwLS07CisgICAgICAgIGlmIChwID09IHN0cikgcmV0dXJuIEZBTFNFOworICAgICAgICBmb3IgKGRsbCA9IEJ1aWx0aW5ETExzOyBkbGwtPmRlc2NyOyBkbGwrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFsc3RybmNtcGkoIHN0ciwgZGxsLT5kZXNjci0+bmFtZSwgKGludCkocCAtIHN0cikgKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyWy0xXSA9PSAnLScpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGxsLT5mbGFncyAmIERMTF9GTEFHX0FMV0FZU19VU0VEKSByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIGRsbC0+ZmxhZ3MgfD0gRExMX0ZMQUdfTk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgZGxsLT5mbGFncyAmPSB+RExMX0ZMQUdfTk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkbGwtPmRlc2NyKSByZXR1cm4gRkFMU0U7CisgICAgICAgIHN0ciA9IHA7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEJVSUxUSU5fUHJpbnRETExzCisgKgorICogUHJpbnQgdGhlIGxpc3Qgb2YgYnVpbHQtaW4gRExMcyB0aGF0IGNhbiBiZSBkaXNhYmxlZC4KKyAqLwordm9pZCBCVUlMVElOX1ByaW50RExMcyh2b2lkKQoreworICAgIGludCBpOworICAgIEJVSUxUSU5fRExMICpkbGw7CisKKyAgICBmb3IgKGkgPSAwLCBkbGwgPSBCdWlsdGluRExMczsgZGxsLT5kZXNjcjsgZGxsKyspCisgICAgeworICAgICAgICBpZiAoIShkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpKQorICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJS05cyVjIiwgZGxsLT5kZXNjci0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICgoKytpKSAlIDgpID8gJyAnIDogJ1xuJyApOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwiXG4iKTsKKyAgICBleGl0KDEpOworfQorCisjZW5kaWYgIC8qIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci9tYWluLmMgYi9sb2FkZXIvbWFpbi5jCmluZGV4IGIwNmUyNjEuLjMzNGVjODIgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tYWluLmMKKysrIGIvbG9hZGVyL21haW4uYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgInRhc2suaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKICNpbmNsdWRlICJjb21tLmgiCi0jaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgIm1lbnUuaCIKICNpbmNsdWRlICJrZXJuZWwzMi5oIgpAQCAtMjgsOCArMjcsOCBAQAogI2luY2x1ZGUgInN5c2NvbG9yLmgiCiAjaW5jbHVkZSAic3lzbWV0cmljcy5oIgogI2luY2x1ZGUgImdkaS5oIgorI2luY2x1ZGUgImhlYXAuaCIKICNpbmNsdWRlICJkZWJ1Z2dlci5oIgotI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJtaXNjZW11LmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJvcHRpb25zLmgiCkBAIC00Miw2ICs0MSw3IEBACiAKIHZvaWQgaW5pdF93aW5lX3NpZ25hbHModm9pZCk7CiAKK0hBTkRMRTMyIFN5c3RlbUhlYXAgPSAwOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNYWluIGluaXRpYWxpc2F0aW9uIHJvdXRpbmUKQEAgLTUyLDYgKzUyLDkgQEAKIAogICAgIGludCBxdWV1ZVNpemU7CiAKKyAgICAvKiBDcmVhdGUgdGhlIHN5c3RlbSBoZWFwICovCisgICAgaWYgKCEoU3lzdGVtSGVhcCA9IEhlYXBDcmVhdGUoIEhFQVBfR1JPV0FCTEUsIDB4MTAwMDAsIDAgKSkpIHJldHVybiAwOworCiAgICAgLyogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlICovCiAgICAgaWYgKCFQUk9GSUxFX0xvYWRXaW5lSW5pKCkpIHJldHVybiAwOwogCkBAIC02MSwxMCArNjQsMTAgQEAKICNpZm5kZWYgV0lORUxJQgogICAgICAgLyogSW5pdGlhbGl6ZSByZWxheSBjb2RlICovCiAgICAgaWYgKCFSRUxBWV9Jbml0KCkpIHJldHVybiAwOwotI2VuZGlmCiAKICAgICAgIC8qIENyZWF0ZSBidWlsdC1pbiBtb2R1bGVzICovCi0gICAgaWYgKCFNT0RVTEVfSW5pdCgpKSByZXR1cm4gMDsKKyAgICBpZiAoIUJVSUxUSU5fSW5pdCgpKSByZXR1cm4gMDsKKyNlbmRpZgogCiAgICAgLyogSW5pdGlhbGlzZSBET1MgZHJpdmVzICovCiAgICAgaWYgKCFEUklWRV9Jbml0KCkpIHJldHVybiAwOwpAQCAtOTAsOSArOTMsNiBAQAogCiAgICAgICAvKiBJbml0aWFsaXplIHRoZSBET1MgbWVtb3J5ICovCiAgICAgaWYgKCFJTlQyMV9Jbml0KCkpIHJldHVybiAwOwotCi0gICAgICAvKiBDcmVhdGUgVVNFUiBoZWFwICovCi0gICAgaWYgKCFVU0VSX0hlYXBJbml0KCkpIHJldHVybiAwOwogI2VuZGlmCiAgICAgCiAgICAgICAvKiBHbG9iYWwgYXRvbSB0YWJsZSBpbml0aWFsaXNhdGlvbiAqLwpkaWZmIC0tZ2l0IGEvbG9hZGVyL21vZHVsZS5jIGIvbG9hZGVyL21vZHVsZS5jCmluZGV4IDEyOGMwNWEuLmEzZjQ2MTUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9tb2R1bGUuYworKysgYi9sb2FkZXIvbW9kdWxlLmMKQEAgLTExLDEwICsxMSwxMSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKLSNpbmNsdWRlICJkbGxzLmgiCisjaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJkb3NfZnMuaCIKICNpbmNsdWRlICJmaWxlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAiaG9vay5oIgogI2luY2x1ZGUgImxkdC5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgIm5lZXhlLmgiCkBAIC0zNSw5NiArMzYsNiBAQAogI2lmbmRlZiBXSU5FTElCCiBzdGF0aWMgSEFORExFIGhJbml0aWFsU3RhY2szMiA9IDA7CiAjZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIE1PRFVMRV9Mb2FkQnVpbHRpbgotICoKLSAqIExvYWQgYSBidWlsdC1pbiBtb2R1bGUuIElmIHRoZSAnZm9yY2UnIHBhcmFtZXRlciBpcyBGQUxTRSwgd2Ugb25seQotICogbG9hZCB0aGUgbW9kdWxlIGlmIGl0IGhhcyBub3QgYmVlbiBkaXNhYmxlZCB2aWEgdGhlIC1kbGwgb3B0aW9uLgotICovCi0jaWZuZGVmIFdJTkVMSUIKLXN0YXRpYyBITU9EVUxFIE1PRFVMRV9Mb2FkQnVpbHRpbiggTFBDU1RSIG5hbWUsIEJPT0wgZm9yY2UgKQotewotICAgIEhNT0RVTEUgaE1vZHVsZTsKLSAgICBORV9NT0RVTEUgKnBNb2R1bGU7Ci0gICAgU0VHVEFCTEVFTlRSWSAqcFNlZ1RhYmxlOwotICAgIEJVSUxUSU5fRExMICp0YWJsZTsKLSAgICBjaGFyIGRsbG5hbWVbMTZdLCAqcDsKLQotICAgIC8qIEZpeCB0aGUgbmFtZSBpbiBjYXNlIHdlIGhhdmUgYSBmdWxsIHBhdGggYW5kIGV4dGVuc2lvbiAqLwotCi0gICAgaWYgKChwID0gc3RycmNociggbmFtZSwgJ1xcJyApKSkgbmFtZSA9IHAgKyAxOwotICAgIGxzdHJjcHluKCBkbGxuYW1lLCBuYW1lLCBzaXplb2YoZGxsbmFtZSkgKTsKLSAgICBpZiAoKHAgPSBzdHJyY2hyKCBkbGxuYW1lLCAnLicgKSkpICpwID0gJ1wwJzsKLQotICAgIGZvciAodGFibGUgPSBkbGxfYnVpbHRpbl90YWJsZTsgdGFibGUtPm5hbWU7IHRhYmxlKyspCi0gICAgICAgIGlmICghbHN0cmNtcGkoIHRhYmxlLT5uYW1lLCBkbGxuYW1lICkpIGJyZWFrOwotICAgIGlmICghdGFibGUtPm5hbWUpIHJldHVybiAwOwotICAgIGlmICgodGFibGUtPmZsYWdzICYgRExMX0ZMQUdfTk9UX1VTRUQpICYmICFmb3JjZSkgcmV0dXJuIDA7Ci0KLSAgICBoTW9kdWxlID0gR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX01PVkVBQkxFLCB0YWJsZS0+bW9kdWxlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLT5tb2R1bGVfZW5kIC0gdGFibGUtPm1vZHVsZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICk7Ci0gICAgaWYgKCFoTW9kdWxlKSByZXR1cm4gMDsKLSAgICBGYXJTZXRPd25lciggaE1vZHVsZSwgaE1vZHVsZSApOwotCi0gICAgdGFibGUtPmhNb2R1bGUgPSBoTW9kdWxlOwotCi0gICAgZHByaW50Zl9tb2R1bGUoIHN0ZGRlYiwgIkJ1aWx0LWluICVzOiBobW9kdWxlPSUwNHhcbiIsCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlLT5uYW1lLCBoTW9kdWxlICk7Ci0gICAgcE1vZHVsZSA9IChORV9NT0RVTEUgKilHbG9iYWxMb2NrKCBoTW9kdWxlICk7Ci0gICAgcE1vZHVsZS0+c2VsZiA9IGhNb2R1bGU7Ci0KLSAgICBpZiAocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpCi0gICAgewotICAgICAgICBwTW9kdWxlLT5wZV9tb2R1bGUgPSAoUEVfTU9EVUxFICopdGFibGU7Ci0gICAgfQotICAgIGVsc2UgIC8qIFdpbjE2IG1vZHVsZSAqLwotICAgIHsKLSAgICAgICAgLyogQWxsb2NhdGUgdGhlIGNvZGUgc2VnbWVudCAqLwotCi0gICAgICAgIHBTZWdUYWJsZSA9IE5FX1NFR19UQUJMRSggcE1vZHVsZSApOwotICAgICAgICBwU2VnVGFibGUtPnNlbGVjdG9yID0gR0xPQkFMX0NyZWF0ZUJsb2NrKEdNRU1fRklYRUQsIHRhYmxlLT5jb2RlX3N0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTZWdUYWJsZS0+bWluc2l6ZSwgaE1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFLCBUUlVFLCBGQUxTRSwgTlVMTCApOwotICAgICAgICBpZiAoIXBTZWdUYWJsZS0+c2VsZWN0b3IpIHJldHVybiAwOwotICAgICAgICBwU2VnVGFibGUrKzsKLQotICAgICAgICAvKiBBbGxvY2F0ZSB0aGUgZGF0YSBzZWdtZW50ICovCi0KLSAgICAgICAgcFNlZ1RhYmxlLT5zZWxlY3RvciA9IEdMT0JBTF9BbGxvYyggR01FTV9GSVhFRCwgcFNlZ1RhYmxlLT5taW5zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFICk7Ci0gICAgICAgIGlmICghcFNlZ1RhYmxlLT5zZWxlY3RvcikgcmV0dXJuIDA7Ci0gICAgICAgIG1lbWNweSggR2xvYmFsTG9jayggcFNlZ1RhYmxlLT5zZWxlY3RvciApLAotICAgICAgICAgICAgICAgIHRhYmxlLT5kYXRhX3N0YXJ0LCBwU2VnVGFibGUtPm1pbnNpemUgKTsKLSAgICB9Ci0KLSAgICBwTW9kdWxlLT5uZXh0ID0gaEZpcnN0TW9kdWxlOwotICAgIGhGaXJzdE1vZHVsZSA9IGhNb2R1bGU7Ci0gICAgcmV0dXJuIGhNb2R1bGU7Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgTU9EVUxFX0luaXQKLSAqCi0gKiBDcmVhdGUgdGhlIGJ1aWx0LWluIG1vZHVsZXMuCi0gKi8KLUJPT0wgTU9EVUxFX0luaXQodm9pZCkKLXsKLSNpZm5kZWYgV0lORUxJQjMyCi0gICAgQlVJTFRJTl9ETEwgKmRsbDsKLQotICAgIC8qIExvYWQgYWxsIG1vZHVsZXMgbWFya2VkIGFzIGFsd2F5cyB1c2VkICovCi0KLSAgICBmb3IgKGRsbCA9IGRsbF9idWlsdGluX3RhYmxlOyBkbGwtPm5hbWU7IGRsbCsrKQotICAgICAgICBpZiAoZGxsLT5mbGFncyAmIERMTF9GTEFHX0FMV0FZU19VU0VEKQotICAgICAgICAgICAgaWYgKCFNT0RVTEVfTG9hZEJ1aWx0aW4oZGxsLT5uYW1lLCBUUlVFKSkgcmV0dXJuIEZBTFNFOwotI2VuZGlmCi0gICAgLyogSW5pdGlhbGl6ZSBLRVJORUwuMTc4IChfX1dJTkZMQUdTKSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzIHZhbHVlICovCi0KLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggR2V0TW9kdWxlSGFuZGxlKCAiS0VSTkVMIiApLCAxNzgsIEdldFdpbkZsYWdzKCkgKTsKLSAgICByZXR1cm4gVFJVRTsKLX0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM1OCw3ICsyNjksNyBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNT0RVTEVfQWxsb2NhdGVTZWdtZW50IChXSU5QUk9DUy4yNikKKyAqICAgICAgICAgICBNT0RVTEVfQWxsb2NhdGVTZWdtZW50IChXUFJPQ1MuMjYpCiAgKi8KIAogRFdPUkQgTU9EVUxFX0FsbG9jYXRlU2VnbWVudChXT1JEIHdGbGFncywgV09SRCB3U2l6ZSwgV09SRCB3RWxlbSkKQEAgLTQxMCw3ICszMjEsNyBAQAogICogICAgICAgICAgIE1PRFVMRV9HZXRJbnN0YW5jZQogICovCiAjaWZuZGVmIFdJTkVMSUIzMgotc3RhdGljIEhJTlNUQU5DRSBNT0RVTEVfR2V0SW5zdGFuY2UoIEhNT0RVTEUgaE1vZHVsZSApCitISU5TVEFOQ0UgTU9EVUxFX0dldEluc3RhbmNlKCBITU9EVUxFIGhNb2R1bGUgKQogewogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdtZW50OwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKQEAgLTQ2Miw3ICszNzMsNyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0xvYWRFeGVIZWFkZXIKICAqLwotSE1PRFVMRSBNT0RVTEVfTG9hZEV4ZUhlYWRlciggSEZJTEUgaEZpbGUsIE9GU1RSVUNUICpvZnMgKQorc3RhdGljIEhNT0RVTEUgTU9EVUxFX0xvYWRFeGVIZWFkZXIoIEhGSUxFIGhGaWxlLCBPRlNUUlVDVCAqb2ZzICkKIHsKICAgICBzdHJ1Y3QgbXpfaGVhZGVyX3MgbXpfaGVhZGVyOwogICAgIHN0cnVjdCBuZV9oZWFkZXJfcyBuZV9oZWFkZXI7CkBAIC02NzcsOCArNTg4LDcgQEAKICAgICB9CiAgICAgZWxzZSBwTW9kdWxlLT5kbGxzX3RvX2luaXQgPSAwOwogCi0gICAgcE1vZHVsZS0+bmV4dCA9IGhGaXJzdE1vZHVsZTsKLSAgICBoRmlyc3RNb2R1bGUgPSBoTW9kdWxlOworICAgIE1PRFVMRV9SZWdpc3Rlck1vZHVsZSggcE1vZHVsZSApOwogICAgIHJldHVybiBoTW9kdWxlOwogI3VuZGVmIFJFQUQKIH0KQEAgLTg0NCw0NSArNzU0LDkgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUKLSAqCi0gKiBSZXR1cm4gdGhlIGVudHJ5IHBvaW50IG5hbWUgZm9yIGEgZ2l2ZW4gb3JkaW5hbC4KLSAqIFVzZWQgb25seSBieSByZWxheSBkZWJ1Z2dpbmcuCi0gKiBXYXJuaW5nOiByZXR1cm5lZCBwb2ludGVyIGlzIHRvIGEgUGFzY2FsLXR5cGUgc3RyaW5nLgotICovCi1MUFNUUiBNT0RVTEVfR2V0RW50cnlQb2ludE5hbWUoIEhNT0RVTEUgaE1vZHVsZSwgV09SRCBvcmRpbmFsICkKLXsKLSAgICByZWdpc3RlciBjaGFyICpjcG50OwotICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKLQotICAgIGlmICghKHBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICkpKSByZXR1cm4gMDsKLQotICAgICAgLyogRmlyc3Qgc2VhcmNoIHRoZSByZXNpZGVudCBuYW1lcyAqLwotCi0gICAgY3BudCA9IChjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGU7Ci0gICAgd2hpbGUgKCpjcG50KQotICAgIHsKLSAgICAgICAgY3BudCArPSAqY3BudCArIDEgKyBzaXplb2YoV09SRCk7Ci0gICAgICAgIGlmICgqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgPT0gb3JkaW5hbCkgcmV0dXJuIGNwbnQ7Ci0gICAgfQotCi0gICAgICAvKiBOb3cgc2VhcmNoIHRoZSBub24tcmVzaWRlbnQgbmFtZXMgdGFibGUgKi8KLQotICAgIGlmICghcE1vZHVsZS0+bnJuYW1lX2hhbmRsZSkgcmV0dXJuIDA7ICAvKiBObyBub24tcmVzaWRlbnQgdGFibGUgKi8KLSAgICBjcG50ID0gKGNoYXIgKilHbG9iYWxMb2NrKCBwTW9kdWxlLT5ucm5hbWVfaGFuZGxlICk7Ci0gICAgd2hpbGUgKCpjcG50KQotICAgIHsKLSAgICAgICAgY3BudCArPSAqY3BudCArIDEgKyBzaXplb2YoV09SRCk7Ci0gICAgICAgIGlmICgqKFdPUkQgKikoY3BudCArICpjcG50ICsgMSkgPT0gb3JkaW5hbCkgcmV0dXJuIGNwbnQ7Ci0gICAgfQotICAgIHJldHVybiBOVUxMOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiAgKG5vdCBhIFdpbmRvd3MgQVBJIGZ1bmN0aW9uKQogICoKLSAqIFJldHVybiBhbiBlbnRyeSBwb2ludCBmcm9tIHRoZSBXSU5QUk9DUyBkbGwuCisgKiBSZXR1cm4gYW4gZW50cnkgcG9pbnQgZnJvbSB0aGUgV1BST0NTIGRsbC4KICAqLwogI2lmbmRlZiBXSU5FTElCCiBXTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkxNiggY29uc3QgY2hhciAqbmFtZSApCkBAIC04OTAsNyArNzY0LDcgQEAKICAgICBXT1JEIG9yZGluYWw7CiAgICAgc3RhdGljIEhNT0RVTEUgaE1vZHVsZSA9IDA7CiAKLSAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXSU5QUk9DUyIgKTsKKyAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXUFJPQ1MiICk7CiAgICAgb3JkaW5hbCA9IE1PRFVMRV9HZXRPcmRpbmFsKCBoTW9kdWxlLCBuYW1lICk7CiAgICAgcmV0dXJuIE1PRFVMRV9HZXRFbnRyeVBvaW50KCBoTW9kdWxlLCBvcmRpbmFsICk7CiB9CkBAIC05MDAsMTQgKzc3NCwxNCBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgTU9EVUxFX0dldFduZFByb2NFbnRyeTMyICAobm90IGEgV2luZG93cyBBUEkgZnVuY3Rpb24pCiAgKgotICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdJTlBST0NTMzIgZGxsLgorICogUmV0dXJuIGFuIGVudHJ5IHBvaW50IGZyb20gdGhlIFdQUk9DUzMyIGRsbC4KICAqLwogI2lmbmRlZiBXSU5FTElCCiBXTkRQUk9DIE1PRFVMRV9HZXRXbmRQcm9jRW50cnkzMiggY29uc3QgY2hhciAqbmFtZSApCiB7CiAgICAgc3RhdGljIEhNT0RVTEUgaE1vZHVsZSA9IDA7CiAKLSAgICBpZiAoIWhNb2R1bGUpIGhNb2R1bGUgPSBHZXRNb2R1bGVIYW5kbGUoICJXSU5QUk9DUzMyIiApOworICAgIGlmICghaE1vZHVsZSkgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggIldQUk9DUzMyIiApOwogICAgIHJldHVybiBQRV9HZXRQcm9jQWRkcmVzcyggaE1vZHVsZSwgbmFtZSApOwogfQogI2VuZGlmCkBAIC05MzQsMTMgKzgwOCwxMyBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUKICAqLwotdm9pZCBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUoIEhNT0RVTEUgaE1vZHVsZSApCit2b2lkIE1PRFVMRV9SZWdpc3Rlck1vZHVsZSggTkVfTU9EVUxFICpwTW9kdWxlICkKIHsKLSAgICBORV9NT0RVTEUgKnBNb2R1bGUgPSBNT0RVTEVfR2V0UHRyKCBoTW9kdWxlICk7CiAgICAgcE1vZHVsZS0+bmV4dCA9IGhGaXJzdE1vZHVsZTsKLSAgICBoRmlyc3RNb2R1bGUgPSBoTW9kdWxlOworICAgIGhGaXJzdE1vZHVsZSA9IHBNb2R1bGUtPnNlbGY7CiB9CiAKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBNT0RVTEVfRmluZE1vZHVsZQogICoKQEAgLTk5Niw2ICs4NzAsMTEgQEAKIAogICAgIC8qIEZJWE1FOiBzaG91bGQgY2FsbCB0aGUgZXhpdCBjb2RlIGZvciB0aGUgbGlicmFyeSBoZXJlICovCiAKKyAgICAvKiBGcmVlIHRoZSBvYmplY3RzIG93bmVkIGJ5IHRoZSBtb2R1bGUgKi8KKworICAgIEhPT0tfRnJlZU1vZHVsZUhvb2tzKCBoTW9kdWxlICk7CisgICAgQ0xBU1NfRnJlZU1vZHVsZUNsYXNzZXMoIGhNb2R1bGUgKTsKKwogICAgIC8qIENsZWFyIG1hZ2ljIG51bWJlciBqdXN0IGluIGNhc2UgKi8KIAogICAgIHBNb2R1bGUtPm1hZ2ljID0gcE1vZHVsZS0+c2VsZiA9IDA7CkBAIC0xMDU4LDEyICs5MzcsMTIgQEAKICAgICAgICAgT0ZTVFJVQ1Qgb2ZzOwogCiAgICAgICAgIC8qIFRyeSB0byBsb2FkIHRoZSBidWlsdC1pbiBmaXJzdCBpZiBub3QgZGlzYWJsZWQgKi8KLSAgICAgICAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0xvYWRCdWlsdGluKCBuYW1lLCBGQUxTRSApKSkgcmV0dXJuIGhNb2R1bGU7CisgICAgICAgIGlmICgoaE1vZHVsZSA9IEJVSUxUSU5fTG9hZE1vZHVsZSggbmFtZSwgRkFMU0UgKSkpIHJldHVybiBoTW9kdWxlOwogCiAgICAgICAgIGlmICgoaEZpbGUgPSBPcGVuRmlsZSggbmFtZSwgJm9mcywgT0ZfUkVBRCApKSA9PSBIRklMRV9FUlJPUikKICAgICAgICAgewogICAgICAgICAgICAgLyogTm93IHRyeSB0aGUgYnVpbHQtaW4gZXZlbiBpZiBkaXNhYmxlZCAqLwotICAgICAgICAgICAgaWYgKChoTW9kdWxlID0gTU9EVUxFX0xvYWRCdWlsdGluKCBuYW1lLCBUUlVFICkpKQorICAgICAgICAgICAgaWYgKChoTW9kdWxlID0gQlVJTFRJTl9Mb2FkTW9kdWxlKCBuYW1lLCBUUlVFICkpKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBsb2FkIFdpbmRvd3MgRExMICclcycsIHVzaW5nIGJ1aWx0LWluIG1vZHVsZS5cbiIsIG5hbWUgKTsKICAgICAgICAgICAgICAgICByZXR1cm4gaE1vZHVsZTsKQEAgLTExNDgsNyArMTAyNyw3IEBACiAJCS8qIEhhbmRsZSBzZWxmIGxvYWRpbmcgbW9kdWxlcyAqLwogCQlTRUdUQUJMRUVOVFJZICogcFNlZ1RhYmxlID0gKFNFR1RBQkxFRU5UUlkgKikgTkVfU0VHX1RBQkxFKHBNb2R1bGUpOwogCQlTRUxGTE9BREhFQURFUiAqc2VsZmxvYWRoZWFkZXI7Ci0JCUhNT0RVTEUgaHNlbGZsb2FkID0gR2V0TW9kdWxlSGFuZGxlKCJXSU5QUk9DUyIpOworCQlITU9EVUxFIGhzZWxmbG9hZCA9IEdldE1vZHVsZUhhbmRsZSgiV1BST0NTIik7CiAJCVdPUkQgb2xkc3MsIG9sZHNwLCBzYXZlZF9kZ3JvdXAgPSBwU2VnVGFibGVbcE1vZHVsZS0+ZGdyb3VwIC0gMV0uc2VsZWN0b3I7CiAJCWZwcmludGYgKHN0ZGVyciwgIldhcm5pbmc6ICAlKi4qcyBpcyBhIHNlbGYtbG9hZGluZyBtb2R1bGVcbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN1cHBvcnQgZm9yIHNlbGYtbG9hZGluZyBtb2R1bGVzIGlzIHZlcnkgZXhwZXJpbWVudGFsXG4iLApkaWZmIC0tZ2l0IGEvbG9hZGVyL25lX2ltYWdlLmMgYi9sb2FkZXIvbmVfaW1hZ2UuYwppbmRleCAyZmNkOGY5Li40NDdiNTAwIDEwMDY0NAotLS0gYS9sb2FkZXIvbmVfaW1hZ2UuYworKysgYi9sb2FkZXIvbmVfaW1hZ2UuYwpAQCAtMTYsNyArMTYsNiBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPGVycm5vLmg+CiAjaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImFyY2guaCIKICNpbmNsdWRlICJzZWxlY3RvcnMuaCIKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9yZXNvdXJjZS5jIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKaW5kZXggN2U0NTA4OS4uY2FlZTVmOCAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL25lX3Jlc291cmNlLmMKQEAgLTIzLDkgKzIzLDYgQEAKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgogI2luY2x1ZGUgImRlYnVnLmgiCiAKLXR5cGVkZWYgc3RydWN0IHJlc291cmNlX3R5cGVpbmZvX3MgTkVfVFlQRUlORk87Ci10eXBlZGVmIHN0cnVjdCByZXNvdXJjZV9uYW1laW5mb19zIE5FX05BTUVJTkZPOwotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE5FX0ZpbmROYW1lVGFibGVJZApkaWZmIC0tZ2l0IGEvbG9hZGVyL3BlX2ltYWdlLmMgYi9sb2FkZXIvcGVfaW1hZ2UuYwppbmRleCA3OTc4OWI3Li5kMTY0MTdhIDEwMDY0NAotLS0gYS9sb2FkZXIvcGVfaW1hZ2UuYworKysgYi9sb2FkZXIvcGVfaW1hZ2UuYwpAQCAtMTgsOCArMTgsOCBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CiAjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbmJhc2UuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgotI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgInBlZXhlLmgiCiAjaW5jbHVkZSAicGVfaW1hZ2UuaCIKQEAgLTE0MCwxNiArMTQwLDkgQEAKICAgICBORV9NT0RVTEUgKnBNb2R1bGU7CiAKICAgICBpZiAoIShwTW9kdWxlID0gTU9EVUxFX0dldFB0ciggaE1vZHVsZSApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCEocE1vZHVsZS0+ZmxhZ3MgJiBORV9GRkxBR1NfV0lOMzIpKSByZXR1cm4gMDsKKyAgICBpZiAoIShwTW9kdWxlLT5mbGFncyAmIE5FX0ZGTEFHU19XSU4zMikgfHwgIXBNb2R1bGUtPnBlX21vZHVsZSkgcmV0dXJuIDA7CiAgICAgaWYgKHBNb2R1bGUtPmZsYWdzICYgTkVfRkZMQUdTX0JVSUxUSU4pCi0gICAgewotICAgICAgICBCVUlMVElOX0RMTCAqZGxsID0gKEJVSUxUSU5fRExMICopcE1vZHVsZS0+cGVfbW9kdWxlOwotICAgICAgICBpZihISVdPUkQoZnVuY3Rpb24pKQotICAgICAgICAgICAgcmV0dXJuIFJFTEFZMzJfR2V0RW50cnlQb2ludChkbGwsZnVuY3Rpb24sMCk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIHJldHVybiBSRUxBWTMyX0dldEVudHJ5UG9pbnQoZGxsLDAsKGludClmdW5jdGlvbik7Ci0gICAgfQotICAgIGlmICghcE1vZHVsZS0+cGVfbW9kdWxlKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIEJVSUxUSU5fR2V0UHJvY0FkZHJlc3MzMiggcE1vZHVsZSwgZnVuY3Rpb24gKTsKICAgICByZXR1cm4gUEVfRmluZEV4cG9ydGVkRnVuY3Rpb24oIHBNb2R1bGUtPnBlX21vZHVsZSwgZnVuY3Rpb24gKTsKIH0KIApAQCAtMjQ3LDEyICsyNDAsOCBAQAogICAgICAgICBkcHJpbnRmX3dpbjMyKHN0ZGRlYiwgIi0tLSAlcyAlcy4lZFxuIiwgcGVfbmFtZS0+TmFtZSwgTW9kdWxlLCBwZV9uYW1lLT5IaW50KTsKICNpZm5kZWYgV0lORUxJQiAvKiBGSVhNRTogSkJQOiBTaG91bGQgdGhpcyBoYXBwZW4gaW4gbGlid2luZS5hPyAqLwogCS8qIEZJWE1FOiBCb3RoIGNhbGxzIHNob3VsZCBiZSB1bmlmaWVkIGludG8gR2V0UHJvY0FkZHJlc3MgKi8KLSNpZiAwCi0gICAgICAgICp0aHVua19saXN0PSh1bnNpZ25lZCBpbnQpUkVMQVkzMl9HZXRFbnRyeVBvaW50KE1vZHVsZSxwZV9uYW1lLT5OYW1lLHBlX25hbWUtPkhpbnQpOwotCWlmKCp0aHVua19saXN0ID09IDApCi0jZW5kaWYKLQkgIAkqdGh1bmtfbGlzdCA9IFdJTjMyX0dldFByb2NBZGRyZXNzKE1PRFVMRV9GaW5kTW9kdWxlKE1vZHVsZSksCi0JCQkJcGVfbmFtZS0+TmFtZSk7CisgICAgICAgICp0aHVua19saXN0ID0gV0lOMzJfR2V0UHJvY0FkZHJlc3MoTU9EVUxFX0ZpbmRNb2R1bGUoTW9kdWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZV9uYW1lLT5OYW1lKTsKICNlbHNlCiAgICAgICAgIGZwcmludGYoc3RkZXJyLCJKQlA6IENhbGwgdG8gUkVMQVkzMl9HZXRFbnRyeVBvaW50IGJlaW5nIGlnbm9yZWQuXG4iKTsKICNlbmRpZgpAQCAtNjE5LDcgKzYwOCw3IEBACiAJcE1vZHVsZS0+cmVzX3RhYmxlPXBNb2R1bGUtPmltcG9ydF90YWJsZT1wTW9kdWxlLT5lbnRyeV90YWJsZT0KIAkJKGludClwU3RyLShpbnQpcE1vZHVsZTsKIAotICAgICAgICBNT0RVTEVfUmVnaXN0ZXJNb2R1bGUoaE1vZHVsZSk7CisgICAgICAgIE1PRFVMRV9SZWdpc3Rlck1vZHVsZSggcE1vZHVsZSApOwogCiAJcGUgPSBQRV9Mb2FkSW1hZ2UoIGZkLCBoTW9kdWxlLCBtel9oZWFkZXIubmVfb2Zmc2V0ICk7CiAKQEAgLTY1Niw3ICs2NDUsNiBAQAogICAgIGludCBmczsKICAgICBITU9EVUxFIGhNb2R1bGU7CiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwotICAgIHN0cnVjdCBwZV9kYXRhICpwZTsKIAogICAgIGRwcmludGZfd2luMzIoc3RkZGViLCJHb2luZyB0byBzdGFydCBXaW4zMiBwcm9ncmFtXG4iKTsJCiAgICAgSW5pdFRhc2soY29udGV4dCk7CmRpZmYgLS1naXQgYS9sb2FkZXIvcGVfcmVzb3VyY2UuYyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCmluZGV4IGIwZDYyMDMuLmRhMTlhNjUgMTAwNjQ0Ci0tLSBhL2xvYWRlci9wZV9yZXNvdXJjZS5jCisrKyBiL2xvYWRlci9wZV9yZXNvdXJjZS5jCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibmVleGUuaCIKICNpbmNsdWRlICJwZWV4ZS5oIgotI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJwZV9pbWFnZS5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKZGlmZiAtLWdpdCBhL2xvYWRlci9yZXNvdXJjZS5jIGIvbG9hZGVyL3Jlc291cmNlLmMKaW5kZXggYjZhNDU0OS4uNWM1ZWM5MyAxMDA2NDQKLS0tIGEvbG9hZGVyL3Jlc291cmNlLmMKKysrIGIvbG9hZGVyL3Jlc291cmNlLmMKQEAgLTE4LDcgKzE4LDYgQEAKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJuZWV4ZS5oIgogI2luY2x1ZGUgImFjY2VsLmgiCi0jaW5jbHVkZSAiZGxscy5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgogI2luY2x1ZGUgInJlc291cmNlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDdkZGFjMzEuLmJhYjY3OTQgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtMzQsOCArMzQsNyBAQAogI2RlZmluZSBTVEFDSzMyX1NJWkUgMHgxMDAwMAogCiBleHRlcm4gdm9pZCBUSU1FUl9Td2l0Y2hRdWV1ZShIUVVFVUUsIEhRVUVVRSApOwotZXh0ZXJuIHZvaWQgVElNRVJfTnVrZVRpbWVycyhIV05ELCBIUVVFVUUgKTsKLQorZXh0ZXJuIHZvaWQgVVNFUl9BcHBFeGl0KEhUQVNLLCBISU5TVEFOQ0UsIEhRVUVVRSApOwogLyogLS0tLS0tIEludGVybmFsIHZhcmlhYmxlcyAtLS0tLS0gKi8KIAogc3RhdGljIEhUQVNLIGhGaXJzdFRhc2sgPSAwOwpAQCAtNzEsNiArNzAsMTggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgVEFTS19HZXROZXh0VGFzaworICovCitIVEFTSyBUQVNLX0dldE5leHRUYXNrKCBIVEFTSyBoVGFzayApCit7CisgICAgVERCKiBwVGFzayA9IChUREIqKUdsb2JhbExvY2soaFRhc2spOworCisgICAgaWYgKHBUYXNrLT5oTmV4dCkgcmV0dXJuIHBUYXNrLT5oTmV4dDsKKyAgICByZXR1cm4gKGhGaXJzdFRhc2sgIT0gaFRhc2spID8gaEZpcnN0VGFzayA6IDA7IAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRBU0tfQ3JlYXRlRE9TRW52aXJvbm1lbnQKICAqCiAgKiBDcmVhdGUgdGhlIG9yaWdpbmFsIERPUyBlbnZpcm9ubWVudC4KQEAgLTUyNiw4ICs1MzcsOCBAQAogICAgIGZyYW1lMTYtPnNhdmVkX3NwID0gMDsgLypwVGFzay0+c3A7Ki8KICAgICBmcmFtZTE2LT5kcyA9IGZyYW1lMTYtPmVzID0gcFRhc2stPmhJbnN0YW5jZTsKICAgICBmcmFtZTE2LT5lbnRyeV9wb2ludCA9IDA7Ci0gICAgZnJhbWUxNi0+b3JkaW5hbF9udW1iZXIgPSAyNDsgIC8qIFdJTlBST0NTLjI0IGlzIFRBU0tfUmVzY2hlZHVsZSAqLwotICAgIGZyYW1lMTYtPmRsbF9pZCA9IDI0OyAvKiBXSU5QUk9DUyAqLworICAgIGZyYW1lMTYtPmVudHJ5X2lwID0gT0ZGU0VUT0YoVEFTS19SZXNjaGVkdWxlUHJvYykgKyAxNDsKKyAgICBmcmFtZTE2LT5lbnRyeV9jcyA9IFNFTEVDVE9ST0YoVEFTS19SZXNjaGVkdWxlUHJvYyk7CiAgICAgZnJhbWUxNi0+YnAgPSAwOwogICAgIGZyYW1lMTYtPmlwID0gTE9XT1JEKCBDQUxMVE8xNl9SZXRBZGRyX3dvcmQgKTsKICAgICBmcmFtZTE2LT5jcyA9IEhJV09SRCggQ0FMTFRPMTZfUmV0QWRkcl93b3JkICk7CkBAIC01ODMsMTQgKzU5NCw2IEBACiAKICAgICBGSUxFX0Nsb3NlQWxsRmlsZXMoIHBUYXNrLT5oUERCICk7CiAKLSAgICAvKiBOdWtlIHRpbWVycyAqLwotCi0gICAgVElNRVJfTnVrZVRpbWVycyggMCwgcFRhc2stPmhRdWV1ZSApOwotCi0gICAgLyogRnJlZSB0aGUgbWVzc2FnZSBxdWV1ZSAqLwotCi0gICAgUVVFVUVfRGVsZXRlTXNnUXVldWUoIHBUYXNrLT5oUXVldWUgKTsKLQogICAgIC8qIEZyZWUgdGhlIHNlbGVjdG9yIGFsaWFzZXMgKi8KIAogICAgIEdMT0JBTF9GcmVlQmxvY2soIHBUYXNrLT5oQ1NBbGlhcyApOwpAQCAtNjE5LDYgKzYyMiwxMiBAQAogewogICAgIGV4dGVybiB2b2lkIEVYRUNfRXhpdFdpbmRvd3MoIGludCByZXRDb2RlICk7CiAKKyAgICBUREIqIHBUYXNrID0gKFREQiopIEdsb2JhbExvY2soIGhDdXJyZW50VGFzayApOworCisgICAgLyogUGVyZm9ybSBVU0VSIGNsZWFudXAgKi8KKworICAgIFVTRVJfQXBwRXhpdCggaEN1cnJlbnRUYXNrLCBwVGFzay0+aEluc3RhbmNlLCBwVGFzay0+aFF1ZXVlICk7CisKICAgICBpZiAoaFRhc2tUb0tpbGwgJiYgKGhUYXNrVG9LaWxsICE9IGhDdXJyZW50VGFzaykpCiAgICAgewogICAgICAgICAvKiBJZiBhbm90aGVyIHRhc2sgaXMgYWxyZWFkeSBtYXJrZWQgZm9yIGRlc3RydWN0aW9uLCAqLwpkaWZmIC0tZ2l0IGEvbWVtb3J5L2F0b20uYyBiL21lbW9yeS9hdG9tLmMKaW5kZXggZmU4MDdjZC4uOTY3NmE1NCAxMDA2NDQKLS0tIGEvbWVtb3J5L2F0b20uYworKysgYi9tZW1vcnkvYXRvbS5jCkBAIC0xMSw2ICsxMSw4IEBACiAgKiBoYXZlIHRvIGJlIGNoYW5nZWQuCiAgKi8KIAorI2lmbmRlZiBXSU5FTElCCisKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMzksOSArNDEsNiBAQAogI2RlZmluZSBHRVRfQVRPTV9UQUJMRShzZWwpICAoKEFUT01UQUJMRSopUFRSX1NFR19PRkZfVE9fTElOKHNlbCwgXAogICAgICAgICAgICgoSU5TVEFOQ0VEQVRBKilQVFJfU0VHX09GRl9UT19MSU4oc2VsLDApKS0+YXRvbXRhYmxlKSkKIAkJCi0jaWZkZWYgV0lORUxJQgotI2RlZmluZSBVU0VSX0hlYXBTZWwJMAotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEFUT01fSW5pdFRhYmxlCkBAIC0zNzUsMyArMzc0LDUgQEAKICNlbmRpZgogICAgIHJldHVybiBBVE9NX0dldEF0b21OYW1lKCBVU0VSX0hlYXBTZWwsIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKIH0KKworI2VuZGlmICAvKiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9tZW1vcnkvZ2xvYmFsLmMgYi9tZW1vcnkvZ2xvYmFsLmMKaW5kZXggOThkN2JkMC4uNTRkY2QwNyAxMDA2NDQKLS0tIGEvbWVtb3J5L2dsb2JhbC5jCisrKyBiL21lbW9yeS9nbG9iYWwuYwpAQCAtNCw2ICs0LDggQEAKICAqIENvcHlyaWdodCAxOTk1IEFsZXhhbmRyZSBKdWxsaWFyZAogICovCiAKKyNpZm5kZWYgV0lORUxJQgorCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CkBAIC0xMSw2ICsxMyw3IEBACiAKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCisjaW5jbHVkZSAiaGVhcC5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAjaW5jbHVkZSAic2VsZWN0b3JzLmgiCiAjaW5jbHVkZSAiZGRlX21lbS5oIgpAQCAtMTk5LDcgKzIwMiw3IEBACiAgICAgZWxzZSAKICNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwogICAgIHsKLQlwdHIgPSBtYWxsb2MoIHNpemUgKTsKKwlwdHIgPSBIZWFwQWxsb2MoIFN5c3RlbUhlYXAsIDAsIHNpemUgKTsKICAgICB9CiAgICAgaWYgKCFwdHIpIHJldHVybiAwOwogCkBAIC0yMDksNyArMjEyLDcgQEAKIAkJCQlpc0NvZGUsIGlzMzJCaXQsIGlzUmVhZE9ubHksICZzaG1kYXRhKTsKICAgICBpZiAoIWhhbmRsZSkKICAgICB7Ci0gICAgICAgIGZyZWUoIHB0ciApOworICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcHRyICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMzA2LDcgKzMwOSw3IEBACiAgICAgICAgIGlmICghKHBBcmVuYS0+ZmxhZ3MgJiBHQV9NT1ZFQUJMRSkgfHwKICAgICAgICAgICAgICEocEFyZW5hLT5mbGFncyAmIEdBX0RJU0NBUkRBQkxFKSB8fAogICAgICAgICAgICAgKHBBcmVuYS0+bG9ja0NvdW50ID4gMCkgfHwgKHBBcmVuYS0+cGFnZUxvY2tDb3VudCA+IDApKSByZXR1cm4gMDsKLSAgICAgICAgZnJlZSggKHZvaWQgKilwQXJlbmEtPmJhc2UgKTsKKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsICh2b2lkICopcEFyZW5hLT5iYXNlICk7CiAgICAgICAgIHBBcmVuYS0+YmFzZSA9IDA7CiAgICAgICAgIC8qIE5vdGU6IHdlIHJlbHkgb24gdGhlIGZhY3QgdGhhdCBTRUxFQ1RPUl9SZWFsbG9jQmxvY2sgd29uJ3QgKi8KICAgICAgICAgLyogY2hhbmdlIHRoZSBzZWxlY3RvciBpZiB3ZSBhcmUgc2hyaW5raW5nIHRoZSBibG9jayAqLwpAQCAtMzM3LDcgKzM0MCw3IEBACiAgICAgZHByaW50Zl9nbG9iYWwoc3RkZGViLCJvbGRzaXplICUwOGx4XG4iLG9sZHNpemUpOwogICAgIGlmIChwdHIgJiYgKHNpemUgPT0gb2xkc2l6ZSkpIHJldHVybiBoYW5kbGU7ICAvKiBOb3RoaW5nIHRvIGRvICovCiAKLSAgICBwdHIgPSByZWFsbG9jKCBwdHIsIHNpemUgKTsKKyAgICBwdHIgPSBIZWFwUmVBbGxvYyggU3lzdGVtSGVhcCwgMCwgcHRyLCBzaXplICk7CiAgICAgaWYgKCFwdHIpCiAgICAgewogICAgICAgICBGcmVlU2VsZWN0b3IoIHNlbCApOwpAQCAtMzUwLDcgKzM1Myw3IEBACiAgICAgc2VsID0gU0VMRUNUT1JfUmVhbGxvY0Jsb2NrKCBzZWwsIHB0ciwgc2l6ZSwgU0VHTUVOVF9EQVRBLCAwLCAwICk7CiAgICAgaWYgKCFzZWwpCiAgICAgewotICAgICAgICBmcmVlKCBwdHIgKTsKKyAgICAgICAgSGVhcEZyZWUoIFN5c3RlbUhlYXAsIDAsIHB0ciApOwogICAgICAgICBtZW1zZXQoIHBBcmVuYSwgMCwgc2l6ZW9mKEdMT0JBTEFSRU5BKSApOwogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0zNTgsNyArMzYxLDcgQEAKIAogICAgIGlmICghKHBOZXdBcmVuYSA9IEdMT0JBTF9HZXRBcmVuYSggc2VsLCBzZWxjb3VudCApKSkKICAgICB7Ci0gICAgICAgIGZyZWUoIHB0ciApOworICAgICAgICBIZWFwRnJlZSggU3lzdGVtSGVhcCwgMCwgcHRyICk7CiAgICAgICAgIEZyZWVTZWxlY3Rvciggc2VsICk7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTM5Miw3ICszOTUsNyBAQAogI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoaXNfZGRlX2hhbmRsZShoYW5kbGUpKSByZXR1cm4gRERFX0dsb2JhbEZyZWUoaGFuZGxlKTsKICNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwotICAgIGlmIChwdHIpIGZyZWUoIHB0ciApOworICAgIGlmIChwdHIpIEhlYXBGcmVlKCBTeXN0ZW1IZWFwLCAwLCBwdHIgKTsKICAgICByZXR1cm4gMDsKIH0KIApAQCAtODI1LDMgKzgyOCwxMyBAQAogICAgIGRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiR2xvYmFsQWxsb2MzMigleCwleClcbiIsZmxhZ3Msc2l6ZSk7CiAgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgICAgIEdsb2JhbExvY2szMgorICovCit2b2lkKiBHbG9iYWxMb2NrMzIoRFdPUkQgcHRyKQoreworCXJldHVybiAodm9pZCopcHRyOworfQorCisjZW5kaWYgIC8qIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL21lbW9yeS9oZWFwLmMgYi9tZW1vcnkvaGVhcC5jCmluZGV4IDk0NWM4NDQuLjc3ZmRlZDAgMTAwNjQ0Ci0tLSBhL21lbW9yeS9oZWFwLmMKKysrIGIvbWVtb3J5L2hlYXAuYwpAQCAtMTc5LDcgKzE3OSw3IEBACiAgICAgSEVBUCAqaGVhcFB0ciA9IChIRUFQICopaGVhcDsKICAgICBpZiAoIWhlYXBQdHIgfHwgKGhlYXBQdHItPm1hZ2ljICE9IEhFQVBfTUFHSUMpKQogICAgIHsKLSAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiSW52YWxpZCBoZWFwICUwOGx4IVxuIiwgaGVhcCApOworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGhlYXAgJTA4eCFcbiIsIGhlYXAgKTsKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX0hBTkRMRSApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC03NDAsNyArNzQwLDcgQEAKICAgICBIRUFQICpoZWFwUHRyID0gSEVBUF9HZXRQdHIoIGhlYXAgKTsKICAgICBTVUJIRUFQICpzdWJoZWFwOwogCi0gICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRGVzdHJveTogJTA4bHhcbiIsIGhlYXAgKTsKKyAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBEZXN0cm95OiAlMDh4XG4iLCBoZWFwICk7CiAgICAgaWYgKCFoZWFwUHRyKSByZXR1cm4gRkFMU0U7CiAKICAgICBEZWxldGVDcml0aWNhbFNlY3Rpb24oICZoZWFwUHRyLT5jcml0U2VjdGlvbiApOwpAQCAtNzc5LDcgKzc3OSw3IEBACiAKICAgICBpZiAoIShwQXJlbmEgPSBIRUFQX0ZpbmRGcmVlQmxvY2soIGhlYXBQdHIsIHNpemUsICZzdWJoZWFwICkpKQogICAgIHsKLSAgICAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwQWxsb2MoJTA4bHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgTlVMTFxuIiwKKyAgICAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwQWxsb2MoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAogICAgICAgICAgICAgICAgICAgaGVhcCwgZmxhZ3MsIHNpemUgICk7CiAgICAgICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKQEAgLTgxMCw3ICs4MTAsNyBAQAogICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAgICAgU2V0TGFzdEVycm9yKCAwICk7CiAKLSAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBBbGxvYyglMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKKyAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBBbGxvYyglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgaGVhcCwgZmxhZ3MsIHNpemUsIChEV09SRCkocEluVXNlICsgMSkgKTsKICAgICByZXR1cm4gKExQVk9JRCkocEluVXNlICsgMSk7CiB9CkBAIC04MzUsNyArODM1LDcgQEAKICAgICB7CiAgICAgICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfSU5WQUxJRF9QQVJBTUVURVIgKTsKLSAgICAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRnJlZSglMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyBGQUxTRVxuIiwKKyAgICAgICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRnJlZSglMDh4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIEZBTFNFXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyICk7CiAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICB9CkBAIC04NDksNyArODQ5LDcgQEAKICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogICAgIFNldExhc3RFcnJvciggMCApOwogCi0gICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwRnJlZSglMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyBUUlVFXG4iLAorICAgIGRwcmludGZfaGVhcCggc3RkZGViLCAiSGVhcEZyZWUoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyBUUlVFXG4iLAogICAgICAgICAgICAgICAgICAgaGVhcCwgZmxhZ3MsIChEV09SRClwdHIgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KQEAgLTg4MSw3ICs4ODEsNyBAQAogICAgIHsKICAgICAgICAgaWYgKCEoZmxhZ3MgJiBIRUFQX05PX1NFUklBTElaRSkpIEhlYXBVbmxvY2soIGhlYXAgKTsKICAgICAgICAgU2V0TGFzdEVycm9yKCBFUlJPUl9JTlZBTElEX1BBUkFNRVRFUiApOwotICAgICAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBSZUFsbG9jKCUwOGx4LCUwOGx4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nIE5VTExcbiIsCisgICAgICAgIGRwcmludGZfaGVhcCggc3RkZGViLCAiSGVhcFJlQWxsb2MoJTA4eCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyBOVUxMXG4iLAogICAgICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyLCBzaXplICk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTkwNCw2ICs5MDQsMTMgQEAKICAgICAgICAgICAgIHBGcmVlLT5uZXh0LT5wcmV2ID0gcEZyZWUtPnByZXY7CiAgICAgICAgICAgICBwRnJlZS0+cHJldi0+bmV4dCA9IHBGcmVlLT5uZXh0OwogICAgICAgICAgICAgcEFyZW5hLT5zaXplICs9IChwRnJlZS0+c2l6ZSAmIEFSRU5BX1NJWkVfTUFTSykgKyBzaXplb2YoKnBGcmVlKTsKKyAgICAgICAgICAgIGlmICghSEVBUF9Db21taXQoIHN1YmhlYXAsIChjaGFyICopcEFyZW5hICsgc2l6ZW9mKEFSRU5BX0lOVVNFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpemUgKyBIRUFQX01JTl9CTE9DS19TSVpFKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOworICAgICAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBlbHNlICAvKiBEbyBpdCB0aGUgaGFyZCB3YXkgKi8KICAgICAgICAgewpAQCAtOTE1LDYgKzkyMiw3IEBACiAgICAgICAgICAgICAgICAgIShwTmV3ID0gSEVBUF9GaW5kRnJlZUJsb2NrKCBoZWFwUHRyLCBzaXplLCAmbmV3c3ViaGVhcCApKSkKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOworICAgICAgICAgICAgICAgIFNldExhc3RFcnJvciggRVJST1JfT1VUT0ZNRU1PUlkgKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KIApAQCAtOTU5LDcgKzk2Nyw3IEBACiAgICAgcEFyZW5hLT5jYWxsZXJFSVAgPSAqKChEV09SRCAqKSZoZWFwIC0gMSk7ICAvKiBoYWNrIGhhY2sgKi8KICAgICBpZiAoIShmbGFncyAmIEhFQVBfTk9fU0VSSUFMSVpFKSkgSGVhcFVubG9jayggaGVhcCApOwogCi0gICAgZHByaW50Zl9oZWFwKCBzdGRkZWIsICJIZWFwUmVBbGxvYyglMDhseCwlMDhseCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKKyAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBSZUFsbG9jKCUwOHgsJTA4bHgsJTA4bHgsJTA4bHgpOiByZXR1cm5pbmcgJTA4bHhcbiIsCiAgICAgICAgICAgICAgICAgICBoZWFwLCBmbGFncywgKERXT1JEKXB0ciwgc2l6ZSwgKERXT1JEKShwQXJlbmEgKyAxKSApOwogICAgIHJldHVybiAoTFBWT0lEKShwQXJlbmEgKyAxKTsKIH0KQEAgLTEwMjQsNyArMTAzMiw3IEBACiAgICAgfQogICAgIGlmICghKGZsYWdzICYgSEVBUF9OT19TRVJJQUxJWkUpKSBIZWFwVW5sb2NrKCBoZWFwICk7CiAKLSAgICBkcHJpbnRmX2hlYXAoIHN0ZGRlYiwgIkhlYXBTaXplKCUwOGx4LCUwOGx4LCUwOGx4KTogcmV0dXJuaW5nICUwOGx4XG4iLAorICAgIGRwcmludGZfaGVhcCggc3RkZGViLCAiSGVhcFNpemUoJTA4eCwlMDhseCwlMDhseCk6IHJldHVybmluZyAlMDhseFxuIiwKICAgICAgICAgICAgICAgICAgIGhlYXAsIGZsYWdzLCAoRFdPUkQpcHRyLCByZXQgKTsKICAgICByZXR1cm4gcmV0OwogfQpAQCAtMTA0MCw3ICsxMDQ4LDcgQEAKIAogICAgIGlmICghaGVhcFB0ciB8fCAoaGVhcFB0ci0+bWFnaWMgIT0gSEVBUF9NQUdJQykpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJJbnZhbGlkIGhlYXAgJTA4bHghXG4iLCBoZWFwICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkludmFsaWQgaGVhcCAlMDh4IVxuIiwgaGVhcCApOwogICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZW1vcnkvbGR0LmMgYi9tZW1vcnkvbGR0LmMKaW5kZXggZTUyNjdkNy4uODczMjNkYiAxMDA2NDQKLS0tIGEvbWVtb3J5L2xkdC5jCisrKyBiL21lbW9yeS9sZHQuYwpAQCAtMjAyLDYgKzIwMiw3IEBACiAgKgogICogUHJpbnQgdGhlIGNvbnRlbnQgb2YgdGhlIExEVCBvbiBzdGRvdXQuCiAgKi8KKyNpZm5kZWYgV0lORUxJQgogdm9pZCBMRFRfUHJpbnQoIGludCBzdGFydCwgaW50IGxlbmd0aCApCiB7CiAgICAgaW50IGk7CkBAIC0yMzEsMyArMjMyLDQgQEAKICAgICAgICAgICAgICAgICBmbGFnc1swXSwgZmxhZ3NbMV0sIGZsYWdzWzJdICk7CiAgICAgfQogfQorI2VuZGlmICAvKiBXSU5FTElCICovCmRpZmYgLS1naXQgYS9tZW1vcnkvbG9jYWwuYyBiL21lbW9yeS9sb2NhbC5jCmluZGV4IGI0YWJhNDAuLmZmOWFlMjUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9sb2NhbC5jCisrKyBiL21lbW9yeS9sb2NhbC5jCkBAIC0xMSw2ICsxMSw4IEBACiAgKiBwYXJhbWV0ZXIgdGhhbiB1c3VhbC4KICAqLwogCisjaWZuZGVmIFdJTkVMSUIKKwogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKQEAgLTEwMjksOCArMTAzMSwxNSBAQAogewogICAgIFdPUkQgYXJlbmEsIHRvdGFsOwogICAgIExPQ0FMQVJFTkEgKnBBcmVuYTsKKyAgICBMT0NBTEhFQVBJTkZPICpwSW5mbzsKICAgICBjaGFyICpwdHIgPSBQVFJfU0VHX09GRl9UT19MSU4oIGRzLCAwICk7Ci0gICAgTE9DQUxIRUFQSU5GTyAqcEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApOworCisgICAgaWYgKCEocEluZm8gPSBMT0NBTF9HZXRIZWFwKCBkcyApKSkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkxPQ0FMX0hhbmRsZSglMDR4KTogTG9jYWwgaGVhcCBub3QgZm91bmRcbiIsIGRzICk7CisJTE9DQUxfUHJpbnRIZWFwKCBkcyApOworCXJldHVybiAwOworICAgIH0KIAogICAgIHRvdGFsID0gMDsKICAgICBhcmVuYSA9IHBJbmZvLT5maXJzdDsKQEAgLTEzMDksMyArMTMxOCw1IEBACiAgICAgcExvY2FsRW50cnktPndTaXplICAgICA9IHBMb2NhbEVudHJ5LT53TmV4dCAtIHBMb2NhbEVudHJ5LT5oSGFuZGxlOwogICAgIHJldHVybiBUUlVFOwogfQorCisjZW5kaWYgIC8qIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL21lbW9yeS9zZWxlY3Rvci5jIGIvbWVtb3J5L3NlbGVjdG9yLmMKaW5kZXggYjNiMTE3Zi4uNmVlZjE4NyAxMDA2NDQKLS0tIGEvbWVtb3J5L3NlbGVjdG9yLmMKKysrIGIvbWVtb3J5L3NlbGVjdG9yLmMKQEAgLTQsNiArNCw4IEBACiAgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCisjaWZuZGVmIFdJTkVMSUIKKwogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJsZHQuaCIKQEAgLTY0LDEzICs2NiwxNCBAQAogICovCiBXT1JEIEZyZWVTZWxlY3RvciggV09SRCBzZWwgKQogewotICAgIFdPUkQgaSwgY291bnQ7CisgICAgV09SRCBpLCBjb3VudCwgbmV4dHNlbDsKICAgICBsZHRfZW50cnkgZW50cnk7CiAgICAgU1RBQ0sxNkZSQU1FICpmcmFtZTsKIAogICAgIGRwcmludGZfc2VsZWN0b3IoIHN0ZGRlYiwgIkZyZWVTZWxlY3RvciglMDR4KVxuIiwgc2VsICk7CiAgICAgaWYgKElTX1NFTEVDVE9SX0ZSRUUoc2VsKSkgcmV0dXJuIHNlbDsgIC8qIGVycm9yICovCiAgICAgY291bnQgPSAoR0VUX1NFTF9MSU1JVChzZWwpID4+IDE2KSArIDE7CisgICAgbmV4dHNlbCA9IHNlbCArIChjb3VudCA8PCBfX0FIU0hJRlQpOwogICAgIG1lbXNldCggJmVudHJ5LCAwLCBzaXplb2YoZW50cnkpICk7ICAvKiBjbGVhciB0aGUgTERUIGVudHJpZXMgKi8KICAgICAvKiBGSVhNRTogaXMgaXQgY29ycmVjdCB0byBmcmVlIHRoZSB3aG9sZSBhcnJheT8gKi8KICAgICBmb3IgKGkgPSBTRUxFQ1RPUl9UT19FTlRSWShzZWwpOyBjb3VudDsgaSsrLCBjb3VudC0tKQpAQCAtODQsOCArODcsOCBAQAogICAgIGZyYW1lID0gQ1VSUkVOVF9TVEFDSzE2OwogICAgIHdoaWxlIChmcmFtZSkKICAgICB7Ci0gICAgICAgIGlmIChmcmFtZS0+ZHMgPT0gc2VsKSBmcmFtZS0+ZHMgPSAwOwotICAgICAgICBpZiAoZnJhbWUtPmVzID09IHNlbCkgZnJhbWUtPmVzID0gMDsKKyAgICAgICAgaWYgKChmcmFtZS0+ZHMgPj0gc2VsKSAmJiAoZnJhbWUtPmRzIDwgbmV4dHNlbCkpIGZyYW1lLT5kcyA9IDA7CisgICAgICAgIGlmICgoZnJhbWUtPmVzID49IHNlbCkgJiYgKGZyYW1lLT5lcyA8IG5leHRzZWwpKSBmcmFtZS0+ZXMgPSAwOwogCWZyYW1lID0gUFRSX1NFR19PRkZfVE9fTElOKGZyYW1lLT5zYXZlZF9zcywgZnJhbWUtPnNhdmVkX3NwKTsKICAgICB9CiAjZW5kaWYKQEAgLTQ4MSwzICs0ODQsNSBAQAogICAgIHJldHVybiAoKGVudHJ5IDw8IDE2KSB8ICgodW5zaWduZWQpIHB0ciAmIDB4ZmZmZikpOwogfQogI2VuZGlmCisKKyNlbmRpZiAgLyogV0lORUxJQiAqLwpkaWZmIC0tZ2l0IGEvbWlzYy9NYWtlZmlsZS5pbiBiL21pc2MvTWFrZWZpbGUuaW4KaW5kZXggNWU3NzAxZi4uYjIwMzBlZSAxMDA2NDQKLS0tIGEvbWlzYy9NYWtlZmlsZS5pbgorKysgYi9taXNjL01ha2VmaWxlLmluCkBAIC0yOCw2ICsyOCw3IEBACiAJc3RyZXNzLmMgXAogCXRvb2xoZWxwLmMgXAogCXVzZXIuYyBcCisJdmVyLmMgXAogCXczMnN5cy5jIFwKIAl3aW5zb2NrZXQuYyBcCiAJeG1hbGxvYy5jCmRpZmYgLS1naXQgYS9taXNjL2RyaXZlci5jIGIvbWlzYy9kcml2ZXIuYwppbmRleCAzMDU2N2ZhLi43ZjlmOTUxIDEwMDY0NAotLS0gYS9taXNjL2RyaXZlci5jCisrKyBiL21pc2MvZHJpdmVyLmMKQEAgLTksNyArOSw2IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbi5oIgogI2luY2x1ZGUgInVzZXIuaCIKLSNpbmNsdWRlICJkbGxzLmgiCiAjaW5jbHVkZSAiZHJpdmVyLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKICNpbmNsdWRlICJkZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9leGVjLmMgYi9taXNjL2V4ZWMuYwppbmRleCBlNjZmMDlmLi4wODViYjg2IDEwMDY0NAotLS0gYS9taXNjL2V4ZWMuYworKysgYi9taXNjL2V4ZWMuYwpAQCAtOCw3ICs4LDYgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJuZWV4ZS5oIgotI2luY2x1ZGUgImRsbHMuaCIKICNpbmNsdWRlICJzaGVsbC5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJjYWxsYmFjay5oIgpkaWZmIC0tZ2l0IGEvbWlzYy9sc3RyLmMgYi9taXNjL2xzdHIuYwppbmRleCA1YmM5MDMyLi5iODA2MDYxIDEwMDY0NAotLS0gYS9taXNjL2xzdHIuYworKysgYi9taXNjL2xzdHIuYwpAQCAtMTI1LDYgKzEyNSwxNCBAQAogLyogS0VSTkVMLjkwICovCiBJTlQgbHN0cmxlbihMUENTVFIgc3RyKQogeworICAvKiBsb29rcyB3ZWlyZCwgYnV0IHdpbjMuMSBLRVJORUwgZ290IGEgR2VuZXJhbFByb3RlY3Rpb24gaGFuZGxlcgorICAgKiBpbiBsc3RybGVuKCkgLi4uIHdlIGNoZWNrIG9ubHkgZm9yIE5VTEwgcG9pbnRlciByZWZlcmVuY2UuCisgICAqIC0gTWFyY3VzIE1laXNzbmVyCisgICAqLworICBpZiAoc3RyPT1OVUxMKSB7CisgIAlmcHJpbnRmKHN0ZGRlYiwibHN0cmxlbihOVUxMKSBjYXVnaHQsIHJldHVybmluZyAwLlxuIik7CisgIAlyZXR1cm4gMDsKKyAgfQogICByZXR1cm4gc3RybGVuKHN0cik7CiB9CiAKZGlmZiAtLWdpdCBhL21pc2MvbWFpbi5jIGIvbWlzYy9tYWluLmMKaW5kZXggM2RjZDE3MS4uMmNiMGFmNCAxMDA2NDQKLS0tIGEvbWlzYy9tYWluLmMKKysrIGIvbWlzYy9tYWluLmMKQEAgLTE5LDEzICsxOSwxMyBAQAogI2luY2x1ZGUgPFgxMS9jdXJzb3Jmb250Lmg+CiAjaW5jbHVkZSAid2luZS5oIgogI2luY2x1ZGUgIm1lc3NhZ2UuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKICNpbmNsdWRlICJtc2Rvcy5oIgogI2luY2x1ZGUgIndpbmRvd3MuaCIKICNpbmNsdWRlICJ3aW5zb2NrLmgiCiAjaW5jbHVkZSAib3B0aW9ucy5oIgogI2luY2x1ZGUgImRlc2t0b3AuaCIKICNpbmNsdWRlICJzaGVsbC5oIgotI2luY2x1ZGUgImRsbHMuaCIKICNkZWZpbmUgREVCVUdfREVGSU5FX1ZBUklBQkxFUwogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKQEAgLTY1LDYgKzY1LDcgQEAKICAgICAiQ3oiLCAgLyogTEFOR19DeiAqLwogICAgICJFbyIsICAvKiBMQU5HX0VvICovCiAgICAgIkl0IiwgIC8qIExBTkdfSXQgKi8KKyAgICAiS28iLCAgLyogTEFOR19LbyAqLwogICAgIE5VTEwKIH07CiAKQEAgLTE0Nyw3ICsxNDgsNyBAQAogICAiICAgIC1maXhlZG1hcCAgICAgICBVc2UgYSBcInN0YW5kYXJkXCIgY29sb3IgbWFwXG4iIFwKICAgIiAgICAtaWNvbmljICAgICAgICAgU3RhcnQgYXMgYW4gaWNvblxuIiBcCiAgICIgICAgLWlwYyAgICAgICAgICAgIEVuYWJsZSBJUEMgZmFjaWxpdGllc1xuIiBcCi0gICIgICAgLWxhbmd1YWdlIHh4ICAgIFNldCB0aGUgbGFuZ3VhZ2UgKG9uZSBvZiBFbixFcyxEZSxObyxGcixGaSxEYSxDeixFbyxJdClcbiIgXAorICAiICAgIC1sYW5ndWFnZSB4eCAgICBTZXQgdGhlIGxhbmd1YWdlIChvbmUgb2YgRW4sRXMsRGUsTm8sRnIsRmksRGEsQ3osRW8sSXQsS28pXG4iIFwKICAgIiAgICAtbWFuYWdlZCAgICAgICAgQWxsb3cgdGhlIHdpbmRvdyBtYW5hZ2VyIHRvIG1hbmFnZSBjcmVhdGVkIHdpbmRvd3NcbiIgXAogICAiICAgIC1tb2RlIG1vZGUgICAgICBTdGFydCBXaW5lIGluIGEgcGFydGljdWxhciBtb2RlIChzdGFuZGFyZCBvciBlbmhhbmNlZClcbiIgXAogICAiICAgIC1uYW1lIG5hbWUgICAgICBTZXQgdGhlIGFwcGxpY2F0aW9uIG5hbWVcbiIgXApAQCAtMjY1LDQ4ICsyNjYsNiBAQAogCiAjZW5kaWYKIAotI2lmbmRlZiBXSU5FTElCCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBNQUlOX1BhcnNlRExMT3B0aW9ucwotICoKLSAqIFNldCBydW50aW1lIERMTCB1c2FnZSBmbGFncwotICovCi1zdGF0aWMgQk9PTCBNQUlOX1BhcnNlRExMT3B0aW9ucyhjaGFyICpvcHRpb25zKQotewotICAgIGludCBsOwotICAgIEJVSUxUSU5fRExMICpkbGw7Ci0KLSAgICBpZiAoc3RybGVuKG9wdGlvbnMpPDMpIHJldHVybiBGQUxTRTsKLSAgICBkbwotICAgIHsKLSAgICAgICAgaWYgKCgqb3B0aW9ucyE9JysnKSAmJiAoKm9wdGlvbnMhPSctJykpIHJldHVybiBGQUxTRTsKLSAgICAgICAgaWYgKHN0cmNocihvcHRpb25zLCcsJykpIGw9c3RyY2hyKG9wdGlvbnMsJywnKS1vcHRpb25zOwotICAgICAgICBlbHNlIGw9c3RybGVuKG9wdGlvbnMpOwotICAgICAgICBmb3IgKGRsbCA9IGRsbF9idWlsdGluX3RhYmxlOyBkbGwtPm5hbWU7IGRsbCsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWxzdHJuY21waShvcHRpb25zKzEsZGxsLT5uYW1lLGwtMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCpvcHRpb25zID09ICcrJykgZGxsLT5mbGFncyAmPSB+RExMX0ZMQUdfTk9UX1VTRUQ7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRsbC0+ZmxhZ3MgJiBETExfRkxBR19BTFdBWVNfVVNFRCkgcmV0dXJuIEZBTFNFOwotICAgICAgICAgICAgICAgICAgICBkbGwtPmZsYWdzIHw9IERMTF9GTEFHX05PVF9VU0VEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWRsbC0+bmFtZSkgcmV0dXJuIEZBTFNFOwotICAgICAgICBvcHRpb25zKz1sOwotICAgIH0KLSAgICB3aGlsZSgoKm9wdGlvbnM9PScsJykmJigqKCsrb3B0aW9ucykpKTsKLSAgICBpZiAoKm9wdGlvbnMpCi0gICAgICAgIHJldHVybiBGQUxTRTsKLSAgICBlbHNlCi0gICAgICAgIHJldHVybiBUUlVFOwotfQotI2VuZGlmCi0KLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBNQUlOX1BhcnNlTGFuZ3VhZ2VPcHRpb24KQEAgLTQ0MSwyMyArNDAwLDIwIEBACiAgICAgICB9CiAKICAgICAgIGlmKE1BSU5fR2V0UmVzb3VyY2UoIGRiLCAiLmRsbCIsICZ2YWx1ZSkpCisgICAgICB7CiAjaWZuZGVmIFdJTkVMSUIKLSAgICAgICBpZihNQUlOX1BhcnNlRExMT3B0aW9ucygoY2hhciopdmFsdWUuYWRkcik9PUZBTFNFKQotICAgICAgIHsKLSAgICAgICAgIGludCBpOwotICAgICAgICAgQlVJTFRJTl9ETEwgKmRsbDsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCIlczogU3ludGF4OiAtZGxsICt4eHgsLi4uIG9yIC1kbGwgLXh4eCwuLi5cbiIsYXJndlswXSk7Ci0gICAgICAgICBmcHJpbnRmKHN0ZGVyciwiRXhhbXBsZTogLWRsbCAtb2xlMiAgICBEbyBub3QgdXNlIGVtdWxhdGVkIE9MRTIuRExMXG4iKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJBdmFpbGFibGUgRExMc1xuIik7Ci0gICAgICAgICBmb3IgKGkgPSAwLCBkbGwgPSBkbGxfYnVpbHRpbl90YWJsZTsgZGxsLT5uYW1lOyBkbGwrKykKLSAgICAgICAgICAgICBpZiAoIShkbGwtPmZsYWdzICYgRExMX0ZMQUdfQUxXQVlTX1VTRUQpKQotICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiJS05cyVjIixkbGwtPm5hbWUsICgoKCsraSklOD09MCk/J1xuJzonICcpKTsKLSAgICAgICAgIGZwcmludGYoc3RkZXJyLCJcblxuIik7Ci0gICAgICAgICBleGl0KDEpOwotICAgICAgIH0KKyAgICAgICAgICBpZiAoIUJVSUxUSU5fUGFyc2VETExPcHRpb25zKCAoY2hhciopdmFsdWUuYWRkciApKQorICAgICAgICAgIHsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIiVzOiBTeW50YXg6IC1kbGwgK3h4eCwuLi4gb3IgLWRsbCAteHh4LC4uLlxuIixhcmd2WzBdKTsKKyAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsIkV4YW1wbGU6IC1kbGwgLW9sZTIgICAgRG8gbm90IHVzZSBlbXVsYXRlZCBPTEUyLkRMTFxuIik7CisgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCJBdmFpbGFibGUgRExMczpcbiIpOworICAgICAgICAgICAgICBCVUlMVElOX1ByaW50RExMcygpOworICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgIH0KICNlbHNlCi0JCWZwcmludGYoc3RkZXJyLCItZGxsIG5vdCBzdXBwb3J0ZWQgaW4gbGlid2luZVxuIik7CisgICAgICAgICAgZnByaW50ZihzdGRlcnIsIi1kbGwgbm90IHN1cHBvcnRlZCBpbiBsaWJ3aW5lXG4iKTsKICNlbmRpZgorICAgICAgfQogfQogCiAKZGlmZiAtLWdpdCBhL21pc2Mvb2xlMm5scy5jIGIvbWlzYy9vbGUybmxzLmMKaW5kZXggZmM5MzMwMS4uNzJlNWJlZSAxMDA2NDQKLS0tIGEvbWlzYy9vbGUybmxzLmMKKysrIGIvbWlzYy9vbGUybmxzLmMKQEAgLTMzLDYgKzMzLDcgQEAKICAgICBjYXNlIExBTkdfQ3o6CiAgICAgY2FzZSBMQU5HX0VvOgogICAgIGNhc2UgTEFOR19JdDoKKyAgICBjYXNlIExBTkdfS286CiAgICAgZGVmYXVsdDoKIAlyZXR1cm4gMDsgIC8qIE5ldXRyYWwgbGFuZ3VhZ2UgKi8KICAgICB9CkBAIC02OTksMyArNzAwLDEwIEBACiAJcmV0dXJuIChsMTxsMik/IDEgOiAzOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRMb2NhbEluZm9BICAgICAgIChLRVJORUwzMi40OTkpCisgKi8KK0JPT0wgU2V0TG9jYWxlSW5mb0EoRFdPUkQgbGNpZCwgRFdPUkQgbGN0eXBlLCBMUENTVFIgZGF0YSkgeworCWZwcmludGYoc3RkbmltcCwiU2V0TG9jYWxlSW5mb0EoJWxkLCVsZCwlcylcbiIsbGNpZCxsY3R5cGUsZGF0YSk7CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS9taXNjL3JlZ2lzdHJ5LmMgYi9taXNjL3JlZ2lzdHJ5LmMKaW5kZXggN2U3MmI3MS4uMTgyZjQ3MSAxMDA2NDQKLS0tIGEvbWlzYy9yZWdpc3RyeS5jCisrKyBiL21pc2MvcmVnaXN0cnkuYwpAQCAtMzY4LDExICszNjgsMTAgQEAKIAkJc3RyY2F0KGZuLFdJTkVfUFJFRklYKTsKIAkJLyogY3JlYXRlIHRoZSBkaXJlY3RvcnkuIGRvbid0IGNhcmUgYWJvdXQgZXJyb3Jjb2Rlcy4gKi8KIAkJbWtkaXIoZm4sMDc1NSk7IC8qIGRyd3hyLXhyLXggKi8KLQkJc3RyY2F0KGZuLCIvIik7Ci0JCXN0cmNhdChmbixTQVZFX0NVUlJFTlRfVVNFUik7CisJCXN0cmNhdChmbiwiLyJTQVZFX0NVUlJFTlRfVVNFUik7CiAJCV9TYXZlU3ViUmVnKGtleV9jdXJyZW50X3VzZXIsZm4pOwogCQlmcmVlKGZuKTsKLQkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0xPQ0FMX01BQ0hJTkUpKzEpOworCQlmbj0oY2hhciopeG1hbGxvYyhzdHJsZW4ocHdkLT5wd19kaXIpK3N0cmxlbihXSU5FX1BSRUZJWCkrc3RybGVuKFNBVkVfTE9DQUxfTUFDSElORSkrMik7CiAJCXN0cmNweShmbixwd2QtPnB3X2Rpcik7CiAJCXN0cmNhdChmbixXSU5FX1BSRUZJWCIvIlNBVkVfTE9DQUxfTUFDSElORSk7CiAJCV9TYXZlU3ViUmVnKGtleV9sb2NhbF9tYWNoaW5lLGZuKTsKQEAgLTY3Niw2ICs2NzUsNyBAQAogCWlmICghX2RvX2xvYWRzdWJyZWcoRixscGtleSkpIHsKIAkJZmNsb3NlKEYpOwogCQl1bmxpbmsoZm4pOworCQlyZXR1cm47CiAJfQogCWZjbG9zZShGKTsKIH0KQEAgLTY5NCwxMiArNjk0LDEyIEBACiAJLyogbG9hZCB0aGUgdXNlciBzYXZlZCByZWdpc3RyeS4gb3ZlcndyaXRpbmcgb25seSBuZXdlciBlbnRyaWVzICovCiAJcHdkPWdldHB3dWlkKGdldHVpZCgpKTsKIAlpZiAocHdkIT1OVUxMICYmIHB3ZC0+cHdfZGlyIT1OVUxMKSB7Ci0JCWZuPShjaGFyKil4bWFsbG9jKHN0cmxlbihwd2QtPnB3X2Rpcikrc3RybGVuKFdJTkVfUFJFRklYKStzdHJsZW4oU0FWRV9DVVJSRU5UX1VTRVIpKzEpOworCQlmbj0oY2hhciopeG1hbGxvYyhzdHJsZW4ocHdkLT5wd19kaXIpK3N0cmxlbihXSU5FX1BSRUZJWCkrc3RybGVuKFNBVkVfQ1VSUkVOVF9VU0VSKSsyKTsKIAkJc3RyY3B5KGZuLHB3ZC0+cHdfZGlyKTsKIAkJc3RyY2F0KGZuLFdJTkVfUFJFRklYIi8iU0FWRV9DVVJSRU5UX1VTRVIpOwogCQlfTG9hZFN1YlJlZyhrZXlfY3VycmVudF91c2VyLGZuKTsKIAkJZnJlZShmbik7Ci0JCWZuPShjaGFyKil4bWFsbG9jKHN0cmxlbihwd2QtPnB3X2Rpcikrc3RybGVuKFdJTkVfUFJFRklYKStzdHJsZW4oU0FWRV9MT0NBTF9NQUNISU5FKSsxKTsKKwkJZm49KGNoYXIqKXhtYWxsb2Moc3RybGVuKHB3ZC0+cHdfZGlyKStzdHJsZW4oV0lORV9QUkVGSVgpK3N0cmxlbihTQVZFX0xPQ0FMX01BQ0hJTkUpKzIpOwogCQlzdHJjcHkoZm4scHdkLT5wd19kaXIpOwogCQlzdHJjYXQoZm4sV0lORV9QUkVGSVgiLyJTQVZFX0xPQ0FMX01BQ0hJTkUpOwogCQlfTG9hZFN1YlJlZyhrZXlfbG9jYWxfbWFjaGluZSxmbik7CkBAIC0xNzEwLDcgKzE3MTAsNyBAQAogCWxwa2V5ID0gbG9va3VwX2hrZXkoaGtleSk7CiAJaWYgKCFscGtleSkKIAkJcmV0dXJuIFNIRUxMX0VSUk9SX0JBREtFWTsKLQlpZiAobHBrZXktPm5yb2Z2YWx1ZXM8aVZhbHVlKQorCWlmIChscGtleS0+bnJvZnZhbHVlczw9aVZhbHVlKQogCQlyZXR1cm4gRVJST1JfTk9fTU9SRV9JVEVNUzsKIAl2YWwJPSBscGtleS0+dmFsdWVzK2lWYWx1ZTsKIApkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IGMyMDk1MzEuLjY2ZmQyNTggMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTcsNiArNyw3IEBACiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiZmlsZS5oIgogI2luY2x1ZGUgInNoZWxsLmgiCiAjaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAibmVleGUuaCIKQEAgLTE3LDE3ICsxOCwxOSBAQAogI2luY2x1ZGUgImRlYnVnLmgiCiAjaW5jbHVkZSAieG1hbGxvYy5oIgogCitleHRlcm4gSEFORExFIAlDVVJTT1JJQ09OX0xvYWRIYW5kbGVyKCBIQU5ETEUsIEhJTlNUQU5DRSwgQk9PTCk7CitleHRlcm4gV09SRCAJR2V0SWNvbklEKCBIQU5ETEUgaFJlc291cmNlLCBEV09SRCByZXNUeXBlICk7CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlEcmFnQWNjZXB0RmlsZXMJCVtTSEVMTC45XQogICovCiB2b2lkIERyYWdBY2NlcHRGaWxlcyhIV05EIGhXbmQsIEJPT0wgYikKIHsKLSAgICAvKiBmbGlwcyBXU19FWF9BQ0NFUFRGSUxFUyBiaXQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBiICovCi0gICAgZHByaW50Zl9yZWcoc3RkZGViLCJEcmFnQWNjZXB0RmlsZXMoJTA0eCwgJXUpIG9sZCBleFN0eWxlICUwOGx4XG4iLAotCQloV25kLGIsR2V0V2luZG93TG9uZyhoV25kLEdXTF9FWFNUWUxFKSk7CisgICAgV05EKiB3bmQgPSBXSU5fRmluZFduZFB0cihoV25kKTsKIAotICAgIFNldFdpbmRvd0xvbmcoaFduZCxHV0xfRVhTVFlMRSwKLQkJICBHZXRXaW5kb3dMb25nKGhXbmQsR1dMX0VYU1RZTEUpIHwgYiooTE9ORylXU19FWF9BQ0NFUFRGSUxFUyk7CisgICAgaWYoIHduZCApCisJd25kLT5kd0V4U3R5bGUgPSBiPyB3bmQtPmR3RXhTdHlsZSB8IFdTX0VYX0FDQ0VQVEZJTEVTCisJCQkgIDogd25kLT5kd0V4U3R5bGUgJiB+V1NfRVhfQUNDRVBURklMRVM7CiB9CiAKIApAQCAtMTExLDE1ICsxMTQsMjAgQEAKICAgICBjaGFyICpwLCp4OwogICAgIGxvbmcgbGVuOwogICAgIGNoYXIgc3ViY2xhc3NbMjAwXTsKKwogICAgIC8qIE9LLiBXZSBhcmUgc3VwcG9zZWQgdG8gbG9va3VwIHRoZSBwcm9ncmFtIGFzc29jaWF0ZWQgd2l0aCBscEZpbGUsCiAgICAgICogdGhlbiB0byBleGVjdXRlIGl0IHVzaW5nIHRoYXQgcHJvZ3JhbS4gSWYgbHBGaWxlIGlzIGEgcHJvZ3JhbSwKICAgICAgKiB3ZSBoYXZlIHRvIHBhc3MgdGhlIHBhcmFtZXRlcnMuIElmIGFuIGluc3RhbmNlIGlzIGFscmVhZHkgcnVubmluZywKICAgICAgKiB3ZSBtaWdodCBoYXZlIHRvIHNlbmQgRERFIGNvbW1hbmRzLgorICAgICAqCisgICAgICogRklYTUU6IFNob3VsZCBhbHNvIGxvb2sgdXAgV0lOLklOSSBbRXh0ZW5zaW9uc10gc2VjdGlvbj8KICAgICAgKi8KKwogICAgIGRwcmludGZfZXhlYyhzdGRkZWIsICJTaGVsbEV4ZWN1dGUoJTA0eCwnJXMnLCclcycsJyVzJywnJXMnLCV4KVxuIiwKIAkJaFduZCwgbHBPcGVyYXRpb24gPyBscE9wZXJhdGlvbjoiPG51bGw+IiwgbHBGaWxlID8gbHBGaWxlOiI8bnVsbD4iLAogCQlscFBhcmFtZXRlcnMgPyBscFBhcmFtZXRlcnMgOiAiPG51bGw+IiwgCiAJCWxwRGlyZWN0b3J5ID8gbHBEaXJlY3RvcnkgOiAiPG51bGw+IiwgaVNob3dDbWQpOworCiAgICAgaWYgKGxwRmlsZT09TlVMTCkgcmV0dXJuIDA7IC8qIHNob3VsZCBub3QgaGFwcGVuICovCiAgICAgaWYgKGxwT3BlcmF0aW9uPT1OVUxMKSAvKiBkZWZhdWx0IGlzIG9wZW4gKi8KICAgICAgIGxwT3BlcmF0aW9uPSJvcGVuIjsKQEAgLTE4OCw4ICsxOTYsMTAgQEAKICAqLwogSElOU1RBTkNFIEZpbmRFeGVjdXRhYmxlKExQQ1NUUiBscEZpbGUsIExQQ1NUUiBscERpcmVjdG9yeSwgTFBTVFIgbHBSZXN1bHQpCiB7Ci0JZnByaW50ZihzdGRuaW1wLCAiRmluZEV4ZWN1dGFibGUgOiBFbXB0eSBTdHViICEhIVxuIik7Ci0gICAgICAgIHJldHVybiAwOworCWZwcmludGYoc3RkbmltcCwgIkZpbmRFeGVjdXRhYmxlOiBzb21lb25lIGhhcyB0byBmaXggbWUgYW5kIHRoaXMgaXMgWU9VUiB0dXJuISA6LSlcbiIpOworCisJbHBSZXN1bHRbMF09J1wwJzsKKyAgICAgICAgcmV0dXJuIDMxOwkJLyogbm8gYXNzb2NpYXRpb24gKi8KIH0KIAogc3RhdGljIGNoYXIgQXBwTmFtZVsxMjhdLCBBcHBNaXNjWzkwNl07CkBAIC0yNTMsNDggKzI2MywzMDUgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCUV4dHJhY3RJY29uCQlbU0hFTEwuMzRdCisgKgkJCQlTSEVMTF9HZXRSZXNvdXJjZVRhYmxlCisgKgorICogRklYTUU6IEltcGxlbWVudCBHZXRQRVJlc291cmNlVGFibGUgaW4gdzMyc3lzLmMgYW5kIGNhbGwgaXQgaGVyZS4KICAqLwotSElDT04gRXh0cmFjdEljb24oSElOU1RBTkNFIGhJbnN0LCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLCBVSU5UIG5JY29uSW5kZXgpCitCWVRFKiBTSEVMTF9HZXRSZXNvdXJjZVRhYmxlKEhGSUxFIGhGaWxlKQogewotCUhJQ09OCWhJY29uID0gMDsKLQlISU5TVEFOQ0UgaEluc3QyID0gaEluc3Q7Ci0JZHByaW50Zl9yZWcoc3RkZGViLCAiRXh0cmFjdEljb24oJTA0eCwgJyVzJywgJWRcbiIsIAotCQkJaEluc3QsIGxwc3pFeGVGaWxlTmFtZSwgbkljb25JbmRleCk7Ci0gICAgICAgIHJldHVybiAwOwotCWlmIChscHN6RXhlRmlsZU5hbWUgIT0gTlVMTCkgewotCQloSW5zdDIgPSBMb2FkTW9kdWxlKGxwc3pFeGVGaWxlTmFtZSwoTFBWT0lEKS0xKTsKLQl9Ci0JaWYgKGhJbnN0MiAhPSAwICYmIG5JY29uSW5kZXggPT0gKFVJTlQpLTEpIHsKLSNpZiAwCi0JCWNvdW50ID0gR2V0UnNyY0NvdW50KGhJbnN0MiwgTkVfUlNDVFlQRV9HUk9VUF9JQ09OKTsKLQkJZHByaW50Zl9yZWcoc3RkZGViLCAiRXh0cmFjdEljb24gLy8gJyVzJyBoYXMgJWQgaWNvbnMgIVxuIiwgbHBzekV4ZUZpbGVOYW1lLCBjb3VudCk7Ci0JCXJldHVybiAoSElDT04pY291bnQ7Ci0jZW5kaWYKLQl9Ci0JaWYgKGhJbnN0MiAhPSBoSW5zdCAmJiBoSW5zdDIgIT0gMCkgewotCQlGcmVlTGlicmFyeShoSW5zdDIpOwotCX0KLQlyZXR1cm4gaEljb247CisgIHN0cnVjdCBtel9oZWFkZXJfcyBtel9oZWFkZXI7CisgIHN0cnVjdCBuZV9oZWFkZXJfcyBuZV9oZWFkZXI7CisgIGludAkJc2l6ZTsKKyAgCisgIF9sbHNlZWsoIGhGaWxlLCAwLCBTRUVLX1NFVCApOworICBpZiAoKEZJTEVfUmVhZChoRmlsZSwmbXpfaGVhZGVyLHNpemVvZihtel9oZWFkZXIpKSAhPSBzaXplb2YobXpfaGVhZGVyKSkgfHwKKyAgICAgIChtel9oZWFkZXIubXpfbWFnaWMgIT0gTVpfU0lHTkFUVVJFKSkgcmV0dXJuIChCWVRFKiktMTsKKworICBfbGxzZWVrKCBoRmlsZSwgbXpfaGVhZGVyLm5lX29mZnNldCwgU0VFS19TRVQgKTsKKyAgaWYgKEZJTEVfUmVhZCggaEZpbGUsICZuZV9oZWFkZXIsIHNpemVvZihuZV9oZWFkZXIpICkgIT0gc2l6ZW9mKG5lX2hlYWRlcikpCisgICAgICByZXR1cm4gTlVMTDsKKworICBpZiAobmVfaGVhZGVyLm5lX21hZ2ljID09IFBFX1NJR05BVFVSRSkgCisgICAgIHsgZnByaW50ZihzdGRuaW1wLCJXaW4zMiBGSVhNRTogZmlsZSAlcyBsaW5lICVpXG4iLCBfX0ZJTEVfXywgX19MSU5FX18gKTsKKyAgICAgICByZXR1cm4gTlVMTDsgfQorCisgIGlmIChuZV9oZWFkZXIubmVfbWFnaWMgIT0gTkVfU0lHTkFUVVJFKSByZXR1cm4gTlVMTDsKKworICBzaXplID0gbmVfaGVhZGVyLnJuYW1lX3RhYl9vZmZzZXQgLSBuZV9oZWFkZXIucmVzb3VyY2VfdGFiX29mZnNldDsKKworICBpZiggc2l6ZSA+IHNpemVvZihORV9UWVBFSU5GTykgKQorICAgIHsKKyAgICAgIEJZVEUqIHBUeXBlSW5mbyA9IChCWVRFKil4bWFsbG9jKHNpemUpOworCisgICAgICBpZiggIXBUeXBlSW5mbyApIHJldHVybiBOVUxMOworCisgICAgICBfbGxzZWVrKGhGaWxlLCBtel9oZWFkZXIubmVfb2Zmc2V0K25lX2hlYWRlci5yZXNvdXJjZV90YWJfb2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgICBpZiggRklMRV9SZWFkKCBoRmlsZSwgKGNoYXIqKXBUeXBlSW5mbywgc2l6ZSkgIT0gc2l6ZSApCisJeyBmcmVlKHBUeXBlSW5mbyk7IHJldHVybiBOVUxMOyB9CisgICAgICByZXR1cm4gcFR5cGVJbmZvOworICAgIH0KKyAgLyogbm8gcmVzb3VyY2VzICovCisKKyAgcmV0dXJuIE5VTEw7CiB9CiAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgkJCVNIRUxMX0xvYWRSZXNvdXJjZQorICovCitIQU5ETEUJU0hFTExfTG9hZFJlc291cmNlKEhJTlNUQU5DRSBoSW5zdCwgSEZJTEUgaEZpbGUsIE5FX05BTUVJTkZPKiBwTkluZm8sIFdPUkQgc2l6ZVNoaWZ0KQoreworIEJZVEUqCXB0cjsKKyBIQU5ETEUgaGFuZGxlID0gRGlyZWN0UmVzQWxsb2MoIGhJbnN0LCAweDEwLCAoRFdPUkQpcE5JbmZvLT5sZW5ndGggPDwgc2l6ZVNoaWZ0KTsKKworIGlmKCAocHRyID0gKEJZVEUqKUdsb2JhbExvY2soIGhhbmRsZSApKSApCisgICB7CisgICAgX2xsc2VlayggaEZpbGUsIChEV09SRClwTkluZm8tPm9mZnNldCA8PCBzaXplU2hpZnQsIFNFRUtfU0VUKTsKKyAgICAgRklMRV9SZWFkKCBoRmlsZSwgKGNoYXIqKXB0ciwgcE5JbmZvLT5sZW5ndGggPDwgc2l6ZVNoaWZ0KTsKKyAgICAgcmV0dXJuIGhhbmRsZTsKKyAgIH0KKyByZXR1cm4gKEhBTkRMRSkwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJCQlJbnRlcm5hbEV4dHJhY3RJY29uCQlbU0hFTEwuMzldCisgKgorICogVGhpcyBhYm9ydGlvbiBpcyBjYWxsZWQgZGlyZWN0bHkgYnkgUHJvZ21hbgorICovCitISUNPTiBJbnRlcm5hbEV4dHJhY3RJY29uKEhJTlNUQU5DRSBoSW5zdGFuY2UsIExQQ1NUUiBscHN6RXhlRmlsZU5hbWUsIFVJTlQgbkljb25JbmRleCwgV09SRCBuICkKK3sKKyAgSEFORExFIAloUmV0ID0gMDsKKyAgSElDT04qCVJldFB0ciA9IE5VTEw7CisgIEJZVEUqICAJcERhdGE7CisgIE9GU1RSVUNUIAlvZnM7CisgIEhGSUxFIAloRmlsZSA9IE9wZW5GaWxlKCBscHN6RXhlRmlsZU5hbWUsICZvZnMsIE9GX1JFQUQgKTsKKyAgCisgIGRwcmludGZfcmVnKHN0ZGRlYiwgIkludGVybmFsRXh0cmFjdEljb24oJTA0eCwgZmlsZSAnJXMnLCBzdGFydCBmcm9tICVkLCBleHRyYWN0ICVkXG4iLCAKKwkJICAgICAgIGhJbnN0YW5jZSwgbHBzekV4ZUZpbGVOYW1lLCBuSWNvbkluZGV4LCBuKTsKKworICBpZiggaEZpbGUgPT0gSEZJTEVfRVJST1IgfHwgIW4gKSByZXR1cm4gMDsKKworICBoUmV0ID0gR2xvYmFsQWxsb2MoIEdNRU1fTU9WRUFCTEUsIHNpemVvZihISUNPTikqbik7CisgIFJldFB0ciA9IChISUNPTiopR2xvYmFsTG9jayhoUmV0KTsKKworICpSZXRQdHIgPSAobiA9PSAweEZGRkYpPyAwOiAxOwkJCQkvKiBlcnJvciByZXR1cm4gdmFsdWVzICovCisKKyAgcERhdGEgPSBTSEVMTF9HZXRSZXNvdXJjZVRhYmxlKGhGaWxlKTsKKyAgaWYoIHBEYXRhICkgCisgICAgaWYoIHBEYXRhID09IChCWVRFKiktMSApCisgICAgICB7CisJLyogRklYTUU6IHBvc3NpYmxlIC5JQ08gZmlsZSAqLworCisJZnByaW50ZihzdGRkZWIsIkludGVybmFsRXh0cmFjdEljb246IGNhbm5vdCBoYW5kbGUgZmlsZSAlc1xuIiwgbHBzekV4ZUZpbGVOYW1lKTsKKyAgICAgIH0KKyAgICBlbHNlCQkJCQkJLyogZ290IHJlc291cmNlIHRhYmxlICovCisgICAgICB7CisJVUlOVAkgICAgIGljb25EaXJDb3VudCA9IDA7CisJVUlOVAkgICAgIGljb25Db3VudCA9IDA7CisJTkVfVFlQRUlORk8qIHBUSW5mbyA9IChORV9UWVBFSU5GTyopKHBEYXRhICsgMik7CisJTkVfTkFNRUlORk8qIHBJY29uU3RvcmFnZSA9IE5VTEw7CisJTkVfTkFNRUlORk8qIHBJY29uRGlyID0gTlVMTDsKKworCS8qIGZpbmQgaWNvbiBkaXJlY3RvcnkgYW5kIGljb24gcmVwb3NpdG9yeSAqLworCisgICAgICAgIHdoaWxlKCBwVEluZm8tPnR5cGVfaWQgJiYgIShwSWNvblN0b3JhZ2UgJiYgcEljb25EaXIpICkKKwkgIHsKKwkgICBpZiggcFRJbmZvLT50eXBlX2lkID09IE5FX1JTQ1RZUEVfR1JPVVBfSUNPTiApIAorCSAgICAgICB7CisJCSBpY29uRGlyQ291bnQgPSBwVEluZm8tPmNvdW50OworCSAgICAgICAgIHBJY29uRGlyID0gKChORV9OQU1FSU5GTyopKHBUSW5mbyArIDEpKTsKKwkJIGRwcmludGZfcmVnKHN0ZGRlYiwiXHRmb3VuZCBkaXJlY3RvcnkgLSAlaSBpY29uIGZhbWlsaWVzXG4iLCBpY29uRGlyQ291bnQpOworCSAgICAgICB9CisJICAgaWYoIHBUSW5mby0+dHlwZV9pZCA9PSBORV9SU0NUWVBFX0lDT04gKSAKKwkgICAgICAgeyAKKwkJIGljb25Db3VudCA9IHBUSW5mby0+Y291bnQ7CisJCSBwSWNvblN0b3JhZ2UgPSAoKE5FX05BTUVJTkZPKikocFRJbmZvICsgMSkpOworCQkgZHByaW50Zl9yZWcoc3RkZGViLCJcdHRvdGFsIGljb25zIC0gJWlcbiIsIGljb25Db3VudCk7CisJICAgICAgIH0KKyAgCSAgIHBUSW5mbyA9IChORV9UWVBFSU5GTyAqKSgoY2hhciopKHBUSW5mbysxKStwVEluZm8tPmNvdW50KnNpemVvZihORV9OQU1FSU5GTykpOworICAgICAgICAgIH0KKworCS8qIGxvYWQgcmVzb3VyY2VzIGFuZCBjcmVhdGUgaWNvbnMgKi8KKworICAgICAgICBpZiggcEljb25TdG9yYWdlICYmIHBJY29uRGlyICkKKworICAgICAgICAgICAgaWYoIG5JY29uSW5kZXggPT0gKFVJTlQpLTEgKSBSZXRQdHJbMF0gPSBpY29uRGlyQ291bnQ7CisJICAgIGVsc2UgaWYoIG5JY29uSW5kZXggPCBpY29uRGlyQ291bnQgKQorCSAgICAgIHsKKwkJICBIQU5ETEUgaEljb247CisJCSAgVUlOVCAgIGksIGljb247CisKKwkJICBpZiggbiA+IGljb25EaXJDb3VudCAtIG5JY29uSW5kZXggKSBuID0gaWNvbkRpckNvdW50IC0gbkljb25JbmRleDsKKworCQkgIGZvciggaSA9IG5JY29uSW5kZXg7IGkgPCBuSWNvbkluZGV4ICsgbjsgaSsrICkgCisJCSAgICAgeworCQkgICAgICAgaEljb24gPSBTSEVMTF9Mb2FkUmVzb3VyY2UoIGhJbnN0YW5jZSwgaEZpbGUsIHBJY29uRGlyICsgKGkgLSBuSWNvbkluZGV4KSwgCisJCQkJCQkJCQkJICooV09SRCopcERhdGEgKTsKKwkJICAgICAgIFJldFB0cltpLW5JY29uSW5kZXhdID0gR2V0SWNvbklEKCBoSWNvbiwgMyApOworCQkgICAgICAgR2xvYmFsRnJlZShoSWNvbik7IAorCQkgICAgIH0KKworCQkgIGZvciggaWNvbiA9IG5JY29uSW5kZXg7IGljb24gPCBuSWNvbkluZGV4ICsgbjsgaWNvbisrICkKKwkJICAgICB7CisJCSAgICAgICBoSWNvbiA9IDA7CisJCSAgICAgICBmb3IoIGkgPSAwOyBpIDwgaWNvbkNvdW50OyBpKysgKQorCQkJICBpZiggcEljb25TdG9yYWdlW2ldLmlkID09IChSZXRQdHJbaWNvbi1uSWNvbkluZGV4XSB8IDB4ODAwMCkgKQorCQkJICAgICAgaEljb24gPSBTSEVMTF9Mb2FkUmVzb3VyY2UoIGhJbnN0YW5jZSwgaEZpbGUsIHBJY29uU3RvcmFnZSArIGksCisJCQkJCQkJCQkgICAgICooV09SRCopcERhdGEgKTsKKwkgICAgICAgICAgICAgICBSZXRQdHJbaWNvbi1uSWNvbkluZGV4XSA9IChoSWNvbik/Q1VSU09SSUNPTl9Mb2FkSGFuZGxlciggaEljb24sIGhJbnN0YW5jZSwgRkFMU0UgKTowOworCQkgICAgIH0KKwkgICAgICB9CisJZnJlZShwRGF0YSk7CisgICAgICB9CisKKyBfbGNsb3NlKCBoRmlsZSApOworIAorICAvKiByZXR1cm4gYXJyYXkgd2l0aCBpY29uIGhhbmRsZXMgKi8KKworICByZXR1cm4gaFJldDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCUV4dHJhY3RJY29uIAkJW1NIRUxMLjM0XQorICovCitISUNPTiBFeHRyYWN0SWNvbihISU5TVEFOQ0UgaEluc3RhbmNlLCBMUENTVFIgbHBzekV4ZUZpbGVOYW1lLCBXT1JEIG5JY29uSW5kZXgpCit7CisgIEhBTkRMRSBoYW5kbGUgPSBJbnRlcm5hbEV4dHJhY3RJY29uKGhJbnN0YW5jZSxscHN6RXhlRmlsZU5hbWUsbkljb25JbmRleCwgMSk7CisKKyAgaWYoIGhhbmRsZSApCisgICAgeworICAgICAgSElDT04qIHB0ciA9IChISUNPTiopR2xvYmFsTG9jayhoYW5kbGUpOworICAgICAgSElDT04gIGhJY29uID0gKnB0cjsKKworICAgICAgR2xvYmFsRnJlZShoYW5kbGUpOworICAgICAgcmV0dXJuIGhJY29uOworICAgIH0KKyAgcmV0dXJuIDA7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkJCQlFeHRyYWN0QXNzb2NpYXRlZEljb24JW1NIRUxMLjM2XQogICovCiBISUNPTiBFeHRyYWN0QXNzb2NpYXRlZEljb24oSElOU1RBTkNFIGhJbnN0LExQU1RSIGxwSWNvblBhdGgsIExQV09SRCBscGlJY29uKQogewotICAgIGRwcmludGZfcmVnKHN0ZG5pbXAsICJFeHRyYWN0QXNzb2NpYXRlZEljb24gOiBFbXB0eSBTdHViICEhIVxuIik7Ci0gICAgcmV0dXJuIDA7CisgICAgSElDT04gaEljb24gPSBFeHRyYWN0SWNvbihoSW5zdCwgbHBJY29uUGF0aCwgKmxwaUljb24pOworCisgICAgLyogTUFLRUlOVFJFU09VUkNFKDIpIHNlZW1zIHRvIGJlICJkZWZhdWx0IiBpY29uIGFjY29yZGluZyB0byBQcm9nbWFuIAorICAgICAqCisgICAgICogRm9yIGRhdGEgZmlsZXMgaXQgcHJvYmFibHkgc2hvdWxkIGNhbGwgRmluZEV4ZWN1dGFibGUgYW5kIGxvYWQKKyAgICAgKiBpY29uIGZyb20gdGhlcmUuIEFzIG9mIG5vdyBGaW5kRXhlY3V0YWJsZSBpcyBlbXB0eSBzdHViLgorICAgICAqLworCisgICAgaWYoIGhJY29uIDwgMiApIGhJY29uID0gTG9hZEljb24oIGhJbnN0LCBNQUtFSU5UUkVTT1VSQ0UoMikpOworCisgICAgcmV0dXJuIGhJY29uOwogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgICAgIERvRW52aXJvbm1lbnRTdWJzdCAgICAgIFtTSEVMTC4zN10KKyAqCQkJCUZpbmRFbnZpcm9ubWVudFN0cmluZwlbU0hFTEwuMzhdCisgKgorICogUmV0dXJucyBhIHBvaW50ZXIgaW50byB0aGUgRE9TIGVudmlyb25tZW50Li4uIFVnaC4KICAqLwotRFdPUkQgRG9FbnZpcm9ubWVudFN1YnN0KExQU1RSIHN0cixXT1JEIGxlbikKK0xQU1RSIFNIRUxMX0ZpbmRTdHJpbmcoTFBTVFIgbHBFbnYsIExQQ1NUUiBlbnRyeSkKIHsKLSAgICBkcHJpbnRmX3JlZyhzdGRuaW1wLCAiRG9FbnZpcm9ubWVudFN1YnN0KCVzLCV4KTogRW1wdHkgU3R1YiAhISFcbiIsc3RyLGxlbik7Ci0gICAgcmV0dXJuIDA7CisgIFVJTlQgCWwgPSBzdHJsZW4oZW50cnkpOyAKKyAgZm9yKCA7ICpscEVudiA7IGxwRW52Kz1zdHJsZW4obHBFbnYpKzEgKQorICAgICB7CisgICAgICAgaWYoIHN0cm5jYXNlY21wKGxwRW52LCBlbnRyeSwgbCkgKSBjb250aW51ZTsKKyAgICAgICAKKyAgICAgICBpZiggISoobHBFbnYrbCkgKQorICAgICAgICAgcmV0dXJuIChscEVudiArIGwpOyAJCS8qIGVtcHR5IGVudHJ5ICovCisgICAgICAgZWxzZSBpZiAoICoobHBFbnYrbCk9PSAnPScgKQorCSByZXR1cm4gKGxwRW52ICsgbCArIDEpOworICAgICB9CisgIHJldHVybiBOVUxMOworfQorCitTRUdQVFIgRmluZEVudmlyb25tZW50U3RyaW5nKExQU1RSIHN0cikKK3sKKyBTRUdQVFIgIHNwRW52ID0gR2V0RE9TRW52aXJvbm1lbnQoKTsKKyBMUFNUUiAgbHBFbnYgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4oc3BFbnYpOworIAorIExQU1RSICBscFN0cmluZyA9IChzcEVudik/U0hFTExfRmluZFN0cmluZyhscEVudiwgc3RyKTpOVUxMOyAKKworIGlmKCBscFN0cmluZyApCQkvKiAgb2Zmc2V0IHNob3VsZCBiZSBzbWFsbCBlbm91Z2ggKi8KKyAgICAgcmV0dXJuIHNwRW52ICsgKGxwU3RyaW5nIC0gbHBFbnYpOworCisgcmV0dXJuIChTRUdQVFIpTlVMTDsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAJCURvRW52aXJvbm1lbnRTdWJzdCAgICAgIFtTSEVMTC4zN10KKyAqCisgKiBSZXBsYWNlICVLRVlXT1JEJSBpbiB0aGUgc3RyIHdpdGggdGhlIHZhbHVlIG9mIHZhcmlhYmxlIEtFWVdPUkQKKyAqIGZyb20gIkRPUyIgZW52aXJvbm1lbnQuCisgKi8KK0RXT1JEIERvRW52aXJvbm1lbnRTdWJzdChMUFNUUiBzdHIsV09SRCBsZW5ndGgpCit7CisgIExQU1RSICAgbHBFbnYgPSAoTFBTVFIpUFRSX1NFR19UT19MSU4oR2V0RE9TRW52aXJvbm1lbnQoKSk7CisgIExQU1RSICAgbHBCdWZmZXIgPSAoTFBTVFIpeG1hbGxvYyhsZW5ndGgpOworICBMUFNUUiAgIGxwc3RyID0gc3RyOworICBMUFNUUiAgIGxwYnN0ciA9IGxwQnVmZmVyOworCisgIEFuc2lUb09lbShzdHIsc3RyKTsKKworICBkcHJpbnRmX3JlZyhzdGRkZWIsIkRvRW52U3Vic3Q6IGFjY2VwdCAlcyIsIHN0cik7CisKKyAgd2hpbGUoICpscHN0ciAmJiBscGJzdHIgLSBscEJ1ZmZlciA8IGxlbmd0aCApCisgICB7CisgICAgIExQU1RSIGxwZW5kID0gbHBzdHI7CisKKyAgICAgaWYoICpscHN0ciA9PSAnJScgKQorICAgICAgIHsKKwkgIGRvIHsgbHBlbmQrKzsgfSB3aGlsZSggKmxwZW5kICYmICpscGVuZCAhPSAnJScgKTsKKwkgIGlmKCAqbHBlbmQgPT0gJyUnICYmIGxwZW5kIC0gbHBzdHIgPiAxICkJLyogZm91bmQga2V5ICovCisJICAgIHsKKwkgICAgICAgTFBTVFIgbHBLZXk7CisJICAgICAgKmxwZW5kID0gJ1wwJzsgIAorCSAgICAgICBscEtleSA9IFNIRUxMX0ZpbmRTdHJpbmcobHBFbnYsIGxwc3RyKzEpOworCSAgICAgICBpZiggbHBLZXkgKQkJCQkvKiBmb3VuZCBrZXkgdmFsdWUgKi8KKwkJIHsKKwkJICAgaW50IGwgPSBzdHJsZW4obHBLZXkpOworCisJCSAgIGlmKCBsID4gbGVuZ3RoIC0gKGxwYnN0ciAtIGxwQnVmZmVyKSAtIDEgKQorCQkgICAgIHsKKwkJICAgICAgIGZwcmludGYoc3RkbmltcCwiRmlsZSAlcywgbGluZSAlaTogRW52IHN1YnN0IGFib3J0ZWQgLSBzdHJpbmcgdG9vIHNob3J0XG4iLCAKKwkJCQkJX19GSUxFX18sIF9fTElORV9fKTsKKwkJICAgICAgKmxwZW5kID0gJyUnOworCQkgICAgICAgYnJlYWs7CisJCSAgICAgfQorCQkgICBzdHJjcHkobHBic3RyLCBscEtleSk7CisJCSAgIGxwYnN0ciArPSBsOworCQkgfQorCSAgICAgICBlbHNlIGJyZWFrOworCSAgICAgICpscGVuZCA9ICclJzsKKwkgICAgICAgbHBzdHIgPSBscGVuZCArIDE7CisJICAgIH0KKwkgIGVsc2UgYnJlYWs7CQkJCQkvKiBiYWNrIG9mZiBhbmQgd2hpbmUgKi8KKworCSAgY29udGludWU7CisgICAgICAgfSAKKworICAgICAqbHBic3RyKysgPSAqbHBzdHIrKzsKKyAgIH0KKworICpscGJzdHIgPSAnXDAnOworICBpZiggbHBzdHIgLSBzdHIgPT0gc3RybGVuKHN0cikgKQorICAgIHsKKyAgICAgIHN0cm5jcHkoc3RyLCBscEJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorICBlbHNlCisgICAgICBsZW5ndGggPSAwOworCisgIGRwcmludGZfcmVnKHN0ZGRlYiwiIHJldHVybiAlc1xuIiwgc3RyKTsKKworICBPZW1Ub0Fuc2koc3RyLHN0cik7CisgIGZyZWUobHBCdWZmZXIpOworCisgIC8qICBSZXR1cm4gc3RyIGxlbmd0aCBpbiB0aGUgTE9XT1JECisgICAqICBhbmQgMSBpbiBISVdPUkQgaWYgc3Vic3Qgd2FzIHN1Y2Nlc3NmdWwuCisgICAqLworIHJldHVybiAoRFdPUkQpTUFLRUxPTkcoc3RybGVuKHN0ciksIGxlbmd0aCk7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9taXNjL3VzZXIuYyBiL21pc2MvdXNlci5jCmluZGV4IDE5NGRhNGMuLmRjOGRjOGQgMTAwNjQ0Ci0tLSBhL21pc2MvdXNlci5jCisrKyBiL21pc2MvdXNlci5jCkBAIC0yLDYgKzIsNyBAQAogICogTWlzYy4gVVNFUiBmdW5jdGlvbnMKICAqCiAgKiBDb3B5cmlnaHQgMTk5MyBSb2JlcnQgSi4gQW1zdGFkdAorICoJICAgICAxOTk2IEFsZXggS29yb2JrYSAKICAqLwogCiAjaW5jbHVkZSA8c3RkaW8uaD4KQEAgLTksMTUgKzEwLDE5IEBACiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJ0YXNrLmgiCisjaW5jbHVkZSAicXVldWUuaCIKKyNpbmNsdWRlICJjbGFzcy5oIgogI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgImhvb2suaCIKKyNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInRvb2xoZWxwLmgiCiAKLSNkZWZpbmUgVVNFUl9IRUFQX1NJWkUgICAgICAgICAgMHgxMDAwMAotCiAjaWZuZGVmIFdJTkVMSUIKLUxQU1RSIFVTRVJfSGVhcCA9IE5VTEw7CiBXT1JEIFVTRVJfSGVhcFNlbCA9IDA7CiAKK2V4dGVybiB2b2lkIAlUSU1FUl9OdWtlVGltZXJzKEhXTkQsIEhRVUVVRSApOworZXh0ZXJuIEhUQVNLCVRBU0tfR2V0TmV4dFRhc2soSFRBU0spOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRGcmVlU3lzdGVtUmVzb3VyY2VzICAgKFVTRVIuMjg0KQpAQCAtNjYsMTkgKzcxLDcgQEAKICAgICByZXR1cm4gVFJVRTsKIH0KIAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBVU0VSX0hlYXBJbml0Ci0gKi8KLUJPT0wgVVNFUl9IZWFwSW5pdCh2b2lkKQotewotICAgIGlmICghKFVTRVJfSGVhcFNlbCA9IEdsb2JhbEFsbG9jKEdNRU1fRklYRUQsVVNFUl9IRUFQX1NJWkUpKSkgcmV0dXJuIEZBTFNFOwotICAgIFVTRVJfSGVhcCA9IEdsb2JhbExvY2soIFVTRVJfSGVhcFNlbCApOwotICAgIExvY2FsSW5pdCggVVNFUl9IZWFwU2VsLCAwLCBVU0VSX0hFQVBfU0laRS0xICk7Ci0gICAgcmV0dXJuIFRSVUU7Ci19Ci0jZW5kaWYKLQorI2VuZGlmICAvKiBXSU5FTElCICovCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFRpbWVyQ291bnQgICAoVE9PTEhFTFAuODApCkBAIC0xMTQsMyArMTA3LDM1IEBACiAKICAgICByZXR1cm4gMTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCQkJCQlVU0VSX0FwcEV4aXQKKyAqLwordm9pZCBVU0VSX0FwcEV4aXQoSFRBU0sgaFRhc2ssIEhJTlNUQU5DRSBoSW5zdGFuY2UsIEhRVUVVRSBoUXVldWUpCit7CisgICAgLyogRklYTUU6IGZsdXNoIHNlbmQgbWVzc2FnZXMgKHdoaWNoIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0KSwKKyAgICAgKiAgICAgICAgZW1wdHkgY2xpcGJvYXJkIGlmIG5lZWRlZCwgbWF5YmUgZGVzdHJveSBtZW51cyAoV2luZG93cworICAgICAqCSAgICAgIG9ubHkgY29tcGxhaW5zIGFib3V0IHRoZW0gYnV0IGRvZXMgbm90aGluZyk7CisgICAgICovCisKKyAgICBXTkQqIGRlc2t0b3AgPSBXSU5fR2V0RGVza3RvcCgpOworCisgICAgLyogUGF0Y2ggZGVza3RvcCB3aW5kb3cgcXVldWUgKi8KKyAgICBpZiggZGVza3RvcC0+aG1lbVRhc2tRID09IGhRdWV1ZSApCisJZGVza3RvcC0+aG1lbVRhc2tRID0gR2V0VGFza1F1ZXVlKFRBU0tfR2V0TmV4dFRhc2soaFRhc2spKTsKKworICAgIC8qIE51a2UgdGltZXJzICovCisKKyAgICBUSU1FUl9OdWtlVGltZXJzKCAwLCBoUXVldWUgKTsKKworICAgIEhPT0tfRnJlZVF1ZXVlSG9va3MoIGhRdWV1ZSApOworCisgICAgLyogTnVrZSBvcnBoYW5lZCB3aW5kb3dzICovCisKKyAgICBXSU5fRGVzdHJveVF1ZXVlV2luZG93cyggZGVza3RvcC0+Y2hpbGQsIGhRdWV1ZSApOworCisgICAgLyogRnJlZSB0aGUgbWVzc2FnZSBxdWV1ZSAqLworCisgICAgUVVFVUVfRGVsZXRlTXNnUXVldWUoIGhRdWV1ZSApOworfQorCmRpZmYgLS1naXQgYS9taXNjL3Zlci5jIGIvbWlzYy92ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzkwZmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzYy92ZXIuYwpAQCAtMCwwICsxLDUyMyBAQAorLyogCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBWRVIuRExMCisgKiAKKyAqIENvcHlyaWdodCAxOTk2IE1hcmN1cyBNZWlzc25lcgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgIndpbi5oIgorI2luY2x1ZGUgIndpbmVycm9yLmgiCisjaW5jbHVkZSAidmVyLmgiCisjaW5jbHVkZSAibHpleHBhbmQuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKyNpbmNsdWRlICJuZWV4ZS5oIgorI2luY2x1ZGUgInN0YWNrZnJhbWUuaCIJLyogTUFLRV9TRUdQVFIgKi8KKyNpbmNsdWRlICJzdGRkZWJ1Zy5oIgorI2luY2x1ZGUgImRlYnVnLmgiCisjaW5jbHVkZSAieG1hbGxvYy5oIgorI2luY2x1ZGUgIndpbnJlZy5oIgorCisjZGVmaW5lIExaUkVBRCh3aGF0KQlpZiAoc2l6ZW9mKCp3aGF0KSE9TFpSZWFkKGx6ZmQsTUFLRV9TRUdQVFIod2hhdCksc2l6ZW9mKCp3aGF0KSkpIHJldHVybiAwOworCitpbnQKK3JlYWRfbmVfaGVhZGVyKEhGSUxFIGx6ZmQsc3RydWN0IG5lX2hlYWRlcl9zICpuZWhkKSB7CisJc3RydWN0CW16X2hlYWRlcl9zCW16aDsKKworCUxaU2VlayhsemZkLDAsU0VFS19TRVQpOworCWlmIChzaXplb2YobXpoKSE9TFpSZWFkKGx6ZmQsTUFLRV9TRUdQVFIoJm16aCksc2l6ZW9mKG16aCkpKQorCQlyZXR1cm4gMDsKKwlpZiAobXpoLm16X21hZ2ljIT1NWl9TSUdOQVRVUkUpCisJCXJldHVybiAwOworCUxaU2VlayhsemZkLG16aC5uZV9vZmZzZXQsU0VFS19TRVQpOworCUxaUkVBRChuZWhkKTsKKwlpZiAobmVoZC0+bmVfbWFnaWMgPT0gTkVfU0lHTkFUVVJFKSB7CisJCUxaU2VlayhsemZkLG16aC5uZV9vZmZzZXQsU0VFS19TRVQpOworCQlyZXR1cm4gMTsKKwl9CisJLyogbXVzdCBoYW5kbGUgUEUgZmlsZXMgdG9vLiBMYXRlci4gKi8KKwlyZXR1cm4gMDsKK30KKworCitpbnQKK2ZpbmRfbmVfcmVzb3VyY2UoCisJSEZJTEUgbHpmZCxzdHJ1Y3QgbmVfaGVhZGVyX3MgKm5laGQsU0VHUFRSIHR5cGVpZCxTRUdQVFIgcmVzaWQsCisJQllURSAqKnJlc2RhdGEsaW50ICpyZXNsZW4sRFdPUkQgKm9mZgorKSB7CisJTkVfVFlQRUlORk8JdGk7CisJTkVfTkFNRUlORk8Jbmk7CisJaW50CQlpOworCVdPUkQJCXNoaWZ0Y291bnQ7CisJRFdPUkQJCW5laGRvZmZzZXQ7CisKKwluZWhkb2Zmc2V0PUxaU2VlayhsemZkLG5laGQtPnJlc291cmNlX3RhYl9vZmZzZXQsU0VFS19DVVIpOworCUxaUkVBRCgmc2hpZnRjb3VudCk7CisJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInNoaWZ0Y291bnQgaXMgJWRcbiIsc2hpZnRjb3VudCk7CisJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInJlYWRpbmcgcmVzb3VyY2UgdHlwZWluZm8gZGlyLlxuIik7CisKKwlpZiAoIUhJV09SRCh0eXBlaWQpKSB0eXBlaWQgPSAoU0VHUFRSKSgoV09SRCl0eXBlaWQgfCAweDgwMDApOworCWlmICghSElXT1JEKHJlc2lkKSkgIHJlc2lkICA9IChTRUdQVFIpKChXT1JEKXJlc2lkIHwgMHg4MDAwKTsKKwl3aGlsZSAoMSkgeworCQlpbnQJc2tpcGZsYWc7CisKKwkJTFpSRUFEKCZ0aSk7CisJCWlmICghdGkudHlwZV9pZCkKKwkJCXJldHVybiAwOworCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGVyciwiICAgIHRpLnR5cGVpZCA9JTA0eCxjb3VudD0lZFxuIix0aS50eXBlX2lkLHRpLmNvdW50KTsKKwkJc2tpcGZsYWc9MDsKKwkJaWYgKCFISVdPUkQodHlwZWlkKSkgeworCQkJaWYgKCh0aS50eXBlX2lkJjB4ODAwMCkmJih0eXBlaWQhPXRpLnR5cGVfaWQpKQorCQkJCXNraXBmbGFnPTE7CisJCX0gZWxzZSB7CisJCQlpZiAodGkudHlwZV9pZCAmIDB4ODAwMCkgeworCQkJCXNraXBmbGFnPTE7IAorCQkJfSBlbHNlIHsKKwkJCQlCWVRFCWxlbjsKKwkJCQljaGFyCSpzdHI7CisJCQkJRFdPUkQJd2hlcmVsZWZ0OworCisJCQkJd2hlcmVsZWZ0PUxaU2VlaygKKwkJCQkJbHpmZCwKKwkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K3RpLnR5cGVfaWQsCisJCQkJCVNFRUtfU0VUCisJCQkJKTsKKwkJCQlMWlJFQUQoJmxlbik7CisJCQkJc3RyPXhtYWxsb2MobGVuKTsKKwkJCQlpZiAobGVuIT1MWlJlYWQobHpmZCxNQUtFX1NFR1BUUihzdHIpLGxlbikpCisJCQkJCXJldHVybiAwOworCQkJCWRwcmludGZfcmVzb3VyY2Uoc3RkZXJyLCJyZWFkICVzIHRvIGNvbXBhcmUgaXQgd2l0aCAlc1xuIiwKKwkJCQkJc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpCisJCQkJKTsKKwkJCQlpZiAobHN0cmNtcGkoc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpKSkKKwkJCQkJc2tpcGZsYWc9MTsKKwkJCQlmcmVlKHN0cik7CisJCQkJTFpTZWVrKGx6ZmQsd2hlcmVsZWZ0LFNFRUtfU0VUKTsKKwkJCX0KKwkJfQorCQlpZiAoc2tpcGZsYWcpIHsKKwkJCUxaU2VlayhsemZkLHRpLmNvdW50KnNpemVvZihuaSksU0VFS19DVVIpOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChpPTA7aTx0aS5jb3VudDtpKyspIHsKKwkJCVdPUkQJKnJkYXRhOworCQkJaW50CWxlbjsKKworCQkJTFpSRUFEKCZuaSk7CisJCQlkcHJpbnRmX3Jlc291cmNlKHN0ZGVyciwiCW5pLmlkPSU0eCxvZmZzZXQ9JWQsbGVuZ3RoPSVkXG4iLAorCQkJCW5pLmlkLG5pLm9mZnNldCxuaS5sZW5ndGgKKwkJCSk7CisJCQlza2lwZmxhZz0xOworCQkJaWYgKCFISVdPUkQocmVzaWQpKSB7CisJCQkJaWYgKG5pLmlkID09IHJlc2lkKQorCQkJCQlza2lwZmxhZz0wOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIShuaS5pZCAmIDB4ODAwMCkpIHsKKwkJCQkJQllURQlsZW47CisJCQkJCWNoYXIJKnN0cjsKKwkJCQkJRFdPUkQJd2hlcmVsZWZ0OworCisJCQkJCXdoZXJlbGVmdD1MWlNlZWsoCisJCQkJCQlsemZkLAorCQkJCQkJbmVoZG9mZnNldCtuZWhkLT5yZXNvdXJjZV90YWJfb2Zmc2V0K25pLmlkLAorCQkJCQkJU0VFS19TRVQKKwkJCQkJKTsKKwkJCQkJTFpSRUFEKCZsZW4pOworCQkJCQlzdHI9eG1hbGxvYyhsZW4pOworCQkJCQlpZiAobGVuIT1MWlJlYWQobHpmZCxNQUtFX1NFR1BUUihzdHIpLGxlbikpCisJCQkJCQlyZXR1cm4gMDsKKwkJCQkJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInJlYWQgJXMgdG8gY29tcGFyZSBpdCB3aXRoICVzXG4iLAorCQkJCQkJc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpCisJCQkJCSk7CisJCQkJCWlmICghbHN0cmNtcGkoc3RyLChjaGFyKilQVFJfU0VHX1RPX0xJTih0eXBlaWQpKSkKKwkJCQkJCXNraXBmbGFnPTA7CisJCQkJCWZyZWUoc3RyKTsKKwkJCQkJTFpTZWVrKGx6ZmQsd2hlcmVsZWZ0LFNFRUtfU0VUKTsKKwkJCQl9CisJCQl9CisJCQlpZiAoc2tpcGZsYWcpCisJCQkJY29udGludWU7CisJCQlMWlNlZWsobHpmZCwoKGludCluaS5vZmZzZXQ8PHNoaWZ0Y291bnQpLFNFRUtfU0VUKTsKKwkJCSpvZmYJPSAoaW50KW5pLm9mZnNldDw8c2hpZnRjb3VudDsKKwkJCWxlbgk9IG5pLmxlbmd0aDw8c2hpZnRjb3VudDsKKwkJCXJkYXRhPShXT1JEKil4bWFsbG9jKGxlbik7CisJCQlpZiAobGVuIT1MWlJlYWQobHpmZCxNQUtFX1NFR1BUUihyZGF0YSksbGVuKSkgeworCQkJCWZyZWUocmRhdGEpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJZHByaW50Zl9yZXNvdXJjZShzdGRlcnIsInJlc291cmNlIGZvdW5kLlxuIik7CisJCQkqcmVzZGF0YT0gKEJZVEUqKXJkYXRhOworCQkJKnJlc2xlbgk9IGxlbjsKKwkJCXJldHVybiAxOworCQl9CisJfQorfQorCitEV09SRAorR2V0RmlsZVJlc291cmNlU2l6ZShMUENTVFIgZmlsZW5hbWUsU0VHUFRSIHJlc3R5cGUsU0VHUFRSIHJlc2lkLExQRFdPUkQgb2ZmKSB7CisJSEZJTEUJbHpmZDsKKwlPRlNUUlVDVAlvZnM7CisJQllURQkqcmVzZGF0YTsKKwlpbnQJcmVzbGVuOworCXN0cnVjdAluZV9oZWFkZXJfcwluZWhkOworCisJZnByaW50ZihzdGRlcnIsIkdldEZpbGVSZXNvdXJjZVNpemUoJXMsJWx4LCVseCwlcClcbiIsCisJCWZpbGVuYW1lLChMT05HKXJlc3R5cGUsKExPTkcpcmVzaWQsb2ZmCisJKTsKKwlsemZkPUxaT3BlbkZpbGUoZmlsZW5hbWUsJm9mcyxPRl9SRUFEKTsKKwlpZiAobHpmZD09MCkKKwkJcmV0dXJuIDA7CisJaWYgKCFyZWFkX25lX2hlYWRlcihsemZkLCZuZWhkKSkgeworCQlMWkNsb3NlKGx6ZmQpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKCFmaW5kX25lX3Jlc291cmNlKGx6ZmQsJm5laGQscmVzdHlwZSxyZXNpZCwmcmVzZGF0YSwmcmVzbGVuLG9mZikpIHsKKwkJTFpDbG9zZShsemZkKTsKKwkJcmV0dXJuIDA7CisJfQorCWZyZWUocmVzZGF0YSk7CisJTFpDbG9zZShsemZkKTsKKwlyZXR1cm4gcmVzbGVuOworfQorCitEV09SRAorR2V0RmlsZVJlc291cmNlKExQQ1NUUiBmaWxlbmFtZSxTRUdQVFIgcmVzdHlwZSxTRUdQVFIgcmVzaWQsCisJCURXT1JEIG9mZixEV09SRCBkYXRhbGVuLExQVk9JRCBkYXRhCispIHsKKwlIRklMRQlsemZkOworCU9GU1RSVUNUCW9mczsKKwlCWVRFCSpyZXNkYXRhOworCWludAlyZXNsZW47CisJc3RydWN0CW5lX2hlYWRlcl9zCW5laGQ7CisJZnByaW50ZihzdGRlcnIsIkdldEZpbGVSZXNvdXJjZSglcywlbHgsJWx4LCVsZCwlbGQsJXApXG4iLAorCQlmaWxlbmFtZSwoTE9ORylyZXN0eXBlLChMT05HKXJlc2lkLG9mZixkYXRhbGVuLGRhdGEKKwkpOworCisJbHpmZD1MWk9wZW5GaWxlKGZpbGVuYW1lLCZvZnMsT0ZfUkVBRCk7CisJaWYgKGx6ZmQ9PTApCisJCXJldHVybiAwOworCWlmICghb2ZmKSB7CisJCWlmICghcmVhZF9uZV9oZWFkZXIobHpmZCwmbmVoZCkpIHsKKwkJCUxaQ2xvc2UobHpmZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWZpbmRfbmVfcmVzb3VyY2UobHpmZCwmbmVoZCxyZXN0eXBlLHJlc2lkLCZyZXNkYXRhLCZyZXNsZW4sJm9mZikpIHsKKwkJCUxaQ2xvc2UobHpmZCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlmcmVlKHJlc2RhdGEpOworCX0KKwlMWlNlZWsobHpmZCxvZmYsU0VFS19TRVQpOworCWlmIChyZXNsZW4+ZGF0YWxlbikKKwkJcmVzbGVuPWRhdGFsZW47CisJTFpSZWFkKGx6ZmQsTUFLRV9TRUdQVFIoZGF0YSkscmVzbGVuKTsKKwlMWkNsb3NlKGx6ZmQpOworCXJldHVybiByZXNsZW47Cit9CisKK0RXT1JECitHZXRGaWxlVmVyc2lvbkluZm9TaXplKExQQ1NUUiBmaWxlbmFtZSxMUERXT1JEIGhhbmRsZSkgeworCURXT1JECWxlbixyZXQ7CisJQllURQlidWZbNzJdOworCVZTX0ZJWEVERklMRUlORk8gKnZmZmk7CisKKwlmcHJpbnRmKHN0ZGVyciwiR2V0RmlsZVZlcnNpb25JbmZvU2l6ZSglcywlcClcbiIsZmlsZW5hbWUsaGFuZGxlKTsKKworCWxlbj1HZXRGaWxlUmVzb3VyY2VTaXplKGZpbGVuYW1lLFZTX0ZJTEVfSU5GTyxWU19WRVJTSU9OX0lORk8saGFuZGxlKTsKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisJcmV0PUdldEZpbGVSZXNvdXJjZSgKKwkJZmlsZW5hbWUsVlNfRklMRV9JTkZPLFZTX1ZFUlNJT05fSU5GTywqaGFuZGxlLHNpemVvZihidWYpLGJ1ZgorCSk7CisJaWYgKCFyZXQpCisJCXJldHVybiAwOworCisJdmZmaT0oVlNfRklYRURGSUxFSU5GTyopKGJ1ZisweDE0KTsKKwlpZiAodmZmaS0+ZHdTaWduYXR1cmUgIT0gVlNfRkZJX1NJR05BVFVSRSkKKwkJcmV0dXJuIDA7CisJaWYgKCooV09SRCopYnVmIDwgbGVuKQorCQlsZW4gPSAqKFdPUkQqKWJ1ZjsKKwlmcHJpbnRmKHN0ZGVyciwiLT5zdHJ1Y3Zlcj0lbGQuJWxkLGZpbGV2ZXI9JWxkLiVsZCxwcm9kdWN0dmVyPSVsZC4lbGQsZmxhZ21hc2s9JWx4LGZsYWdzPSVseCxPUz0iLAorCQkodmZmaS0+ZHdTdHJ1Y1ZlcnNpb24+PjE2KSx2ZmZpLT5kd1N0cnVjVmVyc2lvbiYweEZGRkYsCisJCXZmZmktPmR3RmlsZVZlcnNpb25NUyx2ZmZpLT5kd0ZpbGVWZXJzaW9uTFMsCisJCXZmZmktPmR3UHJvZHVjdFZlcnNpb25NUyx2ZmZpLT5kd1Byb2R1Y3RWZXJzaW9uTFMsCisJCXZmZmktPmR3RmlsZUZsYWdzTWFzayx2ZmZpLT5kd0ZpbGVGbGFncworCSk7CisJc3dpdGNoICh2ZmZpLT5kd0ZpbGVPUyYweEZGRkYwMDAwKSB7CisJY2FzZSBWT1NfRE9TOmZwcmludGYoc3RkZXJyLCJET1MsIik7YnJlYWs7CisJY2FzZSBWT1NfT1MyMTY6ZnByaW50ZihzdGRlcnIsIk9TLzItMTYsIik7YnJlYWs7CisJY2FzZSBWT1NfT1MyMzI6ZnByaW50ZihzdGRlcnIsIk9TLzItMzIsIik7YnJlYWs7CisJY2FzZSBWT1NfTlQ6ZnByaW50ZihzdGRlcnIsIk5ULCIpO2JyZWFrOworCWNhc2UgVk9TX1VOS05PV046CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsIlVOS05PV04oJWxkKSwiLHZmZmktPmR3RmlsZU9TJjB4RkZGRjAwMDApO2JyZWFrOworCX0KKwlzd2l0Y2ggKHZmZmktPmR3RmlsZU9TICYgMHhGRkZGKSB7CisJY2FzZSBWT1NfX0JBU0U6ZnByaW50ZihzdGRlcnIsIkJBU0UiKTticmVhazsKKwljYXNlIFZPU19fV0lORE9XUzE2OmZwcmludGYoc3RkZXJyLCJXSU4xNiIpO2JyZWFrOworCWNhc2UgVk9TX19XSU5ET1dTMzI6ZnByaW50ZihzdGRlcnIsIldJTjMyIik7YnJlYWs7CisJY2FzZSBWT1NfX1BNMTY6ZnByaW50ZihzdGRlcnIsIlBNMTYiKTticmVhazsKKwljYXNlIFZPU19fUE0zMjpmcHJpbnRmKHN0ZGVyciwiUE0zMiIpO2JyZWFrOworCWRlZmF1bHQ6ZnByaW50ZihzdGRlcnIsIlVOS05PV04oJWxkKSIsdmZmaS0+ZHdGaWxlT1MmMHhGRkZGKTticmVhazsKKwl9CisJc3dpdGNoICh2ZmZpLT5kd0ZpbGVUeXBlKSB7CisJZGVmYXVsdDoKKwljYXNlIFZGVF9VTktOT1dOOgorCQlmcHJpbnRmKHN0ZGVyciwiZmlsZXR5cGU9VW5rbm93biglbGQpIix2ZmZpLT5kd0ZpbGVUeXBlKTsKKwkJYnJlYWs7CisJY2FzZSBWRlRfQVBQOmZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1BUFAiKTticmVhazsKKwljYXNlIFZGVF9ETEw6ZnByaW50ZihzdGRlcnIsImZpbGV0eXBlPURMTCIpO2JyZWFrOworCWNhc2UgVkZUX0RSVjoKKwkJZnByaW50ZihzdGRlcnIsImZpbGV0eXBlPURSViwiKTsKKwkJc3dpdGNoKHZmZmktPmR3RmlsZVN1YnR5cGUpIHsKKwkJZGVmYXVsdDoKKwkJY2FzZSBWRlQyX1VOS05PV046CisJCQlmcHJpbnRmKHN0ZGVyciwiVU5LTk9XTiglbGQpIix2ZmZpLT5kd0ZpbGVTdWJ0eXBlKTsKKwkJCWJyZWFrOworCQljYXNlIFZGVDJfRFJWX1BSSU5URVI6CisJCQlmcHJpbnRmKHN0ZGVyciwiUFJJTlRFUiIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZUMl9EUlZfS0VZQk9BUkQ6CisJCQlmcHJpbnRmKHN0ZGVyciwiS0VZQk9BUkQiKTsKKwkJCWJyZWFrOworCQljYXNlIFZGVDJfRFJWX0xBTkdVQUdFOgorCQkJZnByaW50ZihzdGRlcnIsIkxBTkdVQUdFIik7CisJCQlicmVhazsKKwkJY2FzZSBWRlQyX0RSVl9ESVNQTEFZOgorCQkJZnByaW50ZihzdGRlcnIsIkRJU1BMQVkiKTsKKwkJCWJyZWFrOworCQljYXNlIFZGVDJfRFJWX01PVVNFOgorCQkJZnByaW50ZihzdGRlcnIsIk1PVVNFIik7CisJCQlicmVhazsKKwkJY2FzZSBWRlQyX0RSVl9ORVRXT1JLOgorCQkJZnByaW50ZihzdGRlcnIsIk5FVFdPUksiKTsKKwkJCWJyZWFrOworCQljYXNlIFZGVDJfRFJWX1NZU1RFTToKKwkJCWZwcmludGYoc3RkZXJyLCJTWVNURU0iKTsKKwkJCWJyZWFrOworCQljYXNlIFZGVDJfRFJWX0lOU1RBTExBQkxFOgorCQkJZnByaW50ZihzdGRlcnIsIklOU1RBTExBQkxFIik7CisJCQlicmVhazsKKwkJY2FzZSBWRlQyX0RSVl9TT1VORDoKKwkJCWZwcmludGYoc3RkZXJyLCJTT1VORCIpOworCQkJYnJlYWs7CisJCWNhc2UgVkZUMl9EUlZfQ09NTToKKwkJCWZwcmludGYoc3RkZXJyLCJDT01NIik7CisJCQlicmVhazsKKwkJY2FzZSBWRlQyX0RSVl9JTlBVVE1FVEhPRDoKKwkJCWZwcmludGYoc3RkZXJyLCJJTlBVVE1FVEhPRCIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRlRfRk9OVDoKKwkJZnByaW50ZihzdGRlcnIsImZpbGV0eXBlPUZPTlQuIik7CisJCXN3aXRjaCAodmZmaS0+ZHdGaWxlU3VidHlwZSkgeworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsIlVOS05PV04oJWxkKSIsdmZmaS0+ZHdGaWxlU3VidHlwZSk7CisJCQlicmVhazsKKwkJY2FzZSBWRlQyX0ZPTlRfUkFTVEVSOmZwcmludGYoc3RkZXJyLCJSQVNURVIiKTticmVhazsKKwkJY2FzZSBWRlQyX0ZPTlRfVkVDVE9SOmZwcmludGYoc3RkZXJyLCJWRUNUT1IiKTticmVhazsKKwkJY2FzZSBWRlQyX0ZPTlRfVFJVRVRZUEU6ZnByaW50ZihzdGRlcnIsIlRSVUVUWVBFIik7YnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBWRlRfVlhEOmZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1WWEQiKTticmVhazsKKwljYXNlIFZGVF9TVEFUSUNfTElCOmZwcmludGYoc3RkZXJyLCJmaWxldHlwZT1TVEFUSUNfTElCIik7YnJlYWs7CisJfQorCWZwcmludGYoc3RkZXJyLCJmaWxlZGF0YT0lbHguJWx4XG4iLHZmZmktPmR3RmlsZURhdGVNUyx2ZmZpLT5kd0ZpbGVEYXRlTFMpOworCXJldHVybiBsZW47Cit9CisKK0RXT1JEIAorR2V0RmlsZVZlcnNpb25JbmZvKExQQ1NUUiBmaWxlbmFtZSxEV09SRCBoYW5kbGUsRFdPUkQgZGF0YXNpemUsTFBWT0lEIGRhdGEpIHsKKwlmcHJpbnRmKHN0ZGVyciwiR2V0RmlsZVZlcnNpb25JbmZvKCVzLCVsZCwlbGQsJXApXG4tPiIsCisJCWZpbGVuYW1lLGhhbmRsZSxkYXRhc2l6ZSxkYXRhCisJKTsKKwlyZXR1cm4gR2V0RmlsZVJlc291cmNlKAorCQlmaWxlbmFtZSxWU19GSUxFX0lORk8sVlNfVkVSU0lPTl9JTkZPLGhhbmRsZSxkYXRhc2l6ZSxkYXRhCisJKTsKK30KKworRFdPUkQgCitWZXJGaW5kRmlsZSgKKwlVSU5UIGZsYWdzLExQQ1NUUiBmaWxlbmFtZSxMUENTVFIgd2luZGlyLExQQ1NUUiBhcHBkaXIsCisJTFBTVFIgY3VyZGlyLFVJTlQgKmN1cmRpcmxlbixMUFNUUiBkZXN0ZGlyLFVJTlQqZGVzdGRpcmxlbgorKSB7CisJZnByaW50ZihzdGRlcnIsIlZlckZpbmRGaWxlKCV4LCVzLCVzLCVzLCVwLCVkLCVwLCVkKVxuIiwKKwkJZmxhZ3MsZmlsZW5hbWUsd2luZGlyLGFwcGRpcixjdXJkaXIsKmN1cmRpcmxlbixkZXN0ZGlyLCpkZXN0ZGlybGVuCisJKTsKKwlzdHJjcHkoY3VyZGlyLCJaOlxcUk9PVFxcLldJTkVcXCIpOy8qRklYTUUqLworCSpjdXJkaXJsZW49c3RybGVuKGN1cmRpcik7CisJc3RyY3B5KGRlc3RkaXIsIlo6XFxST09UXFwuV0lORVxcIik7LypGSVhNRSovCisJKmRlc3RkaXJsZW49c3RybGVuKGRlc3RkaXIpOworCXJldHVybiAwOworfQorCitEV09SRAorVmVySW5zdGFsbEZpbGUoCisJVUlOVCBmbGFncyxMUENTVFIgc3JjZmlsZW5hbWUsTFBDU1RSIGRlc3RmaWxlbmFtZSxMUENTVFIgc3JjZGlyLAorCUxQQ1NUUiBkZXN0ZGlyLExQU1RSIHRtcGZpbGUsVUlOVCp0bXBmaWxlbGVuCispIHsKKwlmcHJpbnRmKHN0ZGVyciwiVmVySW5zdGFsbEZpbGUoJXgsJXMsJXMsJXMsJXMsJXAsJWQpXG4iLAorCQlmbGFncyxzcmNmaWxlbmFtZSxkZXN0ZmlsZW5hbWUsc3JjZGlyLGRlc3RkaXIsdG1wZmlsZSwqdG1wZmlsZWxlbgorCSk7CisJcmV0dXJuIFZJRl9TUkNPTEQ7Cit9CisKKy8qIEZJWE1FOiBUaGlzIHRhYmxlIHNob3VsZCwgb2YgY291cnNlLCBiZSBsYW5ndWFnZSBkZXBlbmRlbmQgKi8KK3N0YXRpYyBzdHJ1Y3QgbWFwX2lkMnN0ciB7CisJVUlOVAlsYW5naWQ7CisJY2hhcgkqbGFuZ25hbWU7Cit9IGxhbmd1YWdlc1tdPXsKKwl7MHgwNDAxLCJBcmFiaXNjaCJ9LAorCXsweDA0MDIsIkJ1bGdhcmlzY2gifSwKKwl7MHgwNDAzLCJLYXRhbGFuaXNjaCJ9LAorCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAorCXsweDA0MDUsIlRzY2hlY2lzY2gifSwKKwl7MHgwNDA2LCJE5G5pc2NoIn0sCisJezB4MDQwNywiRGV1dHNjaCJ9LAorCXsweDA0MDgsIkdyaWVjaGlzY2gifSwKKwl7MHgwNDA5LCJBbWVyaWthbmlzY2hlcyBFbmdsaXNjaCJ9LAorCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAorCXsweDA0MEIsIkZpbm5pc2NoIn0sCisJezB4MDQwQywiRnJhbnr2c2lzY2gifSwKKwl7MHgwNDBELCJIZWJy5GlzY2gifSwKKwl7MHgwNDBFLCJVbmdhcmlzY2gifSwKKwl7MHgwNDBGLCJJc2zkbmRpc2NoIn0sCisJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKKwl7MHgwNDExLCJKYXBhbmlzY2gifSwKKwl7MHgwNDEyLCJLb3JlYW5pc2NoIn0sCisJezB4MDQxMywiTmllZGVybORuZGlzY2gifSwKKwl7MHgwNDE0LCJOb3J3ZWdpc2NoLUJva21hbCJ9LAorCXsweDA0MTUsIlBvbG5pc2NoIn0sCisJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKKwl7MHgwNDE3LCJS5HRvcm9tYW5pc2NoIn0sCisJezB4MDQxOCwiUnVt5G5pc2NoIn0sCisJezB4MDQxOSwiUnVzc2lzY2gifSwKKwl7MHgwNDFBLCJLcm9hdG9zZXJiaXNjaCAobGF0ZWluaXNjaCkifSwKKwl7MHgwNDFCLCJTbG93ZW5pc2NoIn0sCisJezB4MDQxQywiQWxiYW5pc2NoIn0sCisJezB4MDQxRCwiU2Nod2VkaXNjaCJ9LAorCXsweDA0MUUsIlRoYWkifSwKKwl7MHgwNDFGLCJU/HJraXNjaCJ9LAorCXsweDA0MjAsIlVyZHUifSwKKwl7MHgwNDIxLCJCYWhhc2EifSwKKwl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKKwl7MHgwODA3LCJTY2h3ZWl6ZXJkZXV0c2NoIn0sCisJezB4MDgwOSwiQnJpdGlzY2hlcyBFbmdsaXNjaCJ9LAorCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKKwl7MHgwODBDLCJCZWxnaXNjaGVzIEZyYW569nNpc2NoIn0sCisJezB4MDgxMCwiU2Nod2VpemVyaXNjaGVzIEl0YWxpZW5pc2NoIn0sCisJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJs5G5kaXNjaCJ9LAorCXsweDA4MTQsIk5vcmd3ZWdpc2NoLU55bm9yc2sifSwKKwl7MHgwODE2LCJQb3J0dWdpZXNpc2NoIn0sCisJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKKwl7MHgwQzFDLCJLYW5hZGlzY2hlcyBGcmFuevZzaXNjaCJ9LAorCXsweDEwMEMsIlNjaHdlaXplcmlzY2hlcyBGcmFuevZzaXNjaCJ9LAorCXsweDAwMDAsIlVuYmVrYW5udCJ9LAorfTsKKworCitEV09SRAorVmVyTGFuZ3VhZ2VOYW1lKFVJTlQgbGFuZ2lkLExQU1RSIGxhbmduYW1lLFVJTlQgbGFuZ25hbWVsZW4pIHsKKwlpbnQJaTsKKworCWZwcmludGYoc3RkZXJyLCJWZXJMYW5ndWFnZU5hbWUoJWQsJXAsJWQpXG4iLGxhbmdpZCxsYW5nbmFtZSxsYW5nbmFtZWxlbik7CisJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCisJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCisJCQlicmVhazsKKwlzdHJuY3B5KGxhbmduYW1lLGxhbmd1YWdlc1tpXS5sYW5nbmFtZSxsYW5nbmFtZWxlbik7CisJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKKwlyZXR1cm4gc3RybGVuKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSk7Cit9CisKK3N0cnVjdCBkYiB7CisJV09SRAluZXh0b2ZmOworCVdPUkQJZGF0YWxlbjsKKy8qIGluIG1lbW9yeSBzdHJ1Y3R1cmUuLi4gKi8KKwljaGFyCW5hbWVbMV07IAkvKiBwYWRkZWQgdG8gZHdvcmQgYWxpZ25tZW50ICovCisvKiAuLi4uIAorCWNoYXIJZGF0YVtkYXRhbGVuXTsgICAgIHBhZGRlZCB0byBkd29yZCBhbGlnbmVtbnQKKwlCWVRFCXN1YmRpcmRhdGFbXTsgICAgICB1bnRpbCBuZXh0b2ZmCisgKi8KK307CisKK3N0YXRpYyBCWVRFKgorX2ZpbmRfZGF0YShCWVRFICpibG9jayxMUENTVFIgc3RyKSB7CisJY2hhcgkqbmV4dHNsYXNoOworCWludAlzdWJzdHJsZW47CisJc3RydWN0CWRiCSpkYjsKKworCXdoaWxlICgqc3RyICYmICpzdHI9PSdcXCcpCisJCXN0cisrOworCWlmIChOVUxMIT0obmV4dHNsYXNoPXN0cmNocihzdHIsJ1xcJykpKQorCQlzdWJzdHJsZW49bmV4dHNsYXNoLXN0cjsKKwllbHNlCisJCXN1YnN0cmxlbj1zdHJsZW4oc3RyKTsKKwlpZiAobmV4dHNsYXNoIT1OVUxMKSB7CisJCXdoaWxlICgqbmV4dHNsYXNoICYmICpuZXh0c2xhc2g9PSdcXCcpCisJCQluZXh0c2xhc2grKzsKKwkJaWYgKCEqbmV4dHNsYXNoKQorCQkJbmV4dHNsYXNoPU5VTEw7CisJfQorCisKKwl3aGlsZSAoMSkgeworCQlkYj0oc3RydWN0IGRiKilibG9jazsKKwkJZnByaW50ZihzdGRlcnIsImRiPSVwLGRiLT5uZXh0b2ZmPSVkLGRiLT5kYXRhbGVuPSVkLGRiLT5uYW1lPSVzLGRiLT5kYXRhPSVzXG4iLAorCQkJZGIsZGItPm5leHRvZmYsZGItPmRhdGFsZW4sZGItPm5hbWUsKGNoYXIqKSgoY2hhciopZGIrNCsoKHN0cmxlbihkYi0+bmFtZSkrNCkmfjMpKQorCQkpOworCQlpZiAoIWRiLT5uZXh0b2ZmKQorCQkJcmV0dXJuIE5VTEw7CisKKwkJZnByaW50ZihzdGRlcnIsImNvbXBhcmluZyB3aXRoICVzXG4iLGRiLT5uYW1lKTsKKwkJaWYgKCFzdHJuY21wKGRiLT5uYW1lLHN0cixzdWJzdHJsZW4pKSB7CisJCQlpZiAobmV4dHNsYXNoKQorCQkJCXJldHVybiBfZmluZF9kYXRhKAorCQkJCQlibG9jays0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSZ+MykrKChkYi0+ZGF0YWxlbiszKSZ+MykKKwkJCQkJLG5leHRzbGFzaAorCQkJCSk7CisJCQllbHNlCisJCQkJcmV0dXJuIGJsb2NrOworCQl9CisJCWJsb2NrPWJsb2NrKygoZGItPm5leHRvZmYrMykmfjMpOworCX0KKworfQorCisvKiB0YWtlIGNhcmUsICdidWZmZXInIGlzIE5PVCBhIFNFR1BUUiwgaXQganVzdCBwb2ludHMgdG8gb25lICovCitEV09SRAorVmVyUXVlcnlWYWx1ZShTRUdQVFIgc2VnYmxvY2ssTFBDU1RSIHN1YmJsb2NrLFNFR1BUUiAqYnVmZmVyLFVJTlQgKmJ1ZmxlbikgeworCUJZVEUJKmJsb2NrPVBUUl9TRUdfVE9fTElOKHNlZ2Jsb2NrKSwqYjsKKwlzdHJ1Y3QJZGIJKmRiOworCWNoYXIJKnM7CisKKwlmcHJpbnRmKHN0ZGVyciwiVmVyUXVlcnlWYWx1ZSglcCwlcywlcCwlZClcbiIsCisJCWJsb2NrLHN1YmJsb2NrLGJ1ZmZlciwqYnVmbGVuCisJKTsKKwlzPShjaGFyKil4bWFsbG9jKHN0cmxlbigiVlNfVkVSU0lPTl9JTkZPIikrc3RybGVuKHN1YmJsb2NrKSsxKTsKKwlzdHJjcHkocywiVlNfVkVSU0lPTl9JTkZPIik7c3RyY2F0KHMsc3ViYmxvY2spOworCWI9X2ZpbmRfZGF0YShibG9jayxzKTsKKwlpZiAoYj09TlVMTCkgeworCQkqYnVmbGVuPTA7CisJCXJldHVybiAwOworCX0KKwlkYj0oc3RydWN0IGRiKiliOworCSpidWZsZW4JPSBkYi0+ZGF0YWxlbjsKKwkvKiBsZXQgYiBwb2ludCB0byBkYXRhIGFyZWEgKi8KKwliCT0gYis0Kygoc3RybGVuKGRiLT5uYW1lKSs0KSYzKTsKKwkvKiBub3cgbG9vayB1cCB3aGF0IHRoZSByZXNwLiBTRUdQVFIgd291bGQgYmUgLi4uIAorCSAqIHdlIGNvdWxkIHVzZSBNQUtFX1NFR1BUUiAsIGJ1dCB3ZSBkb24ndCBuZWVkIHRvCisJICovCisJKmJ1ZmZlcgk9IChiLWJsb2NrKStzZWdibG9jazsKKwlmcHJpbnRmKHN0ZGVyciwiCS0+ICVzPSVzXG4iLHN1YmJsb2NrLGIpOworCXJldHVybiAxOworfQorCisvKgorICAgMjAgR0VURklMRVZFUlNJT05JTkZPUkFXCisgICAyMSBWRVJGVEhLX1RIVU5LREFUQTE2CisgICAyMiBWRVJUSEtTTF9USFVOS0RBVEExNgorKi8KZGlmZiAtLWdpdCBhL21pc2NlbXUvZG9zbWVtLmMgYi9taXNjZW11L2Rvc21lbS5jCmluZGV4IGE0YzE1NmEuLjZmZDUyZTIgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvZG9zbWVtLmMKKysrIGIvbWlzY2VtdS9kb3NtZW0uYwpAQCAtOSwxMSArOSwxMSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAiZ2xvYmFsLmgiCiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAibWlzY2VtdS5oIgogI2luY2x1ZGUgIm1vZHVsZS5oIgotI2luY2x1ZGUgInhtYWxsb2MuaCIKIAogCiBIQU5ETEUgRE9TTUVNX0Jpb3NTZWc7ICAvKiBCSU9TIGRhdGEgc2VnbWVudCBhdCAweDQwOjAgKi8KQEAgLTgyLDcgKzgyLDcgQEAKICAqICAgICAgICAgICBET1NNRU1fSW5pdAogICoKICAqIENyZWF0ZSB0aGUgZG9zIG1lbW9yeSBzZWdtZW50cywgYW5kIHN0b3JlIHRoZW0gaW50byB0aGUgS0VSTkVMCi0gKiBleHBvcnRlZCB2YWx1ZXMuIE1PRFVMRV9Jbml0KCkgbXVzdCBhbHJlYWR5IGhhdmUgYmVlbiBjYWxsZWQuCisgKiBleHBvcnRlZCB2YWx1ZXMuIEJVSUxUSU5fSW5pdCgpIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkLgogICovCiBCT09MIERPU01FTV9Jbml0KHZvaWQpCiB7CkBAIC05MSw3ICs5MSwxMiBAQAogCiAgICAgLyogQWxsb2NhdGUgNyA2NGsgc2VnbWVudHMgZm9yIDAwMDAsIEEwMDAsIEIwMDAsIEMwMDAsIEQwMDAsIEUwMDAsIEYwMDAuICovCiAKLSAgICBkb3NtZW0gPSB4bWFsbG9jKCAweDcwMDAwICk7CisgICAgZG9zbWVtID0gVmlydHVhbEFsbG9jKCBOVUxMLCAweDcwMDAwLCBNRU1fQ09NTUlULCBQQUdFX0VYRUNVVEVfUkVBRFdSSVRFICk7CisgICAgaWYgKCFkb3NtZW0pCisgICAgeworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJDb3VsZCBub3QgYWxsb2NhdGUgRE9TIHNlZ21lbnRzXG4iICk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CiAKICAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTgzLCAgLyogS0VSTkVMLjE4MzogX18wMDAwSCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSwKZGlmZiAtLWdpdCBhL21pc2NlbXUvaW50MmYuYyBiL21pc2NlbXUvaW50MmYuYwppbmRleCBjYzQwYWFjLi5mZGZkM2E1IDEwMDY0NAotLS0gYS9taXNjZW11L2ludDJmLmMKKysrIGIvbWlzY2VtdS9pbnQyZi5jCkBAIC0xNCw3ICsxNCw3IEBACiAvKiAjZGVmaW5lIERFQlVHX0lOVCAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKLSAgLyogYmFzZSBXSU5QUk9DIG1vZHVsZSBudW1iZXIgZm9yIFZ4RHMgKi8KKyAgLyogYmFzZSBXUFJPQ1MuRExMIG9yZGluYWwgbnVtYmVyIGZvciBWeERzICovCiAjZGVmaW5lIFZYRF9CQVNFIDQwMAogCiBzdGF0aWMgdm9pZCBkb19pbnQyZl8xNihzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQpOwpAQCAtMTAwLDcgKzEwMCw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIDB4ODQ6ICAvKiBHZXQgZGV2aWNlIEFQSSBlbnRyeSBwb2ludCAqLwotICAgICAgICBhZGRyID0gTU9EVUxFX0dldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZSgiV0lOUFJPQ1MiKSwKKyAgICAgICAgYWRkciA9IE1PRFVMRV9HZXRFbnRyeVBvaW50KCBHZXRNb2R1bGVIYW5kbGUoIldQUk9DUyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZYRF9CQVNFICsgQlhfcmVnKGNvbnRleHQpICk7CiAgICAgICAgIGlmICghYWRkcikgIC8qIG5vdCBzdXBwb3J0ZWQgKi8KICAgICAgICAgewpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnRlcnJ1cHRzLmMgYi9taXNjZW11L2ludGVycnVwdHMuYwppbmRleCA4ZTQ5MmM3Li4zMDhkNjlmIDEwMDY0NAotLS0gYS9taXNjZW11L2ludGVycnVwdHMuYworKysgYi9taXNjZW11L2ludGVycnVwdHMuYwpAQCAtMTgsNyArMTgsNyBAQAogCiBzdGF0aWMgU0VHUFRSIElOVF9WZWN0b3JzWzI1Nl07CiAKLSAgLyogT3JkaW5hbCBudW1iZXIgZm9yIGludGVycnVwdCAwIGhhbmRsZXIgaW4gV0lOUFJPQ1MuRExMICovCisgIC8qIE9yZGluYWwgbnVtYmVyIGZvciBpbnRlcnJ1cHQgMCBoYW5kbGVyIGluIFdQUk9DUy5ETEwgKi8KICNkZWZpbmUgRklSU1RfSU5URVJSVVBUX09SRElOQUwgMTAwCiAKIApAQCAtMjgsNyArMjgsNyBAQAogQk9PTCBJTlRfSW5pdCh2b2lkKQogewogICAgIFdPUkQgdmVjdG9yOwotICAgIEhNT0RVTEUgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggIldJTlBST0NTIiApOworICAgIEhNT0RVTEUgaE1vZHVsZSA9IEdldE1vZHVsZUhhbmRsZSggIldQUk9DUyIgKTsKIAogICAgIGZvciAodmVjdG9yID0gMDsgdmVjdG9yIDwgMjU2OyB2ZWN0b3IrKykKICAgICB7CkBAIC03Miw4ICs3MiwxMSBAQAogICovCiB2b2lkIElOVF9EdW1teUhhbmRsZXIoIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCBjb250ZXh0ICkKIHsKLSAgICBJTlRfQkFSRiggJmNvbnRleHQsCi0gICAgICAgICAgICAgIENVUlJFTlRfU1RBQ0sxNi0+b3JkaW5hbF9udW1iZXIgLSBGSVJTVF9JTlRFUlJVUFRfT1JESU5BTCApOworICAgIFdPUkQgb3JkaW5hbDsKKyAgICBjaGFyICpuYW1lOworICAgIFNUQUNLMTZGUkFNRSAqZnJhbWUgPSBDVVJSRU5UX1NUQUNLMTY7CisgICAgQlVJTFRJTl9HZXRFbnRyeVBvaW50KCBmcmFtZS0+ZW50cnlfY3MsIGZyYW1lLT5lbnRyeV9pcCwgJm9yZGluYWwsICZuYW1lICk7CisgICAgSU5UX0JBUkYoICZjb250ZXh0LCBvcmRpbmFsIC0gRklSU1RfSU5URVJSVVBUX09SRElOQUwgKTsKIH0KIAogCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggZjY3OGVlNC4uYTdmYzMyZCAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgImNhbGxiYWNrLmgiCiAjaW5jbHVkZSAidXNlci5oIgogI2luY2x1ZGUgImRyaXZlci5oIgorI2luY2x1ZGUgImZpbGUuaCIKICNpbmNsdWRlICJtbXN5c3RlbS5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiAjaW5jbHVkZSAiZGVidWcuaCIKZGlmZiAtLWdpdCBhL29iamVjdHMvY3Vyc29yaWNvbi5jIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKaW5kZXggODcwZjBlZi4uYjY0NWYwZSAxMDA2NDQKLS0tIGEvb2JqZWN0cy9jdXJzb3JpY29uLmMKKysrIGIvb2JqZWN0cy9jdXJzb3JpY29uLmMKQEAgLTIzMSw3ICsyMzEsNyBAQAogICoKICAqIENyZWF0ZSBhIGN1cnNvciBvciBpY29uIGZyb20gYSByZXNvdXJjZS4KICAqLwotc3RhdGljIEhBTkRMRSBDVVJTT1JJQ09OX0xvYWRIYW5kbGVyKCBIQU5ETEUgaGFuZGxlLCBISU5TVEFOQ0UgaEluc3RhbmNlLAorSEFORExFIENVUlNPUklDT05fTG9hZEhhbmRsZXIoIEhBTkRMRSBoYW5kbGUsIEhJTlNUQU5DRSBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgZkN1cnNvciApCiB7CiAgICAgSEFORExFIGhBbmRCaXRzLCBoWG9yQml0czsKZGlmZiAtLWdpdCBhL29iamVjdHMvZGMuYyBiL29iamVjdHMvZGMuYwppbmRleCA2YzdhNWRjLi5kMmVlODhjIDEwMDY0NAotLS0gYS9vYmplY3RzL2RjLmMKKysrIGIvb2JqZWN0cy9kYy5jCkBAIC0zNjIsMTYgKzM2MiwyMCBAQAogewogICAgIERDICogZGMsICogZGNzOwogICAgIEhSR04gaFZpc1JnbiwgaENsaXBSZ24sIGhHQ0NsaXBSZ247Ci0KKyAgICBIRk9OVCBoZm9udDsKKyAgICBIQlJVU0ggaGJydXNoOworICAgIAogICAgIGlmICghKGRjID0gKERDICopIEdESV9HZXRPYmpQdHIoIGhkYywgRENfTUFHSUMgKSkpIHJldHVybjsKICAgICBpZiAoIShkY3MgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjcywgRENfTUFHSUMgKSkpIHJldHVybjsKICAgICBpZiAoIWRjcy0+dy5mbGFncyAmIERDX1NBVkVEKSByZXR1cm47CiAgICAgZHByaW50Zl9kYyhzdGRkZWIsICJTZXREQ1N0YXRlOiAlMDR4ICUwNHhcbiIsIGhkYywgaGRjcyApOwogCi0gICAgICAvKiBTYXZlIHRoZSByZWdpb25zIGJlZm9yZSBvdmVyd3JpdGluZyBldmVyeXRoaW5nICovCisgICAgICAvKiBTYXZlIHRoZSByZWdpb25zLCBmb250ICYgYnJ1c2ggYmVmb3JlIG92ZXJ3cml0aW5nIGV2ZXJ5dGhpbmcgKi8KICAgICBoVmlzUmduICAgID0gZGMtPncuaFZpc1JnbjsKICAgICBoQ2xpcFJnbiAgID0gZGMtPncuaENsaXBSZ247CiAgICAgaEdDQ2xpcFJnbiA9IGRjLT53LmhHQ0NsaXBSZ247CisgICAgaGZvbnQgICAgICA9IGRjLT53LmhGb250OworICAgIGhicnVzaCAgICAgPSBkYy0+dy5oQnJ1c2g7CiAgICAgbWVtY3B5KCAmZGMtPncsICZkY3MtPncsIHNpemVvZihkYy0+dykgKTsKICAgICBtZW1jcHkoICZkYy0+dS54LnBlbiwgJmRjcy0+dS54LnBlbiwgc2l6ZW9mKGRjLT51LngucGVuKSApOwogICAgIGRjLT53LmZsYWdzICY9IH5EQ19TQVZFRDsKQEAgLTM4MCw2ICszODQsOCBAQAogICAgIGRjLT53LmhWaXNSZ24gICAgPSBoVmlzUmduOwogICAgIGRjLT53LmhDbGlwUmduICAgPSBoQ2xpcFJnbjsKICAgICBkYy0+dy5oR0NDbGlwUmduID0gaEdDQ2xpcFJnbjsKKyAgICBkYy0+dy5oRm9udCAgICAgID0gaGZvbnQ7CisgICAgZGMtPncuaEJydXNoICAgICA9IGhicnVzaDsKICAgICBDb21iaW5lUmduKCBkYy0+dy5oVmlzUmduLCBkY3MtPncuaFZpc1JnbiwgMCwgUkdOX0NPUFkgKTsKICAgICBTZWxlY3RDbGlwUmduKCBoZGMsIGRjcy0+dy5oQ2xpcFJnbiApOwogCkBAIC02NTksNiArNjY1LDI1IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgU2V0VGV4dEFsaWduICAgIChHREkuMzQ2KQorICovCitXT1JEIFNldFRleHRBbGlnbiggSERDIGhkYywgV09SRCB0ZXh0QWxpZ24gKQoreworICAgIFdPUkQgcHJldkFsaWduOworICAgIERDICogZGMgPSAoREMgKikgR0RJX0dldE9ialB0ciggaGRjLCBEQ19NQUdJQyApOworICAgIGlmICghZGMpCisgICAgeworCWlmICghKGRjID0gKERDICopR0RJX0dldE9ialB0ciggaGRjLCBNRVRBRklMRV9EQ19NQUdJQyApKSkgcmV0dXJuIDA7CisJTUZfTWV0YVBhcmFtMSggZGMsIE1FVEFfU0VUVEVYVEFMSUdOLCB0ZXh0QWxpZ24gKTsKKwlyZXR1cm4gMTsKKyAgICB9CisgICAgcHJldkFsaWduID0gZGMtPncudGV4dEFsaWduOworICAgIGRjLT53LnRleHRBbGlnbiA9IHRleHRBbGlnbjsKKyAgICByZXR1cm4gcHJldkFsaWduOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIEdldERDT3JnICAgIChHREkuNzkpCiAgKi8KIERXT1JEIEdldERDT3JnKCBIREMgaGRjICkKZGlmZiAtLWdpdCBhL29iamVjdHMvZGN2YWx1ZXMuYyBiL29iamVjdHMvZGN2YWx1ZXMuYwppbmRleCA1YmQ3NzI5Li5jZjY3ZGU3IDEwMDY0NAotLS0gYS9vYmplY3RzL2RjdmFsdWVzLmMKKysrIGIvb2JqZWN0cy9kY3ZhbHVlcy5jCkBAIC0zNSwxNyArMzUsNiBAQAogICAgIHJldHVybiBUUlVFOyBcCiB9CiAKLSNkZWZpbmUgRENfU0VUX1ZBTCggZnVuY190eXBlLCBmdW5jX25hbWUsIGRjX2ZpZWxkICkgXAotZnVuY190eXBlIGZ1bmNfbmFtZSggSERDIGhkYywgZnVuY190eXBlIHZhbCApIFwKLXsgXAotICAgIGZ1bmNfdHlwZSBwcmV2VmFsOyBcCi0gICAgREMgKiBkYyA9IChEQyAqKSBHRElfR2V0T2JqUHRyKCBoZGMsIERDX01BR0lDICk7IFwKLSAgICBpZiAoIWRjKSByZXR1cm4gMDsgXAotICAgIHByZXZWYWwgPSBkYy0+dy5kY19maWVsZDsgXAotICAgIGRjLT53LmRjX2ZpZWxkID0gdmFsOyBcCi0gICAgcmV0dXJuIHByZXZWYWw7IFwKLX0KLQogI2RlZmluZSBEQ19TRVRfTU9ERSggZnVuY19uYW1lLCBkY19maWVsZCwgbWluX3ZhbCwgbWF4X3ZhbCwgbWV0YV9mdW5jICkgXAogV09SRCBmdW5jX25hbWUoIEhEQyBoZGMsIFdPUkQgbW9kZSApIFwKIHsgXApAQCAtOTAsNyArNzksNiBAQAogRENfR0VUX1hfWSggRFdPUkQsIEdldEJydXNoT3JnLCBicnVzaE9yZ1gsIGJydXNoT3JnWSApICAgICAgICAgICAgLyogR0RJLjE0OSAqLwogRENfR0VUX1ZBTCggSFJHTiwgR2V0Q2xpcFJnbiwgaENsaXBSZ24gKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0RJLjE3MyAqLwogRENfR0VUX1ZBTCggV09SRCwgR2V0VGV4dEFsaWduLCB0ZXh0QWxpZ24gKSAgICAgICAgICAgICAgICAgICAgICAgLyogR0RJLjM0NSAqLwotRENfU0VUX1ZBTCggV09SRCwgU2V0VGV4dEFsaWduLCB0ZXh0QWxpZ24gKSAgICAgICAgICAgICAgICAgICAgICAgLyogR0RJLjM0NiAqLwogRENfR0VUX1ZBTCggSEZPTlQsIEdldEN1ckxvZ0ZvbnQsIGhGb250ICkgICAgICAgICAgICAgICAgICAgICAgICAgLyogR0RJLjQxMSAqLwogRENfR0VUX1ZBTF9FWCggR2V0QnJ1c2hPcmdFeCwgYnJ1c2hPcmdYLCBicnVzaE9yZ1kgKSAgICAgICAgICAgICAgLyogR0RJLjQ2OSAqLwogRENfR0VUX1ZBTF9FWCggR2V0Q3VycmVudFBvc2l0aW9uRXgsIEN1cnNQb3NYLCBDdXJzUG9zWSApICAgICAgICAgLyogR0RJLjQ3MCAqLwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9mb250LmMgYi9vYmplY3RzL2ZvbnQuYwppbmRleCBmOWNmYzhiLi5lMWUxYmIwIDEwMDY0NAotLS0gYS9vYmplY3RzL2ZvbnQuYworKysgYi9vYmplY3RzL2ZvbnQuYwpAQCAtNDkxLDkgKzQ5MSwxMiBAQAogICAgICAgLyogVW51c2UgcHJldmlvdXMgZm9udCAqLwogCWZvciAoaT0wOyBpIDwgRk9OVENBQ0hFOyBpKyspIHsKIAkJaWYgKGNhY2hlRm9udHNbaV0uaWQgPT0gcHJldkhhbmRsZSkgewotCQkJY2FjaGVGb250c1tpXS51c2VkLS07Ci0JCQl9CisJCQlpZihjYWNoZUZvbnRzW2ldLnVzZWQgPT0gMCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlRyeWluZyB0byBkZWNyZW1lbnQgYSB1c2UgY291bnQgb2YgMC5cbiIpOworCQkJZWxzZSAKKwkJCQljYWNoZUZvbnRzW2ldLnVzZWQtLTsKIAkJfQorCX0KIAogICAgICAgLyogU3RvcmUgZm9udCAqLwogICAgIGRjLT53LmhGb250ID0gaGZvbnQ7CkBAIC01MTcsOSArNTIwLDEwIEBACiAJCQlpZiAoKCFjYWNoZUZvbnRzTWluKSB8fCAoKGNhY2hlRm9udHNNaW4pICYmIChjYWNoZUZvbnRzTWluLT5hY2Nlc3MgPiBjYWNoZUZvbnRzW2ldLmFjY2VzcykpKQogCQkJCWNhY2hlRm9udHNNaW49JmNhY2hlRm9udHNbaV07CiAJCX0KLQlpZiAoIWNhY2hlRm9udHNNaW4pCisJaWYgKCFjYWNoZUZvbnRzTWluKSB7CiAJCWZwcmludGYoc3RkZXJyLCJObyB1bnVzZWQgZm9udCBjYWNoZSBlbnRyeSAhISEhXG4iICk7Ci0KKwkJcmV0dXJuIHByZXZIYW5kbGU7CisJfQogCWlmIChjYWNoZUZvbnRzTWluLT5pZCE9MCkgewogCQlkcHJpbnRmX2ZvbnQoc3RkZGViLAogCQkJIkZPTlRfU2VsZWN0T2JqZWN0OiBGcmVlaW5nICUwNHggXG4iLGNhY2hlRm9udHNNaW4tPmlkICk7CmRpZmYgLS1naXQgYS9vYmplY3RzL2dkaW9iai5jIGIvb2JqZWN0cy9nZGlvYmouYwppbmRleCBhZDNlZjUwLi5kNjc3ZTVkIDEwMDY0NAotLS0gYS9vYmplY3RzL2dkaW9iai5jCisrKyBiL29iamVjdHMvZ2Rpb2JqLmMKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlICJkZWJ1Zy5oIgogI2luY2x1ZGUgInhtYWxsb2MuaCIKIAotTFBTVFIgR0RJX0hlYXAgPSBOVUxMOwogV09SRCBHRElfSGVhcFNlbCA9IDA7CiAKIC8qIE9iamVjdCB0eXBlcyBmb3IgRW51bU9iamVjdHMoKSAqLwpAQCAtMTYzLDE0ICsxNjIsNiBAQAogewogICAgIEhQQUxFVFRFIGhwYWxldHRlOwogCi0jaWZuZGVmIFdJTkVMSUIKLSAgICAgIC8qIENyZWF0ZSBHREkgaGVhcCAqLwotCi0gICAgaWYgKCEoR0RJX0hlYXBTZWwgPSBHbG9iYWxBbGxvYyhHTUVNX0ZJWEVELCBHRElfSEVBUF9TSVpFKSkpIHJldHVybiBGQUxTRTsKLSAgICBHRElfSGVhcCA9IEdsb2JhbExvY2soIEdESV9IZWFwU2VsICk7Ci0gICAgTG9jYWxJbml0KCBHRElfSGVhcFNlbCwgMCwgR0RJX0hFQVBfU0laRS0xICk7Ci0jZW5kaWYKLSAgICAKICAgICAgIC8qIENyZWF0ZSBkZWZhdWx0IHBhbGV0dGUgKi8KIAogICAgIGlmICghKGhwYWxldHRlID0gQ09MT1JfSW5pdCgpKSkgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvb2JqZWN0cy9tZXRhZmlsZS5jIGIvb2JqZWN0cy9tZXRhZmlsZS5jCmluZGV4IGU4MzEwMTcuLjhjYjQ2MGUgMTAwNjQ0Ci0tLSBhL29iamVjdHMvbWV0YWZpbGUuYworKysgYi9vYmplY3RzL21ldGFmaWxlLmMKQEAgLTEzOCw2ICsxMzgsNyBAQAogCQkgICAgICBzaXplb2YoSEFORExFVEFCTEUpICogSFRMZW4pOwogICAgIAogICAgIEdsb2JhbFVubG9jayhkYy0+dy5oTWV0YUZpbGUpOworICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJDcmVhdGVNZXRhRmlsZTogcmV0dXJuaW5nICUwNHhcbiIsIGhhbmRsZSk7CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIApAQCAtMjY1LDcgKzI2Niw4IEBACiAgICAgTUVUQVJFQ09SRCAqbXI7CiAgICAgSEFORExFVEFCTEUgKmh0OwogICAgIGludCBvZmZzZXQgPSAwOwotICAgIAorICAgIFdPUkQgaTsKKwogICAgIGRwcmludGZfbWV0YWZpbGUoc3RkZGViLCJQbGF5TWV0YUZpbGUoJTA0eCAlMDR4KVxuIixoZGMsaG1mKTsKICAgICAKICAgICAvKiBjcmVhdGUgdGhlIGhhbmRsZSB0YWJsZSAqLwpAQCAtMjg0LDYgKzI4NiwxMSBAQAogCVBsYXlNZXRhRmlsZVJlY29yZChoZGMsIGh0LCBtciwgbWgtPm10Tm9PYmplY3RzKTsKICAgICB9CiAKKyAgICAvKiBmcmVlIG9iamVjdHMgaW4gaGFuZGxlIHRhYmxlICovCisgICAgZm9yKGkgPSAwOyBpIDwgbWgtPm10Tm9PYmplY3RzOyBpKyspCisgICAgICBpZigqKGh0LT5vYmplY3RIYW5kbGUgKyBpKSAhPSAwKQorICAgICAgICBEZWxldGVPYmplY3QoKihodC0+b2JqZWN0SGFuZGxlICsgaSkpOworICAgIAogICAgIC8qIGZyZWUgaGFuZGxlIHRhYmxlICovCiAgICAgR2xvYmFsRnJlZShoSFQpOwogCkBAIC0zNTYsNiArMzYzLDcgQEAKIAogICAgIGNhc2UgTUVUQV9ERUxFVEVPQkpFQ1Q6CiAgICAgICBEZWxldGVPYmplY3QoKihodC0+b2JqZWN0SGFuZGxlICsgKihtci0+cmRQYXJhbSkpKTsKKyAgICAgICooaHQtPm9iamVjdEhhbmRsZSArICoobXItPnJkUGFyYW0pKSA9IDA7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgTUVUQV9TRVRCS0NPTE9SOgpAQCAtNTc2LDggKzU4NCw3IEBACiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfU0VUVEVYVEFMSUdOOgotICAgICAgICBmcHJpbnRmKHN0ZGVyciwiUGxheU1ldGFGaWxlUmVjb3JkOiBTRVRURVhUQUxJR046ICVoZFxuIixtci0+cmRQYXJhbVswXSk7Ci0JU2V0VGV4dEFsaWduKGhkYywgKihtci0+cmRQYXJhbSkpOworICAgICAgIAlTZXRUZXh0QWxpZ24oaGRjLCAqKG1yLT5yZFBhcmFtKSk7CiAJYnJlYWs7CiAKICAgICBjYXNlIE1FVEFfU0VMRUNUUEFMRVRURToKZGlmZiAtLWdpdCBhL29iamVjdHMvb2VtYml0bWFwLmMgYi9vYmplY3RzL29lbWJpdG1hcC5jCmluZGV4IDM2YmJlMjAuLjA0ODY3ZmEgMTAwNjQ0Ci0tLSBhL29iamVjdHMvb2VtYml0bWFwLmMKKysrIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwpAQCAtNTQsNiArNTQsNyBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX29sZF91cGFycm93IgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3NpemUiCiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fb2xkX2Nsb3NlIgorI2luY2x1ZGUgImJpdG1hcHMvb2JtX3RydHlwZSIKIAogI2lmbmRlZiBXSU5fOTVfTE9PSwogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3pvb21kIgpAQCAtNzAsNyArNzEsNyBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX2Nsb3NlZF85NSIKICNlbmRpZiAgLyogV0lOXzk1X0xPT0sgKi8KIAotI2RlZmluZSBPQk1fRklSU1QgIE9CTV9DRFJPTSAgICAgIC8qIEZpcnN0IE9FTSBiaXRtYXAgKi8KKyNkZWZpbmUgT0JNX0ZJUlNUICBPQk1fVFJUWVBFCSAgIC8qIEZpcnN0IE9FTSBiaXRtYXAgKi8KICNkZWZpbmUgT0JNX0xBU1QgICBPQk1fT0xEX0NMT1NFICAgLyogTGFzdCBPRU0gYml0bWFwICovCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QKQEAgLTc4LDYgKzc5LDcgQEAKICAgICBjaGFyKiogZGF0YTsgICAvKiBQb2ludGVyIHRvIGJpdG1hcCBkYXRhICovCiAgICAgQk9PTCAgIGNvbG9yOyAgLyogSXMgaXQgYSBjb2xvciBiaXRtYXA/ICAqLwogfSBPQk1fUGl4bWFwc19EYXRhW09CTV9MQVNULU9CTV9GSVJTVCsxXSA9IHsKKyAgICB7IG9ibV90cnR5cGUsIFRSVUUgfSwJLyogT0JNX1RSVFlQRSAqLyAgICAKICAgICB7IG9ibV9jZHJvbSwgVFJVRSB9LCAgICAgICAgLyogT0JNX0NEUk9NICAgICovCiAgICAgeyBvYm1faGFyZGRpc2ssIFRSVUUgfSwgICAgIC8qIE9CTV9IQVJERElTSyAqLwogICAgIHsgb2JtX2RyaXZlLCBUUlVFIH0sICAgICAgICAvKiBPQk1fRFJJVkUgICAgKi8KZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9NYWtlZmlsZS5pbiBiL3Jlc291cmNlcy9NYWtlZmlsZS5pbgppbmRleCBkYzUzZGUwLi5kNmUyZDliIDEwMDY0NAotLS0gYS9yZXNvdXJjZXMvTWFrZWZpbGUuaW4KKysrIGIvcmVzb3VyY2VzL01ha2VmaWxlLmluCkBAIC0yLDcgKzIsNyBAQAogCiBNT0RVTEUgPSByZXNvdXJjZXMKIAotTEFOR1VBR0VTID0gRW4gRXMgRGUgTm8gRnIgRmkgRGEgQ3ogRW8gSXQKK0xBTkdVQUdFUyA9IEVuIEVzIERlIE5vIEZyIEZpIERhIEN6IEVvIEl0IEtvCiAKIFNZU1JFU19TUkNTID0gJChMQU5HVUFHRVM6JT1zeXNyZXNfJS5jKQogCmRpZmYgLS1naXQgYS9yZXNvdXJjZXMvc3lzcmVzLmMgYi9yZXNvdXJjZXMvc3lzcmVzLmMKaW5kZXggODMyZDAyNi4uMGI5Zjk1YiAxMDA2NDQKLS0tIGEvcmVzb3VyY2VzL3N5c3Jlcy5jCisrKyBiL3Jlc291cmNlcy9zeXNyZXMuYwpAQCAtMTksNyArMTksNyBAQAogI2luY2x1ZGUgInN5c3Jlc19Dei5oIgogI2luY2x1ZGUgInN5c3Jlc19Fby5oIgogI2luY2x1ZGUgInN5c3Jlc19JdC5oIgotCisjaW5jbHVkZSAic3lzcmVzX0tvLmgiCiAKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzb3VyY2UgKiBjb25zdCAqIFNZU1JFU19SZXNvdXJjZXNbXSA9CiB7CkBAIC0zMiw3ICszMiw4IEBACiAgICAgc3lzcmVzX0RhX1RhYmxlLCAgLyogTEFOR19EYSAqLwogICAgIHN5c3Jlc19Del9UYWJsZSwgIC8qIExBTkdfQ3ogKi8KICAgICBzeXNyZXNfRW9fVGFibGUsICAvKiBMQU5HX0VvICovCi0gICAgc3lzcmVzX0l0X1RhYmxlICAgLyogTEFOR19JdCAqLworICAgIHN5c3Jlc19JdF9UYWJsZSwgIC8qIExBTkdfSXQgKi8KKyAgICBzeXNyZXNfS29fVGFibGUgICAvKiBMQU5HX0tvICovCiB9OwogCiAKZGlmZiAtLWdpdCBhL3Jlc291cmNlcy9zeXNyZXNfS28ucmMgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTg4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9yZXNvdXJjZXMvc3lzcmVzX0tvLnJjCkBAIC0wLDAgKzEsMjE1IEBACitTWVNNRU5VIE1FTlUgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRQoreworIE1FTlVJVEVNICK6ubHNKCZSKSIsIDYxNzI4CisgTUVOVUlURU0gIsDMtb8oJk0pIiwgNjE0NTYKKyBNRU5VSVRFTSAixamx4iC6r7DmKCZTKSIsIDYxNDQwCisgTUVOVUlURU0gIsPgvNIoJk4pIiwgNjE0NzIKKyBNRU5VSVRFTSAiyK606ygmTSkiLCA2MTQ4OAorIE1FTlVJVEVNIFNFUEFSQVRPUgorIE1FTlVJVEVNICK03bHiKCZDKVx0QWx0LUY0IiwgNjE1MzYKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiwNu+9yDA/MivKCZXKSAuLi5cdEN0cmwtRXNjIiwgNjE3NDQKKyBNRU5VSVRFTSBTRVBBUkFUT1IKKyBNRU5VSVRFTSAiv83Azr+hILD8x8+/qSAuLi4iLCA2MTc2MQorfQorCitNU0dCT1ggRElBTE9HIDEwMCwgODAsIDIxNiwgMTY4CitTVFlMRSBEU19TWVNNT0RBTCB8IERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX1ZJU0lCTEUgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQkVHSU4KKwlJQ09OICIiLCAxMDg4LCA4LCAyMCwgMTYsIDE2LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUKKwlMVEVYVCAiIiwgMTAwLCAzMiwgNCwgMTc2LCA0OCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAKKwlQVVNIQlVUVE9OICK9wsDOKCZPKSIsIDEsIDE2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUFVTSEJVVFRPTiAiw+u80igmQykiLCAyLCA2NCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVBVU0hCVVRUT04gIsHftNwoJkEpIiwgMywgMTEyLCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUFVTSEJVVFRPTiAiwOe9w7W1KCZSKSIsIDQsIDE2MCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorCVBVU0hCVVRUT04gIrmrvcMoJkkpIiwgNSwgMjA4LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUFVTSEJVVFRPTiAiv7koJlkpIiwgNiwgMjU2LCA1NiwgNDAsIDE0LCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QCisJUFVTSEJVVFRPTiAivsa0z7/AKCZOKSIsIDcsIDMwNCwgNTYsIDQwLCAxNCwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfVEFCU1RPUAorRU5ECisKK1NIRUxMX0FCT1VUX01TR0JPWCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSA1MCwgNDQsIDIyMywgMjAwCitTVFlMRSBEU19MT0NBTEVESVQgfCBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19WSVNJQkxFIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIiVzv6EgsPzHz7+pIgorRk9OVCAxMCwgIlN5c3RlbSIKK3sKKyBERUZQVVNIQlVUVE9OICK9wsDOIiwgMSwgOTEsIDE4MCwgNDAsIDE0CisgQ09OVFJPTCAiIiwgLTEsICJTVEFUSUMiLCBTU19CTEFDS0ZSQU1FIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfRElTQUJMRUQsIDQsIDM1LCAyMTUsIDE0MAorIExURVhUICJUZXh0IiwgMTAwLCAxMSwgNDAsIDIwMCwgMTMwLCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgSUNPTiAiIiwgMTA4OCwgMTk1LCAxMCwgMTgsIDIwCit9CisKKworT1BFTl9GSUxFIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjc1LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICK/rbHiIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAixsTAzyDAzLinKCZOKToiLCAxMDkwLCA2LCA2LCA3NiwgOQorIEVESVRURVhUIDExNTIsIDYsIDE2LCA5MCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgRVNfT0VNQ09OVkVSVCB8IFdTX0JPUkRFUiB8IFdTX1RBQlNUT1AKKyBMSVNUQk9YIDExMjAsIDYsIDMyLCA5MCwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAitfC3usXkuK4oJkQpOiIsIC0xLCAxMTAsIDYsIDkyLCA5CisgTFRFWFQgIiIsIDEwODgsIDExMCwgMTgsIDkyLCA5LCBTU19OT1BSRUZJWCB8IFdTX0dST1VQCisgTElTVEJPWCAxMTIxLCAxMTAsIDMyLCA5MiwgNjgsIExCU19TVEFOREFSRCB8IExCU19PV05FUkRSQVdGSVhFRCB8IExCU19IQVNTVFJJTkdTIHwgTEJTX0RJU0FCTEVOT1NDUk9MTCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAixsTAzyDH/L3EKCZUKToiLCAxMDg5LCA2LCAxMDQsIDkwLCA5CisgQ09NQk9CT1ggMTEzNiwgNiwgMTE0LCA5MCwgMzYsIENCU19EUk9QRE9XTkxJU1QgfCBDQlNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICK15bbzwMy66igmVik6IiwgMTA5MSwgMTEwLCAxMDQsIDkyLCA5CisgQ09NQk9CT1ggMTEzNywgMTEwLCAxMTQsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIr+tseIiLCAxLCAyMDgsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAyMDgsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIrW1v/K4uygmSCkiLCAxMDM4LCAyMDgsIDQ2LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICLA0LHiIMD8v+soJlIpIiwgMTA0MCwgMjA4LCA2OCwgNTAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKK30KKworCitTQVZFX0ZJTEUgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyNzUsIDEzNAorU1RZTEUgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfQ0FQVElPTiB8IFdTX1NZU01FTlUKK0NBUFRJT04gIrTZuKUgwMy4p8C4t84gwPrA5SAuLi4iCitGT05UIDgsICJIZWx2IgoreworIExURVhUICLGxMDPIMDMuKcoJk4pOiIsIDEwOTAsIDYsIDYsIDc2LCA5CisgRURJVFRFWFQgMTE1MiwgNiwgMTYsIDkwLCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBFU19PRU1DT05WRVJUIHwgV1NfQk9SREVSIHwgV1NfVEFCU1RPUAorIExJU1RCT1ggMTEyMCwgNiwgMzIsIDkwLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICK18Le6xeS4rigmRCk6IiwgLTEsIDExMCwgNiwgOTIsIDkKKyBMVEVYVCAiIiwgMTA4OCwgMTEwLCAxOCwgOTIsIDksIFNTX05PUFJFRklYIHwgV1NfR1JPVVAKKyBMSVNUQk9YIDExMjEsIDExMCwgMzIsIDkyLCA2OCwgTEJTX1NUQU5EQVJEIHwgTEJTX09XTkVSRFJBV0ZJWEVEIHwgTEJTX0hBU1NUUklOR1MgfCBMQlNfRElTQUJMRU5PU0NST0xMIHwgV1NfVEFCU1RPUAorIExURVhUICLGxMDPIMf8vcQoJlQpOiIsIDEwODksIDYsIDEwNCwgOTAsIDkKKyBDT01CT0JPWCAxMTM2LCA2LCAxMTQsIDkwLCAzNiwgQ0JTX0RST1BET1dOTElTVCB8IENCU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgTFRFWFQgIrXltvPAzLrqKCZWKToiLCAxMDkxLCAxMTAsIDEwNCwgOTIsIDkKKyBDT01CT0JPWCAxMTM3LCAxMTAsIDExNCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgREVGUFVTSEJVVFRPTiAiwPrA5SIsIDEsIDIwOCwgNiwgNTYsIDE0LCBCU19ERUZQVVNIQlVUVE9OIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAiw+u80iIsIDIsIDIwOCwgMjQsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgUFVTSEJVVFRPTiAitbW/8ri7KCZIKSIsIDEwMzgsIDIwOCwgNDYsIDU2LCAxNCwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIsDQseIgwPy/6ygmUikiLCAxMDQwLCAyMDgsIDY4LCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICLAzrziIgorRk9OVCA4LCAiSGVsdiIKK3sKKyBMVEVYVCAiwM684rHiOiIsIDEwODgsIDYsIDYsIDQwLCA5CisgTFRFWFQgIiIsIDEwODksIDYwLCA2LCAxNTAsIDkKKyBHUk9VUEJPWCAiwM684iC5/MCnIiwgMTA3MiwgNiwgMzAsIDE2MCwgNjUsIEJTX0dST1VQQk9YCisgUkFESU9CVVRUT04gIrjwtc4oJkEpIiwgMTA1NiwgMTYsIDQ1LCA2MCwgMTIKKyBSQURJT0JVVFRPTiAivLHFwygmRSkiLCAxMDU3LCAxNiwgNjAsIDYwLCAxMgorIFJBRElPQlVUVE9OICLCyigmUCkiLCAxMDU4LCAxNiwgNzUsIDYwLCAxMgorIERFRlBVU0hCVVRUT04gIsDOvOIiLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIryzwaQoJlMpIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVCAivcPA2ygmRik6IiwgMTA5MCwgNjAsIDgwLCAzMCwgOQorIExURVhUICKzoSgmVCk6IiwgMTA5MSwgMTIwLCA4MCwgMzAsIDkKKyBMVEVYVCAiwM684iDHsMH6KCZRKToiLCAxMDkyLCA2LCAxMDAsIDc2LCA5CisgQ09NQk9CT1ggMTEzNiwgODAsIDEwMCwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIsbEwM+3ziDAzrziKCZMKSIsIDEwNDAsIDIwLCAxMDAsIDUwLCAxMiwgQlNfQVVUT0NIRUNLQk9YIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ0hFQ0tCT1ggIkNvbmRlbnNlZCIsIDEwNDEsIDE2MCwgMTAwLCA1MCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1BSSU5UX1NFVFVQIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICLAzrziILyzwaQiCitGT05UIDgsICJIZWx2IgoreworIEdST1VQQk9YICLAzrziseIiLCAxMDcyLCA2LCAxMCwgMTgwLCA2NSwgQlNfR1JPVVBCT1gKKyBSQURJT0JVVFRPTiAiseK6uyDAzrziseIoJkQpIiwgMTA1NiwgMTYsIDIwLCA4MCwgMTIKKyBMVEVYVCAiW774wL1dIiwgMTA4OCwgMzUsIDM1LCAxMjAsIDkKKyBSQURJT0JVVFRPTiAiwfbBpLXIIMDOvOKx4igmUCkiLCAxMDU3LCAxNiwgNTAsIDgwLCAxMgorIENPTUJPQk9YIDExMzYsIDM1LCA2NSwgMTQ5LCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorIERFRlBVU0hCVVRUT04gIr3CwM4iLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIryzwaQoJlMpIiwgMTAyNCwgMjA2LCA0NiwgNTYsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBHUk9VUEJPWCAiuebH4iIsIDEwNzMsIDYsIDg1LCAxMDAsIDUwLCBCU19HUk9VUEJPWAorIFJBRElPQlVUVE9OICK8vLfOKCZSKSIsIDEwNTgsIDUwLCAxMDAsIDQwLCAxMgorIFJBRElPQlVUVE9OICKwobfOKCZMKSIsIDEwNTksIDUwLCAxMTUsIDQwLCAxMgorIElDT04gIkxBTkRTQ0FQIiwgMTA5NywgMTAsIDk1LCAzMiwgMzIKKyBJQ09OICJQT1JUUkFJVCIsIDEwOTgsIDEwLCA5NSwgMzIsIDMyCisgR1JPVVBCT1ggIsG+wMwiLCAxMDc0LCAxMjAsIDg1LCAxODAsIDUwLCBCU19HUk9VUEJPWAorIExURVhUICLFqbHiKCZaKSIsIDEwODksIDEzMCwgOTUsIDMwLCA5CisgTFRFWFQgIrnmvcQoJlMpIiwgMTA5MCwgMTMwLCAxMTAsIDMwLCA5CisgQ09NQk9CT1ggMTEzNywgMTU1LCA5NSwgOTIsIDY4LCBDQlNfRFJPUERPV05MSVNUIHwgQ0JTX09XTkVSRFJBV0ZJWEVEIHwgQ0JTX0FVVE9IU0NST0xMIHwgQ0JTX1NPUlQgfCBDQlNfSEFTU1RSSU5HUyB8IFdTX0JPUkRFUiB8IFdTX1ZTQ1JPTEwgfCBXU19UQUJTVE9QCisgQ09NQk9CT1ggMTEzOCwgMTU1LCAxMTAsIDkyLCA2OCwgQ0JTX0RST1BET1dOTElTVCB8IENCU19PV05FUkRSQVdGSVhFRCB8IENCU19BVVRPSFNDUk9MTCB8IENCU19TT1JUIHwgQ0JTX0hBU1NUUklOR1MgfCBXU19CT1JERVIgfCBXU19WU0NST0xMIHwgV1NfVEFCU1RPUAorfQorCisKK0NIT09TRV9GT05UIERJQUxPRyBMT0FET05DQUxMIE1PVkVBQkxFIERJU0NBUkRBQkxFIDM2LCAyNCwgMjY0LCAxMzQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICKx28Daw7wiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICKx28Daw7w6IiwgMTA4OCwgNiwgNiwgNDAsIDkKKyBMVEVYVCAiIiwgMTA4OSwgNjAsIDYsIDE1MCwgOQorIERFRlBVU0hCVVRUT04gIr3CwM4iLCAxLCAyMDYsIDYsIDU2LCAxNCwgQlNfREVGUFVTSEJVVFRPTiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAyMDYsIDI0LCA1NiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK0NIT09TRV9DT0xPUiBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDMwMCwgMjAwCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiu/YiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICKx4rq7u/YoJkIpOiIsICAgMTA4OCwgNCwgICAgNCwgIDE0MCwgMTAKKyBMVEVYVCAiu+e/68Dau/YoJkMpOiIsICAxMDg5LCA0LCAgIDEwNiwgMTQwLCAxMAorIExURVhUICLIpbv2IHwgILTcu/YoJmkpIiwgIDEwOTAsIDE1MCwgMTUxLCAgNDgsIDEwCisgTFRFWFQJICK7obCtKCZSKToiLCA3MjYgLyoxMDk0Ki8sMjQ5LDEyNiwyNCwxMAorIEVESVRURVhUIDcwNiwgMjc1LDEyNCwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQJICLDyrfPKCZHKToiLDcyNy8qMTA5NSovLDI0OSwxNDAsMjQsMTAKKyBFRElUVEVYVCA3MDcsIDI3NSwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUCSAixsS2+ygmQik6Iiw3MjggLyoxMDk2Ki8sMjQ5LDE1NCwyNCwxMAorIEVESVRURVhUIDcwOCwgMjc1LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQJIrv2u/MoJkgpOiIgLDcyMyAvKjEwOTEqLywyMDIsMTI2LDIyLDEwCisgRURJVFRFWFQgNzAzLCAyMjYsMTI0LDE4LDEyLCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBMVEVYVAkiw6S1tSgmUyk6IiAsNzI0IC8qMTA5MiovLDIwMiwxNDAsMjIsMTAKKyBFRElUVEVYVCA3MDQsIDIyNiwxMzgsMTgsMTIsIFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIExURVhUCSK47bW1KCZMKToiICw3MjUgLyoxMDkzKi8sMjAyLDE1NCwyMiwxMAorIEVESVRURVhUIDcwNSwgMjI2LDE1MiwxOCwxMiwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgQ09OVFJPTCAiIiAsNzIwLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTQsMTQwLDg2CisgQ09OVFJPTCAiIiAsNzIxLCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLDQsMTE2LDE0MCwyOAorIENPTlRST0wgIiIgLDcxMCwiU1RBVElDIixXU19CT1JERVJ8U1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDE1Miw0LDExOCwxMTYKKyBDT05UUk9MICIiICw3MDIsIlNUQVRJQyIsU1NfU0lNUExFfFdTX1RBQlNUT1B8V1NfR1JPVVAsIDI3OCw0LDgsMTE2CisgQ09OVFJPTCAiIiAsNzA5LCJTVEFUSUMiLFNTX1NJTVBMRXxXU19UQUJTVE9QfFdTX0dST1VQLCAxNTIsMTI0LDQwLDI2CisgREVGUFVTSEJVVFRPTiAivcLAziIsICAxLCAgNCwgMTY2LCA0NCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICLD67zSIiwgMiwgNTIsIDE2NiwgNDQsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICK1tb/yuLsiLCAxMDM4LDEwMCwxNjYsIDQ0LCAxNAorIFBVU0hCVVRUT04gIrvnv+vA2rv2v6Egw9+woSgmQSkiLCAgICA3MTIvKjEwMjQqLywgMTUyLCAxNjYsIDE0MiwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIrvnv+vA2rv2IMGkwMcoJkQpID4+IiwgNzE5LyoxMDI1Ki8sICAgNCwgMTUwLCAxNDIsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICAiJmkiLDcxMywzMDAsMjAwLDQsMTQgICAvKiBqdXN0IGEgZHVtbXk6ICAnaScgaXMgIGxpa2UgICZpICBpbiAic29sJmlkIiAgKi8KK30KKworCitGSU5EX1RFWFQgRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgMzYsIDI0LCAyMzYsIDYyCitTVFlMRSBEU19NT0RBTEZSQU1FIHwgV1NfUE9QVVAgfCBXU19DQVBUSU9OIHwgV1NfU1lTTUVOVQorQ0FQVElPTiAiw6Ox4iIKK0ZPTlQgOCwgIkhlbHYiCit7CisgTFRFWFQgIsOjwLsgua7A2r+tKCZOKToiLCAtMSwgNCwgOCwgNDIsIDgKKyBFRElUVEVYVCAxMTUyLCA0NywgNywgMTI4LCAxMiwgRVNfQVVUT0hTQ1JPTEwgfCBXU19CT1JERVIgfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAitNy+7ri4KCZXKSIsIDEwNDAsIDQsIDI2LCAxMDAsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBDSEVDS0JPWCAitOu80rmuwNogsbi6sCgmQykiLCAxMDQxLCA0LCA0MiwgNjQsIDEyLCBCU19BVVRPQ0hFQ0tCT1ggfCBXU19UQUJTVE9QCisgR1JPVVBCT1ggIrnmx+IiLCAxMDcyLCAxMDcsIDI2LCA2OCwgMjgKKyBDT05UUk9MICLApygmVSkiLCAxMDU2LCAiQlVUVE9OIiwgQlNfQVVUT1JBRElPQlVUVE9OIHwgV1NfQ0hJTEQgfCBXU19WSVNJQkxFIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QLCAxMTEsIDM4LCAyMCwgMTIKKyBDT05UUk9MICK+xrehKCZEKSIsIDEwNTcsICJCVVRUT04iLCBCU19BVVRPUkFESU9CVVRUT04gfCBXU19DSElMRCB8IFdTX1ZJU0lCTEUgfCBXU19UQUJTVE9QLCAxMzgsIDM4LCAzMCwgMTIKKyBERUZQVVNIQlVUVE9OICK02cC9IMOjseIoJkYpIiwgMSwgMTgyLCA1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAxODIsIDIzLCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIrW1v/K4uygmSCkiLCAxMDM4LCAxODIsIDQ1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQorCisKK1JFUExBQ0VfVEVYVCBESUFMT0cgTE9BRE9OQ0FMTCBNT1ZFQUJMRSBESVNDQVJEQUJMRSAzNiwgMjQsIDIzMCwgOTQKK1NUWUxFIERTX01PREFMRlJBTUUgfCBXU19QT1BVUCB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCitDQVBUSU9OICK52bLZseIiCitGT05UIDgsICJIZWx2IgoreworIExURVhUICLDo8C7ILmuwNq/rSgmTik6IiwgLTEsIDQsIDksIDQ4LCA4CisgRURJVFRFWFQgMTE1MiwgNTQsIDcsIDExNCwgMTIsIEVTX0FVVE9IU0NST0xMIHwgV1NfQk9SREVSIHwgV1NfR1JPVVAgfCBXU19UQUJTVE9QCisgTFRFWFQgIrnZstwgua7A2r+tKCZQKToiLCAtMSwgNCwgMjYsIDQ4LCA4CisgRURJVFRFWFQgMTE1MywgNTQsIDI0LCAxMTQsIDEyLCBFU19BVVRPSFNDUk9MTCB8IFdTX0JPUkRFUiB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICK03L7uuLgoJlcpIiwgMTA0MCwgNSwgNDYsIDEwNCwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIENIRUNLQk9YICK067zSua7A2iCxuLqwKCZDKSIsIDEwNDEsIDUsIDYyLCA1OSwgMTIsIEJTX0FVVE9DSEVDS0JPWCB8IFdTX1RBQlNUT1AKKyBERUZQVVNIQlVUVE9OICK02cC9IMOjseIoJkYpIiwgMSwgMTc0LCA0LCA1MCwgMTQsIEJTX0RFRlBVU0hCVVRUT04gfCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICK52bLZseIoJlIpIiwgMTAyNCwgMTc0LCAyMSwgNTAsIDE0LCBXU19HUk9VUCB8IFdTX1RBQlNUT1AKKyBQVVNIQlVUVE9OICK48LXOILnZstmx4igmQSkiLCAxMDI1LCAxNzQsIDM4LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIsPrvNIiLCAyLCAxNzQsIDU1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorIFBVU0hCVVRUT04gIrW1v/K4uygmSCkiLCAxMDM4LCAxNzQsIDc1LCA1MCwgMTQsIFdTX0dST1VQIHwgV1NfVEFCU1RPUAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggZGZhMmQ0MC4uYWMyYWYzMiAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC04MCw4ICs4MCw4IEBACiBzdGF0aWMgZW51bSBTUEVDX1RZUEUgU3BlY1R5cGUgPSBTUEVDX0lOVkFMSUQ7CiBjaGFyIERMTE5hbWVbODBdOwogaW50IExpbWl0ID0gMDsKLWludCBETExJZDsKIGludCBCYXNlID0gMDsKK2ludCBIZWFwU2l6ZSA9IDA7CiBGSUxFICpTcGVjRnA7CiAKIGNoYXIgKlBhcnNlQnVmZmVyID0gTlVMTDsKQEAgLTQ3NSwyNyArNDc1LDI1IEBACiAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotCWVsc2UgaWYgKHN0cmNtcCh0b2tlbiwgImlkIikgPT0gMCkKLQl7Ci0JICAgIHRva2VuID0gR2V0VG9rZW4oKTsKLQkgICAgaWYgKCFJc051bWJlclN0cmluZyh0b2tlbikpCi0JICAgIHsKLQkJZnByaW50ZihzdGRlcnIsICIlZDogRXhwZWN0ZWQgbnVtYmVyIGFmdGVyIGlkXG4iLCBMaW5lKTsKLQkJZXhpdCgxKTsKLQkgICAgfQotCSAgICAKLQkgICAgRExMSWQgPSBhdG9pKHRva2VuKTsKLQl9CiAJZWxzZSBpZiAoc3RyY21wKHRva2VuLCAiYmFzZSIpID09IDApCiAJewotCQl0b2tlbiA9IEdldFRva2VuKCk7Ci0JCWlmICghSXNOdW1iZXJTdHJpbmcodG9rZW4pKQotCQl7CisgICAgICAgICAgICB0b2tlbiA9IEdldFRva2VuKCk7CisgICAgICAgICAgICBpZiAoIUlzTnVtYmVyU3RyaW5nKHRva2VuKSkKKyAgICAgICAgICAgIHsKIAkJZnByaW50ZihzdGRlcnIsICIlZDogRXhwZWN0ZWQgbnVtYmVyIGFmdGVyIGJhc2VcbiIsIExpbmUpOwogCQlleGl0KDEpOwotCQl9Ci0KLQkJQmFzZSA9IGF0b2kodG9rZW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQmFzZSA9IGF0b2kodG9rZW4pOworCX0KKwllbHNlIGlmIChzdHJjbXAodG9rZW4sICJoZWFwIikgPT0gMCkKKwl7CisgICAgICAgICAgICB0b2tlbiA9IEdldFRva2VuKCk7CisgICAgICAgICAgICBpZiAoIUlzTnVtYmVyU3RyaW5nKHRva2VuKSkKKyAgICAgICAgICAgIHsKKwkJZnByaW50ZihzdGRlcnIsICIlZDogRXhwZWN0ZWQgbnVtYmVyIGFmdGVyIGhlYXBcbiIsIExpbmUpOworCQlleGl0KDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSGVhcFNpemUgPSBhdG9pKHRva2VuKTsKIAl9CiAJZWxzZSBpZiAoSXNOdW1iZXJTdHJpbmcodG9rZW4pKQogCXsKQEAgLTU1NCwxNiArNTUyLDExIEBACiAgKiBEdW1wIGEgYnl0ZSBzdHJlYW0gaW50byB0aGUgYXNzZW1ibHkgY29kZS4KICAqLwogc3RhdGljIHZvaWQgRHVtcEJ5dGVzKCBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uLCBjb25zdCBjaGFyICpsYWJlbF9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFiZWxfZW5kICkKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbiwgY29uc3QgY2hhciAqbGFiZWxfc3RhcnQgKQogewogICAgIGludCBpOwogICAgIGlmIChzZWN0aW9uKSBwcmludGYoICJcdCVzXG4iLCBzZWN0aW9uICk7Ci0gICAgaWYgKGxhYmVsX3N0YXJ0KQotICAgIHsKLSAgICAgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzXyVzXG4iLCBETExOYW1lLCBsYWJlbF9zdGFydCApOwotICAgICAgICBwcmludGYoIFBSRUZJWCAiJXNfJXM6XG4iLCBETExOYW1lLCBsYWJlbF9zdGFydCApOwotICAgIH0KKyAgICBpZiAobGFiZWxfc3RhcnQpIHByaW50ZiggIiVzOlxuIiwgbGFiZWxfc3RhcnQgKTsKICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCiAgICAgewogICAgICAgICBpZiAoIShpICYgMHgwZikpIHByaW50ZiggIlx0LmJ5dGUgIiApOwpAQCAtNTcxLDExICs1NjQsNiBAQAogICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHByaW50ZiggIiVjIiwgKChpICYgMHgwZikgIT0gMHgwZikgPyAnLCcgOiAnXG4nICk7CiAgICAgfQogICAgIHByaW50ZiggIlxuIiApOwotICAgIGlmIChsYWJlbF9lbmQpCi0gICAgewotICAgICAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfJXNcbiIsIERMTE5hbWUsIGxhYmVsX2VuZCApOwotICAgICAgICBwcmludGYoIFBSRUZJWCAiJXNfJXM6XG4iLCBETExOYW1lLCBsYWJlbF9lbmQgKTsKLSAgICB9CiB9CiAKIApAQCAtNTg1LDcgKzU3Myw3IEBACiAgKiBCdWlsZCB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGEgMTYtYml0IE5FIG1vZHVsZSwgYW5kIGR1bXAgaXQKICAqIGFzIGEgYnl0ZSBzdHJlYW0gaW50byB0aGUgYXNzZW1ibHkgY29kZS4KICAqLwotc3RhdGljIHZvaWQgQnVpbGRNb2R1bGUxNiggaW50IG1heF9jb2RlX29mZnNldCwgaW50IG1heF9kYXRhX29mZnNldCApCitzdGF0aWMgaW50IEJ1aWxkTW9kdWxlMTYoIGludCBtYXhfY29kZV9vZmZzZXQsIGludCBtYXhfZGF0YV9vZmZzZXQgKQogewogICAgIE9SRERFRiAqb2RwOwogICAgIGludCBpOwpAQCAtNjE1LDcgKzYwMyw3IEBACiAgICAgcE1vZHVsZS0+bmV4dCA9IDA7CiAgICAgcE1vZHVsZS0+ZmxhZ3MgPSBORV9GRkxBR1NfU0lOR0xFREFUQSB8IE5FX0ZGTEFHU19CVUlMVElOIHwgTkVfRkZMQUdTX0xJQk1PRFVMRTsKICAgICBwTW9kdWxlLT5kZ3JvdXAgPSAyOwotICAgIHBNb2R1bGUtPmhlYXBfc2l6ZSA9IDB4ZmZmZjsKKyAgICBwTW9kdWxlLT5oZWFwX3NpemUgPSBIZWFwU2l6ZTsKICAgICBwTW9kdWxlLT5zdGFja19zaXplID0gMDsKICAgICBwTW9kdWxlLT5pcCA9IDA7CiAgICAgcE1vZHVsZS0+Y3MgPSAwOwpAQCAtNzYxLDcgKzc0OSw4IEBACiAgICAgICAvKiBEdW1wIHRoZSBtb2R1bGUgY29udGVudCAqLwogCiAgICAgRHVtcEJ5dGVzKCAoY2hhciAqKXBNb2R1bGUsIChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZSwKLSAgICAgICAgICAgICAgICIuZGF0YSIsICJNb2R1bGVfU3RhcnQiLCAiTW9kdWxlX0VuZCIgKTsKKyAgICAgICAgICAgICAgICIuZGF0YSIsICJNb2R1bGVfU3RhcnQiICk7CisgICAgcmV0dXJuIChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZTsKIH0KIAogCkBAIC03NzEsNyArNzYwLDcgQEAKICAqIEJ1aWxkIHRoZSBpbi1tZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgYSAzMi1iaXQgcHNldWRvLU5FIG1vZHVsZSwgYW5kIGR1bXAgaXQKICAqIGFzIGEgYnl0ZSBzdHJlYW0gaW50byB0aGUgYXNzZW1ibHkgY29kZS4KICAqLwotc3RhdGljIHZvaWQgQnVpbGRNb2R1bGUzMih2b2lkKQorc3RhdGljIGludCBCdWlsZE1vZHVsZTMyKHZvaWQpCiB7CiAgICAgY2hhciAqYnVmZmVyOwogICAgIE5FX01PRFVMRSAqcE1vZHVsZTsKQEAgLTc5OCw3ICs3ODcsNyBAQAogICAgIHBNb2R1bGUtPmZsYWdzID0gTkVfRkZMQUdTX1NJTkdMRURBVEEgfCBORV9GRkxBR1NfQlVJTFRJTiB8CiAgICAgICAgICAgICAgICAgICAgICBORV9GRkxBR1NfTElCTU9EVUxFIHwgTkVfRkZMQUdTX1dJTjMyOwogICAgIHBNb2R1bGUtPmRncm91cCA9IDA7Ci0gICAgcE1vZHVsZS0+aGVhcF9zaXplID0gMDsKKyAgICBwTW9kdWxlLT5oZWFwX3NpemUgPSBIZWFwU2l6ZTsKICAgICBwTW9kdWxlLT5zdGFja19zaXplID0gMDsKICAgICBwTW9kdWxlLT5pcCA9IDA7CiAgICAgcE1vZHVsZS0+Y3MgPSAwOwpAQCAtODY5LDcgKzg1OCw4IEBACiAgICAgICAvKiBEdW1wIHRoZSBtb2R1bGUgY29udGVudCAqLwogCiAgICAgRHVtcEJ5dGVzKCAoY2hhciAqKXBNb2R1bGUsIChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZSwKLSAgICAgICAgICAgICAgICIuZGF0YSIsICJNb2R1bGVfU3RhcnQiLCAiTW9kdWxlX0VuZCIgKTsKKyAgICAgICAgICAgICAgICIuZGF0YSIsICJNb2R1bGVfU3RhcnQiICk7CisgICAgcmV0dXJuIChpbnQpcHN0ciAtIChpbnQpcE1vZHVsZTsKIH0KIAogCkBAIC04ODMsMTMgKzg3MywxMiBAQAogICAgIE9SRERFRiAqb2RwOwogICAgIE9SREZVTkNERUYgKmZkcDsKICAgICBPUkRSRVRERUYgKnJkcDsKLSAgICBpbnQgaTsKKyAgICBpbnQgaSwgbW9kdWxlX3NpemU7CiAKICAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5OyBkbyBub3QgZWRpdCEgKi9cbiIgKTsKICAgICBwcmludGYoICJcdC50ZXh0XG4iICk7CiAgICAgcHJpbnRmKCAiXHQuYWxpZ24gNFxuIiApOwotICAgIHByaW50ZiggIlx0Lmdsb2JsICIgUFJFRklYICIlc19Db2RlX1N0YXJ0XG4iLCBETExOYW1lICk7Ci0gICAgcHJpbnRmKCBQUkVGSVggIiVzX0NvZGVfU3RhcnQ6XG5cbiIsIERMTE5hbWUgKTsKKyAgICBwcmludGYoICJDb2RlX1N0YXJ0OlxuXG4iICk7CiAKICAgICBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnM7CiAgICAgZm9yIChpID0gMDsgaSA8PSBMaW1pdDsgaSsrLCBvZHArKykKQEAgLTk0MCwyNSArOTI5LDI4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBCdWlsZE1vZHVsZTMyKCk7CisgICAgbW9kdWxlX3NpemUgPSBCdWlsZE1vZHVsZTMyKCk7CisKKyAgICAvKiBPdXRwdXQgdGhlIERMTCBmdW5jdGlvbnMgdGFibGUgKi8KIAogICAgIHByaW50ZiggIlx0LnRleHRcbiIgKTsKLSAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfRGF0YV9TdGFydFxuIiwgRExMTmFtZSApOwotICAgIHByaW50ZiggUFJFRklYICIlc19EYXRhX1N0YXJ0OlxuIiwgRExMTmFtZSApOwotICAgIHByaW50ZiggIlx0LmxvbmcgJWQsJWRcbiIsIEJhc2UsIExpbWl0ICk7Ci0gICAgcHJpbnRmKCAiXG4vKiBGdW5jdGlvbiB0YWJsZSAqL1xuIiApOworICAgIHByaW50ZiggIlx0LmFsaWduIDRcbiIgKTsKKyAgICBwcmludGYoICJGdW5jdGlvbnM6XG4iICk7CisgICAgb2RwID0gT3JkaW5hbERlZmluaXRpb25zOworICAgIGZvciAoaSA9IDA7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspIHByaW50ZigiXHQubG9uZyAlc18lZFxuIiwgRExMTmFtZSwgaSk7CiAKKyAgICAvKiBPdXRwdXQgdGhlIERMTCBuYW1lcyB0YWJsZSAqLworCisgICAgcHJpbnRmKCAiRnVuY05hbWVzOlxuIiApOwogICAgIG9kcCA9IE9yZGluYWxEZWZpbml0aW9uczsKICAgICBmb3IgKGkgPSAwOyBpIDw9IExpbWl0OyBpKyssIG9kcCsrKQogICAgIHsKLSAgICAgICAgaWYgKG9kcC0+dHlwZSA9PSBUWVBFX0lOVkFMSUQpCi0gICAgICAgICAgICBwcmludGYoICJcdC5sb25nIDAsJXNfJWRcbiIsIERMTE5hbWUsIGkgKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgcHJpbnRmKCAiXHQubG9uZyBOYW1lXyVkLCVzXyVkXG4iLCBpLCBETExOYW1lLCBpICk7CisgICAgICAgIGlmIChvZHAtPnR5cGUgPT0gVFlQRV9JTlZBTElEKSBwcmludGYoICJcdC5sb25nIDBcbiIgKTsKKyAgICAgICAgZWxzZSBwcmludGYoICJcdC5sb25nIE5hbWVfJWRcbiIsIGkgKTsKICAgICB9Ci0gICAgcHJpbnRmKCAiXHQubG9uZyAwLDBcbiIgKTsKIAotICAgIHByaW50ZiggIlxuLyogTmFtZSB0YWJsZSAqL1xuIiApOworICAgIC8qIE91dHB1dCB0aGUgRExMIG5hbWVzICovCisKICAgICBmb3IgKGkgPSAwLCBvZHAgPSBPcmRpbmFsRGVmaW5pdGlvbnM7IGkgPD0gTGltaXQ7IGkrKywgb2RwKyspCiAgICAgewogICAgICAgICBwcmludGYoICJOYW1lXyVkOlx0IiwgaSApOwpAQCAtOTY3LDYgKzk1OSwyMCBAQAogICAgICAgICBlbHNlCiAgICAgICAgICAgICBwcmludGYoICIuYXNjaWkgXCIlc1xcMFwiXG4iLCBvZHAtPmV4cG9ydF9uYW1lICk7CiAgICAgfQorCisgICAgLyogT3V0cHV0IHRoZSBETEwgZGVzY3JpcHRvciAqLworCisgICAgcHJpbnRmKCAiRExMTmFtZTpcdC5hc2NpaSBcIiVzXFwwXCJcbiIsIERMTE5hbWUgKTsKKyAgICBwcmludGYoICJcdC5hbGlnbiA0XG4iICk7CisgICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0Rlc2NyaXB0b3JcbiIsIERMTE5hbWUgKTsKKyAgICBwcmludGYoIFBSRUZJWCAiJXNfRGVzY3JpcHRvcjpcbiIsIERMTE5hbWUgKTsKKyAgICBwcmludGYoICJcdC5sb25nIERMTE5hbWVcbiIgKTsgICAgICAgICAgLyogTmFtZSAqLworICAgIHByaW50ZiggIlx0LmxvbmcgTW9kdWxlX1N0YXJ0XG4iICk7ICAgICAvKiBNb2R1bGUgc3RhcnQgKi8KKyAgICBwcmludGYoICJcdC5sb25nICVkXG4iLCBtb2R1bGVfc2l6ZSApOyAgLyogTW9kdWxlIHNpemUgKi8KKyAgICBwcmludGYoICJcdC5sb25nICVkXG4iLCBCYXNlICk7ICAgICAgICAgLyogQmFzZSAqLworICAgIHByaW50ZiggIlx0LmxvbmcgJWRcbiIsIExpbWl0ICk7ICAgICAgICAvKiBMaW1pdCAqLworICAgIHByaW50ZiggIlx0LmxvbmcgRnVuY3Rpb25zXG4iICk7ICAgICAgICAvKiBGdW5jdGlvbnMgKi8KKyAgICBwcmludGYoICJcdC5sb25nIEZ1bmNOYW1lc1xuIiApOyAgICAgICAgLyogRnVuY3Rpb24gbmFtZXMgKi8KIH0KIAogCkBAIC05ODEsNyArOTg3LDcgQEAKICAgICBPUkRGVU5DREVGICpmZHA7CiAgICAgT1JEUkVUREVGICpyZHA7CiAgICAgaW50IGk7Ci0gICAgaW50IGNvZGVfb2Zmc2V0LCBkYXRhX29mZnNldDsKKyAgICBpbnQgY29kZV9vZmZzZXQsIGRhdGFfb2Zmc2V0LCBtb2R1bGVfc2l6ZTsKICAgICB1bnNpZ25lZCBjaGFyICpkYXRhOwogCiAgICAgZGF0YSA9ICh1bnNpZ25lZCBjaGFyICopeG1hbGxvYyggMHgxMDAwMCApOwpAQCAtOTkwLDggKzk5Niw3IEBACiAKICAgICBwcmludGYoICIvKiBGaWxlIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5OyBkbyBub3QgZWRpdCEgKi9cbiIgKTsKICAgICBwcmludGYoICJcdC50ZXh0XG4iICk7Ci0gICAgcHJpbnRmKCAiXHQuZ2xvYmwgIiBQUkVGSVggIiVzX0NvZGVfU3RhcnRcbiIsIERMTE5hbWUgKTsKLSAgICBwcmludGYoIFBSRUZJWCAiJXNfQ29kZV9TdGFydDpcbiIsIERMTE5hbWUgKTsKKyAgICBwcmludGYoICJDb2RlX1N0YXJ0OlxuIiApOwogICAgIGNvZGVfb2Zmc2V0ID0gMDsKIAogICAgIG9kcCA9IE9yZGluYWxEZWZpbml0aW9uczsKQEAgLTEwNTEsMjAgKzEwNTYsMTYgQEAKICAgICAgICAgICBjYXNlIFRZUEVfU1RVQjoKICAgICAgICAgICAgIHByaW50ZiggIi8qICVzLiVkICovXG4iLCBETExOYW1lLCBpKTsKICAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaHcgJSVicFxuIiApOwotICAgICAgICAgICAgcHJpbnRmKCAiXHRwdXNobCAkMHglMDh4XG4iLCAoRExMSWQgPDwgMTYpIHwgaSk7CiAgICAgICAgICAgICBwcmludGYoICJcdHB1c2hsICQiIFBSRUZJWCAiJXNcbiIsIGZkcC0+aW50ZXJuYWxfbmFtZSApOwotICAgICAgICAgICAgcHJpbnRmKCAiXHRsam1wICQweCUwNHgsICQiIFBSRUZJWCAiQ2FsbEZyb20xNl8lc18lc1xuIiwKKyAgICAgICAgICAgIHByaW50ZiggIlx0bGNhbGwgJDB4JTA0eCwgJCIgUFJFRklYICJDYWxsRnJvbTE2XyVzXyVzXG4iLAogICAgICAgICAgICAgICAgICAgICBXSU5FX0NPREVfU0VMRUNUT1IsCiAgICAgICAgICAgICAgICAgICAgIChvZHAtPnR5cGUgPT0gVFlQRV9SRUdJU1RFUikgPyAicmVncyIgOgogICAgICAgICAgICAgICAgICAgICAob2RwLT50eXBlID09IFRZUEVfUEFTQ0FMKSA/ICJsb25nIiA6ICJ3b3JkIiwKICAgICAgICAgICAgICAgICAgICAgZmRwLT5hcmdfdHlwZXMgKTsKICAgICAgICAgICAgIHByaW50ZiggIlx0bm9wXG4iICk7Ci0gICAgICAgICAgICBwcmludGYoICJcdG5vcFxuIiApOwotICAgICAgICAgICAgcHJpbnRmKCAiXHRub3BcbiIgKTsKLSAgICAgICAgICAgIHByaW50ZiggIlx0bm9wXG4iICk7CiAgICAgICAgICAgICBwcmludGYoICJcdG5vcFxuXG4iICk7CiAgICAgICAgICAgICBvZHAtPm9mZnNldCA9IGNvZGVfb2Zmc2V0OwotICAgICAgICAgICAgY29kZV9vZmZzZXQgKz0gMjQ7ICAvKiBBc3NlbWJseSBjb2RlIGlzIDI0IGJ5dGVzIGxvbmcgKi8KKyAgICAgICAgICAgIGNvZGVfb2Zmc2V0ICs9IDE2OyAgLyogQXNzZW1ibHkgY29kZSBpcyAxNiBieXRlcyBsb25nICovCiAgICAgICAgICAgICBicmVhazsKIAkJCiAgICAgICAgICAgZGVmYXVsdDoKQEAgLTEwODIsMTEgKzEwODMsMjQgQEAKIAogICAgIC8qIE91dHB1dCBkYXRhIHNlZ21lbnQgKi8KIAotICAgIER1bXBCeXRlcyggZGF0YSwgZGF0YV9vZmZzZXQsIE5VTEwsICJEYXRhX1N0YXJ0IiwgTlVMTCApOworICAgIER1bXBCeXRlcyggZGF0YSwgZGF0YV9vZmZzZXQsIE5VTEwsICJEYXRhX1N0YXJ0IiApOwogCiAgICAgLyogQnVpbGQgdGhlIG1vZHVsZSAqLwogCi0gICAgQnVpbGRNb2R1bGUxNiggY29kZV9vZmZzZXQsIGRhdGFfb2Zmc2V0ICk7CisgICAgbW9kdWxlX3NpemUgPSBCdWlsZE1vZHVsZTE2KCBjb2RlX29mZnNldCwgZGF0YV9vZmZzZXQgKTsKKworICAgIC8qIE91dHB1dCB0aGUgRExMIGRlc2NyaXB0b3IgKi8KKworICAgIHByaW50ZiggIlx0LnRleHRcbiIgKTsKKyAgICBwcmludGYoICJETExOYW1lOlx0LmFzY2lpIFwiJXNcXDBcIlxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggIlx0LmFsaWduIDRcbiIgKTsKKyAgICBwcmludGYoICJcdC5nbG9ibCAiIFBSRUZJWCAiJXNfRGVzY3JpcHRvclxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggUFJFRklYICIlc19EZXNjcmlwdG9yOlxuIiwgRExMTmFtZSApOworICAgIHByaW50ZiggIlx0LmxvbmcgRExMTmFtZVxuIiApOyAgICAgICAgICAvKiBOYW1lICovCisgICAgcHJpbnRmKCAiXHQubG9uZyBNb2R1bGVfU3RhcnRcbiIgKTsgICAgIC8qIE1vZHVsZSBzdGFydCAqLworICAgIHByaW50ZiggIlx0LmxvbmcgJWRcbiIsIG1vZHVsZV9zaXplICk7ICAvKiBNb2R1bGUgc2l6ZSAqLworICAgIHByaW50ZiggIlx0LmxvbmcgQ29kZV9TdGFydFxuIiApOyAgICAgICAvKiBDb2RlIHN0YXJ0ICovCisgICAgcHJpbnRmKCAiXHQubG9uZyBEYXRhX1N0YXJ0XG4iICk7ICAgICAgIC8qIERhdGEgc3RhcnQgKi8KIH0KIAogCkBAIC0xMzA2LDcgKzEzMjAsNyBAQAogICAgIHByaW50ZiggIlx0bW92bCAlJWVkaSwlZCglJWVieClcbiIsIENPTlRFWFRPRkZTRVQoRURJKSApOwogICAgIHByaW50ZiggIlx0bW92dyAtMTAoJSVlYnApLCUlYXhcbiIgKTsgIC8qIEdldCBzYXZlZCBkcyBmcm9tIHN0YWNrICovCiAgICAgcHJpbnRmKCAiXHRtb3Z3ICUlYXgsJWQoJSVlYngpXG4iLCBDT05URVhUT0ZGU0VUKERTKSApOwotICAgIHByaW50ZiggIlx0bW92dyAtMTIoJSVlYnApLCUlYXhcbiIgKTsgIC8qIEdldCBzYXZlZCBlcyBmcm9tIHN0YWNrICovCisgICAgcHJpbnRmKCAiXHRtb3Z3IC02KCUlZWJwKSwlJWF4XG4iICk7ICAvKiBHZXQgc2F2ZWQgZXMgZnJvbSBzdGFjayAqLwogICAgIHByaW50ZiggIlx0bW92dyAlJWF4LCVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChFUykgKTsKICAgICBwcmludGYoICJcdHB1c2hmbFxuIiApOwogICAgIHByaW50ZiggIlx0cG9wbCAlZCglJWVieClcbiIsIENPTlRFWFRPRkZTRVQoRUZMKSApOwpAQCAtMTMzMCw3ICsxMzQ0LDggQEAKICAgICBwcmludGYoICJcdG1vdmwgJWQoJSVlYngpLCUlZWR4XG4iLCBDT05URVhUT0ZGU0VUKEVEWCkgKTsKICAgICBwcmludGYoICJcdG1vdmwgJWQoJSVlYngpLCUlZXNpXG4iLCBDT05URVhUT0ZGU0VUKEVTSSkgKTsKICAgICBwcmludGYoICJcdG1vdmwgJWQoJSVlYngpLCUlZWRpXG4iLCBDT05URVhUT0ZGU0VUKEVESSkgKTsKLSAgICBwcmludGYoICJcdHBvcGwgJSVlYXhcbiIgKTsgIC8qIFJlbW92ZSBvbGQgZHMgYW5kIGVzIGZyb20gc3RhY2sgKi8KKyAgICBwcmludGYoICJcdHBvcGwgJSVlYXhcbiIgKTsgIC8qIFJlbW92ZSBvbGQgZHMgYW5kIGlwIGZyb20gc3RhY2sgKi8KKyAgICBwcmludGYoICJcdHBvcGwgJSVlYXhcbiIgKTsgIC8qIFJlbW92ZSBvbGQgY3MgYW5kIGVzIGZyb20gc3RhY2sgKi8KICAgICBwcmludGYoICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChEUykgKTsgLyogUHVzaCBuZXcgZHMgKi8KICAgICBwcmludGYoICJcdHB1c2h3ICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChFUykgKTsgLyogUHVzaCBuZXcgZXMgKi8KICAgICBwcmludGYoICJcdHB1c2hsICVkKCUlZWJ4KVxuIiwgQ09OVEVYVE9GRlNFVChFRkwpICk7CkBAIC0xMzUxLDEzICsxMzY2LDE2IEBACiAgKiByZW1vdmVkIGZyb20gdGhlIHN0YWNrIHVwb24gcmV0dXJuLgogICoKICAqIFN0YWNrIGxheW91dCB1cG9uIGVudHJ5IHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbjoKLSAqICAuLi4gICAgICAuLi4KLSAqIChzcCsxNCkgIGZpcnN0IDE2LWJpdCBhcmcKLSAqIChzcCsxMikgIGNzICh3b3JkKQotICogKHNwKzEwKSAgaXAgKHdvcmQpCi0gKiAoc3ArOCkgICBicCAod29yZCkKLSAqIChzcCs0KSAgIGRsbF9pZCtvcmRpbmFsIChsb25nKQotICogKHNwKSAgICAgZW50cnlwb2ludCAobG9uZykKKyAqICAuLi4gICAgICAgICAgIC4uLgorICogKHNwKzE4KSB3b3JkICAgZmlyc3QgMTYtYml0IGFyZworICogKHNwKzE2KSB3b3JkICAgY3MKKyAqIChzcCsxNCkgd29yZCAgIGlwCisgKiAoc3ArMTIpIHdvcmQgICBicAorICogKHNwKzgpICBsb25nICAgMzItYml0IGVudHJ5IHBvaW50CisgKiAoc3ArNikgIHdvcmQgICBoaWdoIHdvcmQgb2YgY3MgKGFsd2F5cyAwLCB1c2VkIHRvIHN0b3JlIGVzKQorICogKHNwKzQpICB3b3JkICAgbG93IHdvcmQgb2YgY3Mgb2YgMTYtYml0IGVudHJ5IHBvaW50CisgKiAoc3ArMikgIHdvcmQgICBoaWdoIHdvcmQgb2YgaXAgKGFsd2F5cyAwLCB1c2VkIHRvIHN0b3JlIGRzKQorICogKHNwKSAgICB3b3JkICAgbG93IHdvcmQgb2YgaXAgb2YgMTYtYml0IGVudHJ5IHBvaW50CiAgKgogICovCiBzdGF0aWMgdm9pZCBCdWlsZENhbGxGcm9tMTZGdW5jKCBjaGFyICpwcm9maWxlICkKQEAgLTEzODksMTIgKzE0MDcsMTIgQEAKICAgICAvKiBTZXR1cCBicCB0byBwb2ludCB0byBpdHMgY29weSBvbiB0aGUgc3RhY2sgKi8KIAogICAgIHByaW50ZiggIlx0bW92endsICUlc3AsJSVlYnBcbiIgKTsKLSAgICBwcmludGYoICJcdGFkZHcgJDgsJSVicFxuIiApOworICAgIHByaW50ZiggIlx0YWRkdyAkMTIsJSVicFxuIiApOwogCiAgICAgLyogU2F2ZSAxNi1iaXQgZHMgYW5kIGVzICovCiAKLSAgICBwcmludGYoICJcdHB1c2h3ICUlZHNcbiIgKTsKLSAgICBwcmludGYoICJcdHB1c2h3ICUlZXNcbiIgKTsKKyAgICBwcmludGYoICJcdG1vdncgJSVkcywtMTAoJSVlYnApXG4iICk7CisgICAgcHJpbnRmKCAiXHRtb3Z3ICUlZXMsLTYoJSVlYnApXG4iICk7CiAKICAgICAvKiBSZXN0b3JlIDMyLWJpdCBkcyBhbmQgZXMgKi8KIApAQCAtMTQyMCwxMiArMTQzOCwxMiBAQAogCiAgICAgLyogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBBUEkgZnVuY3Rpb24gKi8KIAotICAgIHByaW50ZiggIlx0bW92bCAtOCglJWVicCksJSVlYXhcbiIgKTsKKyAgICBwcmludGYoICJcdG1vdmwgLTQoJSVlYnApLCUlZWF4XG4iICk7CiAKICAgICAvKiBJZiBuZWNlc3NhcnksIHNhdmUgJWVkeCBvdmVyIHRoZSBBUEkgZnVuY3Rpb24gYWRkcmVzcyAqLwogCiAgICAgaWYgKCFyZWdfZnVuYyAmJiBzaG9ydF9yZXQpCi0gICAgICAgIHByaW50ZiggIlx0bW92bCAlJWVkeCwtOCglJWVicClcbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRtb3ZsICUlZWR4LC00KCUlZWJwKVxuIiApOwogCiAgICAgLyogU3dpdGNoIHRvIHRoZSAzMi1iaXQgc3RhY2sgKi8KIApAQCAtMTUwNiwzOCArMTUyNCwzMyBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXJncysrOwogICAgICAgICB9Ci0gICAgfQogCi0gICAgLyogUmVzdG9yZSBkcyBhbmQgZXMgKi8KKyAgICAgICAgLyogUmVzdG9yZSBkcyBhbmQgZXMgKi8KKyAgICAgICAgcHJpbnRmKCAiXHRwb3B3ICUlZXNcbiIgKTsKKyAgICAgICAgcHJpbnRmKCAiXHRwb3B3ICUlZHNcbiIgKTsKIAotICAgIHByaW50ZiggIlx0cG9wdyAlJWVzXG4iICk7Ci0gICAgcHJpbnRmKCAiXHRwb3B3ICUlZHNcbiIgKTsKLQotICAgIC8qIEdldCB0aGUgcmV0dXJuIHZhbHVlIGludG8gZHg6YXggYW5kIGNsZWFuIHVwIHRoZSBzdGFjayAqLwotCi0gICAgaWYgKCFyZWdfZnVuYykKLSAgICB7Ci0gICAgICAgIGlmIChzaG9ydF9yZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZiggIlx0cG9wbCAlJWVkeFxuIiApOyAgICAgLyogUmVzdG9yZSAlZWR4ICovCi0gICAgICAgICAgICBwcmludGYoICJcdGFkZGwgJDQsJSVlc3BcbiIgKTsgIC8qIFJlbW92ZSBETEwgaWQgYW5kIG9yZGluYWwgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaW50ZiggIlx0cHVzaGwgJSVlYXhcbiIgKTsKLSAgICAgICAgICAgIHByaW50ZiggIlx0cG9wdyAlJWF4XG4iICk7Ci0gICAgICAgICAgICBwcmludGYoICJcdHBvcHcgJSVkeFxuIiApOwotICAgICAgICAgICAgLyogUmVtb3ZlIEFQSSBlbnRyeSBwb2ludCwgRExMIGlkIGFuZCBvcmRpbmFsIGZyb20gdGhlIHN0YWNrICovCi0gICAgICAgICAgICBwcmludGYoICJcdGFkZGwgJDgsJSVlc3BcbiIgKTsKLSAgICAgICAgfQorICAgICAgICAvKiBSZW1vdmUgdGhlIGVudHJ5IHBvaW50IGZyb20gdGhlIHN0YWNrICovCisgICAgICAgIC8qICh3ZSBkb24ndCB1c2UgYWRkIHRvIGF2b2lkIG1vZGlmeWluZyB0aGUgY2FycnkgZmxhZykgKi8KKyAgICAgICAgcHJpbnRmKCAiXHRwb3BsICUlZWJwXG4iICk7CiAgICAgfQogICAgIGVsc2UKICAgICB7Ci0gICAgICAgIC8qIFJlbW92ZSBBUEkgZW50cnkgcG9pbnQsIERMTCBpZCBhbmQgb3JkaW5hbCBmcm9tIHRoZSBzdGFjaywgKi8KLSAgICAgICAgLyogYnV0IHRha2UgY2FyZSBub3QgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgY2FycnkgZmxhZy4gICAqLworICAgICAgICAvKiBSZXN0b3JlIGRzIGFuZCBlcyAqLworICAgICAgICBwcmludGYoICJcdHBvcHcgJSVicFxuIiApOyAgICAgICAvKiBSZW1vdmUgaXAgKi8KKyAgICAgICAgcHJpbnRmKCAiXHRwb3BsICUlZWJwXG4iICk7ICAgICAgLyogUmVtb3ZlIGRzIGFuZCBjcyAqLworICAgICAgICBwcmludGYoICJcdG1vdncgJSVicCwlJWRzXG4iICk7ICAvKiBSZXN0b3JlIGRzICovCisgICAgICAgIHByaW50ZiggIlx0cG9wdyAlJWVzXG4iICk7ICAgICAgIC8qIFJlc3RvcmUgZXMgKi8KIAotICAgICAgICBwcmludGYoICJcdHBvcGwgJSVlYnBcbiIgKTsKLSAgICAgICAgcHJpbnRmKCAiXHRwb3BsICUlZWJwXG4iICk7CisgICAgICAgIGlmIChzaG9ydF9yZXQpIHByaW50ZiggIlx0cG9wbCAlJWVkeFxuIiApOyAgICAgLyogUmVzdG9yZSBlZHggKi8KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBHZXQgdGhlIHJldHVybiB2YWx1ZSBpbnRvIGR4OmF4ICovCisgICAgICAgICAgICBwcmludGYoICJcdHB1c2hsICUlZWF4XG4iICk7CisgICAgICAgICAgICBwcmludGYoICJcdHBvcHcgJSVheFxuIiApOworICAgICAgICAgICAgcHJpbnRmKCAiXHRwb3B3ICUlZHhcbiIgKTsKKyAgICAgICAgICAgIC8qIFJlbW92ZSBBUEkgZW50cnkgcG9pbnQgKi8KKyAgICAgICAgICAgIHByaW50ZiggIlx0YWRkbCAkNCwlJWVzcFxuIiApOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyogUmVzdG9yZSBicCAqLwpkaWZmIC0tZ2l0IGEvd2luMzIvY3Vyc29yaWNvbjMyLmMgYi93aW4zMi9jdXJzb3JpY29uMzIuYwppbmRleCA2MzNlZWUyLi5lNWExMDJkIDEwMDY0NAotLS0gYS93aW4zMi9jdXJzb3JpY29uMzIuYworKysgYi93aW4zMi9jdXJzb3JpY29uMzIuYwpAQCAtMzksNiArMzksNDMgQEAKICNpbmNsdWRlICJ4bWFsbG9jLmgiCiAjaW5jbHVkZSAidGFzay5oIgogCisvKiBUaGlzIGRpY3Rpb25hcnkgY291bGQgbWlnaHQgZXZlbnR1YWxseSBiZWNvbWUgYSBtYWNybyBmb3IgYmV0dGVyIHJldXNlICovCitzdHJ1Y3QgTUFQX0RXT1JEX0RXT1JEeworCURXT1JEIGtleTsKKwlEV09SRCB2YWx1ZTsKK307CisKK3N0cnVjdCBNQVBfRFdPUkRfRFdPUkQgKkNVUlNPUklDT05fbWFwOworaW50IENVUlNPUklDT05fY291bnQ7CisKK0JPT0wgQ1VSU09SSUNPTl9sb29rdXAoRFdPUkQga2V5LERXT1JEICp2YWx1ZSkKK3sKKwlpbnQgaTsKKwlmb3IoaT0wO2k8Q1VSU09SSUNPTl9jb3VudDtpKyspCisJeworCQlpZihrZXk9PUNVUlNPUklDT05fbWFwW2ldLmtleSkKKwkJeworCQkJKnZhbHVlPUNVUlNPUklDT05fbWFwW2ldLnZhbHVlOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworfQorCit2b2lkIENVUlNPUklDT05faW5zZXJ0KERXT1JEIGtleSxEV09SRCB2YWx1ZSkKK3sKKwlpZighQ1VSU09SSUNPTl9jb3VudCkKKwl7CisJCUNVUlNPUklDT05fY291bnQ9MTsKKwkJQ1VSU09SSUNPTl9tYXA9bWFsbG9jKHNpemVvZihzdHJ1Y3QgTUFQX0RXT1JEX0RXT1JEKSk7CisJfWVsc2V7CisJCUNVUlNPUklDT05fY291bnQrKzsKKwkJQ1VSU09SSUNPTl9tYXA9cmVhbGxvYyhDVVJTT1JJQ09OX21hcCwKKwkJCXNpemVvZihzdHJ1Y3QgTUFQX0RXT1JEX0RXT1JEKSpDVVJTT1JJQ09OX2NvdW50KTsKKwl9CisJQ1VSU09SSUNPTl9tYXBbQ1VSU09SSUNPTl9jb3VudC0xXS5rZXk9a2V5OworCUNVUlNPUklDT05fbWFwW0NVUlNPUklDT05fY291bnQtMV0udmFsdWU9dmFsdWU7Cit9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKgkgICAgQ1VSU09SSUNPTjMyX0ZpbmRCZXN0SWNvbgpAQCAtNDA3LDggKzQ0NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgIChMUFdTVFIpIChmQ3Vyc29yID8gUlRfQ1VSU09SIDogUlRfSUNPTiApKSkpIHJldHVybiAwOwogICAgIGlmICghKGhhbmRsZSA9IExvYWRSZXNvdXJjZTMyKCBoSW5zdGFuY2UsIGhSc3JjICkpKSByZXR1cm4gMDsKIAorCS8qIFVzZSB0aGUgcmVzb3VyY2UgaGFuZGxlIGFzIGtleSB0byBkZXRlY3QgbXVsdGlwbGUgbG9hZGluZyAqLworCWlmKENVUlNPUklDT05fbG9va3VwKGhhbmRsZSwmaFJldCkpCisJCXJldHVybiBoUmV0OworCiAgICAgaFJldCA9IENVUlNPUklDT04zMl9Mb2FkSGFuZGxlciggaGFuZGxlLCBoSW5zdGFuY2UsIGZDdXJzb3IgKTsKLSAgICBGcmVlUmVzb3VyY2UzMihoYW5kbGUpOworICAgIC8qIE9ic29sZXRlIC0gRnJlZVJlc291cmNlMzIoaGFuZGxlKTsqLworCUNVUlNPUklDT05faW5zZXJ0KGhhbmRsZSxoUmV0KTsKICAgICByZXR1cm4gaFJldDsKIH0KIApkaWZmIC0tZ2l0IGEvd2luMzIvbWVtb3J5LmMgYi93aW4zMi9tZW1vcnkuYwppbmRleCBiYTU4ZjZmLi42NzQ1NWU0IDEwMDY0NAotLS0gYS93aW4zMi9tZW1vcnkuYworKysgYi93aW4zMi9tZW1vcnkuYwpAQCAtMjk2LDMgKzI5NiwyMyBAQAogICAgcmV0dXJuIHByb3Q7CiB9CiAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgICAgICAgICAgSXNCYWRSZWFkUHRyCisgKi8KK0JPT0wgV0lOMzJfSXNCYWRSZWFkUHRyKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCWRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiSXNCYWRSZWFkUHRyKCV4LCV4KVxuIixwdHIsYnl0ZXMpOworCS8qIEZJWE1FOiBTaG91bGQgbWFrZSBjaGVjayBiYXNlZCBvbiBhY3R1YWwgbWFwcGluZ3MsIGhlcmUgKi8KKwlyZXR1cm4gRkFMU0U7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgIElzQmFkV3JpdGVQdHIKKyAqLworQk9PTCBXSU4zMl9Jc0JhZFdyaXRlUHRyKHZvaWQqIHB0ciwgdW5zaWduZWQgaW50IGJ5dGVzKQoreworCWRwcmludGZfZ2xvYmFsKHN0ZGRlYiwiSXNCYWRXcml0ZVB0cigleCwleClcbiIscHRyLGJ5dGVzKTsKKwkvKiBGSVhNRTogU2hvdWxkIG1ha2UgY2hlY2sgYmFzZWQgb24gYWN0dWFsIG1hcHBpbmdzLCBoZXJlICovCisJcmV0dXJuIEZBTFNFOworfQpkaWZmIC0tZ2l0IGEvd2luMzIvbmV3Zm5zLmMgYi93aW4zMi9uZXdmbnMuYwppbmRleCBjNGE5OWYxLi4zMWJiMTc5IDEwMDY0NAotLS0gYS93aW4zMi9uZXdmbnMuYworKysgYi93aW4zMi9uZXdmbnMuYwpAQCAtOCw3ICs4LDYgQEAKIGF0IGEgbGF0ZXIgZGF0ZS4gKi8KIAogI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAibW9kdWxlLmgiCiAjaW5jbHVkZSAid2luZG93cy5oIgogI2luY2x1ZGUgIndpbmVycm9yLmgiCiAjaW5jbHVkZSAia2VybmVsMzIuaCIKQEAgLTE2LDI1ICsxNSw2IEBACiAjaW5jbHVkZSAiZGVidWcuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2V0UHJvY0FkZHJlc3MJCShLRVJORUwzMi4yNTcpCi0gKgotICovCi0gLyogRklYTUU6IFRoaXMgaXMgY3VycmVudGx5IG5vdCB1c2VkLCBzZWUgV0lOMzJfR2V0UHJvY0FkZHJlc3MgKi8KLVdJTkFQSSBGQVJQUk9DIFczMl9HZXRQcm9jQWRkcmVzcyhITU9EVUxFIGhNb2R1bGUsCi0JCQkgICAgICBMUENTVFIgbHBzelByb2MpCi17Ci0gICAgY2hhciAqbW9kdWxlbmFtZTsKLQotICAgIG1vZHVsZW5hbWUgPSBNT0RVTEVfR2V0TW9kdWxlTmFtZShoTW9kdWxlKTsKLSAgICBpZiAobW9kdWxlbmFtZSA9PSBOVUxMKQotCXJldHVybiAoRkFSUFJPQykgTlVMTDsKLSAgICBpZiAoKChpbnQpIGxwc3pQcm9jKSAmIDB4ZmZmZikgCi0JcmV0dXJuIFJFTEFZMzJfR2V0RW50cnlQb2ludChtb2R1bGVuYW1lLCBscHN6UHJvYywgMCk7Ci0gICAgZWxzZQotCXJldHVybiBSRUxBWTMyX0dldEVudHJ5UG9pbnQobW9kdWxlbmFtZSwgKGNoYXIgKikgTlVMTCwgKGludCkgbHBzelByb2MpOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgIFdpbkhlbHBBICAgICAgICAgICAoVVNFUjMyLjU3OCkKICAqLwogQk9PTCBXSU4zMl9XaW5IZWxwQShIV05EIGhXbmQsTFBDU1RSIGxwc3pIZWxwLFVJTlQgdUNvbW1hbmQsIERXT1JEIGR3RGF0YSkKZGlmZiAtLWdpdCBhL3dpbjMyL3Byb2Nlc3MuYyBiL3dpbjMyL3Byb2Nlc3MuYwppbmRleCBhN2E4NmM4Li4yOTAxNTI0IDEwMDY0NAotLS0gYS93aW4zMi9wcm9jZXNzLmMKKysrIGIvd2luMzIvcHJvY2Vzcy5jCkBAIC0xMjAsMyArMTIwLDMyIEBACiAJcmV0dXJuIFBFX0dldFByb2NBZGRyZXNzKEdldEV4ZVB0cihoTW9kdWxlKSxmdW5jdGlvbik7CiB9CiAjZW5kaWYgIC8qIFdJTkVMSUIgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIEdldFByb2Nlc3NBZmZpbml0eU1hc2sKKyAqLworQk9PTCBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKEhBTkRMRTMyIGhQcm9jZXNzLCBMUERXT1JEIGxwUHJvY2Vzc0FmZmluaXR5TWFzaywKKyAgTFBEV09SRCBscFN5c3RlbUFmZmluaXR5TWFzaykKK3sKKwlkcHJpbnRmX3Rhc2soc3RkZGViLCJHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCV4LCV4LCV4KVxuIiwKKwkJaFByb2Nlc3MsKGxwUHJvY2Vzc0FmZmluaXR5TWFzaz8qbHBQcm9jZXNzQWZmaW5pdHlNYXNrOjApLAorCQkobHBTeXN0ZW1BZmZpbml0eU1hc2s/KmxwU3lzdGVtQWZmaW5pdHlNYXNrOjApKTsKKwkvKiBJdCBpcyBkZWZpbml0ZWx5IGltcG9ydGFudCBmb3IgYSBwcm9jZXNzIHRvIGtub3cgb24gd2hhdCBwcm9jZXNzb3IKKwkgICBpdCBpcyBydW5uaW5nIDotKSAqLworCWlmKGxwUHJvY2Vzc0FmZmluaXR5TWFzaykKKwkJKmxwUHJvY2Vzc0FmZmluaXR5TWFzaz0xOworCWlmKGxwU3lzdGVtQWZmaW5pdHlNYXNrKQorCQkqbHBTeXN0ZW1BZmZpbml0eU1hc2s9MTsKKwlyZXR1cm4gVFJVRTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBTZXRUaHJlYWRBZmZpbml0eU1hc2sKKyAqLworQk9PTCBTZXRUaHJlYWRBZmZpbml0eU1hc2soSEFORExFMzIgaFRocmVhZCwgRFdPUkQgZHdUaHJlYWRBZmZpbml0eU1hc2spCit7CisJZHByaW50Zl90YXNrKHN0ZGRlYiwiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCV4LCV4KVxuIixoVGhyZWFkLAorCQlkd1RocmVhZEFmZmluaXR5TWFzayk7CisJLyogRklYTUU6IFdlIGxldCBpdCBmYWlsICovCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS93aW4zMi90aHJlYWQuYyBiL3dpbjMyL3RocmVhZC5jCmluZGV4IDNkOTU4ZDAuLjVhYTBhZDUgMTAwNjQ0Ci0tLSBhL3dpbjMyL3RocmVhZC5jCisrKyBiL3dpbjMyL3RocmVhZC5jCkBAIC04LDYgKzgsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJ3aW5iYXNlLmgiCiAjaW5jbHVkZSAid2luZXJyb3IuaCIKICNpbmNsdWRlICJrZXJuZWwzMi5oIgogI2luY2x1ZGUgInN0ZGRlYnVnLmgiCmRpZmYgLS1naXQgYS93aW5kb3dzL2NsYXNzLmMgYi93aW5kb3dzL2NsYXNzLmMKaW5kZXggMDRhMDVkZi4uMWE5NzE0MCAxMDA2NDQKLS0tIGEvd2luZG93cy9jbGFzcy5jCisrKyBiL3dpbmRvd3MvY2xhc3MuYwpAQCAtMTUsMTEgKzE1LDEwIEBACiAjaW5jbHVkZSAibGR0LmgiCiAjaW5jbHVkZSAidG9vbGhlbHAuaCIKICNpbmNsdWRlICJzdGRkZWJ1Zy5oIgotLyogI2RlZmluZSBERUJVR19DTEFTUyAqLwogI2luY2x1ZGUgImRlYnVnLmgiCiAKIAotc3RhdGljIEhDTEFTUyBmaXJzdENsYXNzID0gMDsKK3N0YXRpYyBDTEFTUyAqZmlyc3RDbGFzcyA9IE5VTEw7CiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC0yNywyNSArMjYsMjYgQEAKICAqCiAgKiBEdW1wIHRoZSBjb250ZW50IG9mIGEgY2xhc3Mgc3RydWN0dXJlIHRvIHN0ZGVyci4KICAqLwotdm9pZCBDTEFTU19EdW1wQ2xhc3MoIEhDTEFTUyBoQ2xhc3MgKQordm9pZCBDTEFTU19EdW1wQ2xhc3MoIENMQVNTICpwdHIgKQogewotICAgIENMQVNTICpwdHI7CiAgICAgY2hhciBjbGFzc05hbWVbODBdOwogICAgIGludCBpOwogCi0gICAgaWYgKCEocHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCBoQ2xhc3MgKSkpCisgICAgaWYgKCgoQ0xBU1MgKilVU0VSX0hFQVBfTElOX0FERFIocHRyLT5zZWxmKSAhPSBwdHIpIHx8CisgICAgICAgIChwdHItPndNYWdpYyAhPSBDTEFTU19NQUdJQykpCiAgICAgewotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDR4IGlzIG5vdCBhIGNsYXNzIGhhbmRsZVxuIiwgaENsYXNzICk7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIiVwIGlzIG5vdCBhIGNsYXNzXG4iLCBwdHIgKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIEdsb2JhbEdldEF0b21OYW1lKCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHNpemVvZihjbGFzc05hbWUpICk7CiAKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJDbGFzcyAlMDR4OlxuIiwgaENsYXNzICk7CisgICAgZnByaW50Ziggc3RkZXJyLCAiQ2xhc3MgJXA6XG4iLCBwdHIgKTsKICAgICBmcHJpbnRmKCBzdGRlcnIsCi0gICAgICAgICAgICAgIm5leHQ9JTA0eCAgbmFtZT0lMDR4ICclcycgIHN0eWxlPSUwNHggIHduZFByb2M9JTA4bHhcbiIKKyAgICAgICAgICAgICAibmV4dD0lcCAgbmFtZT0lMDR4ICclcycgIHN0eWxlPSUwNHggIHduZFByb2M9JTA4bHhcbiIKICAgICAgICAgICAgICAiaW5zdD0lMDR4ICBoZGNlPSUwNHggIGljb249JTA0eCAgY3Vyc29yPSUwNHggIGJrZ25kPSUwNHhcbiIKICAgICAgICAgICAgICAiY2xzRXh0cmE9JWQgIHdpbkV4dHJhPSVkICAjd2luZG93cz0lZFxuIiwKLSAgICAgICAgICAgICBwdHItPmhOZXh0LCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHB0ci0+d2Muc3R5bGUsCisgICAgICAgICAgICAgcHRyLT5uZXh0LCBwdHItPmF0b21OYW1lLCBjbGFzc05hbWUsIHB0ci0+d2Muc3R5bGUsCiAgICAgICAgICAgICAgKERXT1JEKXB0ci0+d2MubHBmblduZFByb2MsIHB0ci0+d2MuaEluc3RhbmNlLCBwdHItPmhkY2UsCiAgICAgICAgICAgICAgcHRyLT53Yy5oSWNvbiwgcHRyLT53Yy5oQ3Vyc29yLCBwdHItPndjLmhickJhY2tncm91bmQsCiAgICAgICAgICAgICAgcHRyLT53Yy5jYkNsc0V4dHJhLCBwdHItPndjLmNiV25kRXh0cmEsIHB0ci0+Y1dpbmRvd3MgKTsKQEAgLTY3LDY3ICs2Nyw5NCBAQAogICovCiB2b2lkIENMQVNTX1dhbGtDbGFzc2VzKHZvaWQpCiB7Ci0gICAgSENMQVNTIGhDbGFzcyA9IGZpcnN0Q2xhc3M7CiAgICAgQ0xBU1MgKnB0cjsKICAgICBjaGFyIGNsYXNzTmFtZVs4MF07CiAKLSAgICBmcHJpbnRmKCBzdGRlcnIsICJDbGFzcyAgTmFtZSAgICAgICAgICAgICAgICBTdHlsZSBXbmRQcm9jXG4iICk7Ci0gICAgd2hpbGUgKGhDbGFzcykKKyAgICBmcHJpbnRmKCBzdGRlcnIsICIgQ2xhc3MgICBOYW1lICAgICAgICAgICAgICAgIFN0eWxlIFduZFByb2NcbiIgKTsKKyAgICBmb3IgKHB0ciA9IGZpcnN0Q2xhc3M7IHB0cjsgcHRyID0gcHRyLT5uZXh0KQogICAgIHsKLSAgICAgICAgaWYgKCEocHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCBoQ2xhc3MgKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIioqKiBCYWQgY2xhc3MgJTA0eCBpbiBsaXN0XG4iLCBoQ2xhc3MgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQogICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZSggcHRyLT5hdG9tTmFtZSwgY2xhc3NOYW1lLCBzaXplb2YoY2xhc3NOYW1lKSApOwotICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDR4ICAlLTIwLjIwcyAlMDR4ICUwOGx4XG4iLAotICAgICAgICAgICAgICAgICBoQ2xhc3MsIGNsYXNzTmFtZSwgcHRyLT53Yy5zdHlsZSwgKERXT1JEKXB0ci0+d2MubHBmblduZFByb2MpOwotICAgICAgICBoQ2xhc3MgPSBwdHItPmhOZXh0OworICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICIlMDhseCAlLTIwLjIwcyAlMDR4ICUwOGx4XG4iLCAoRFdPUkQpcHRyLCBjbGFzc05hbWUsCisgICAgICAgICAgICAgICAgIHB0ci0+d2Muc3R5bGUsIChEV09SRClwdHItPndjLmxwZm5XbmRQcm9jICk7CiAgICAgfQogICAgIGZwcmludGYoIHN0ZGVyciwgIlxuIiApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIENMQVNTX0ZyZWVDbGFzcworICoKKyAqIEZyZWUgYSBjbGFzcyBzdHJ1Y3R1cmUuCisgKi8KK3N0YXRpYyB2b2lkIENMQVNTX0ZyZWVDbGFzcyggQ0xBU1MgKmNsYXNzUHRyICkKK3sKKyAgICBDTEFTUyAqKnBwQ2xhc3M7CisKKyAgICAvKiBSZW1vdmUgdGhlIGNsYXNzIGZyb20gdGhlIGxpbmtlZCBsaXN0ICovCisKKyAgICBmb3IgKHBwQ2xhc3MgPSAmZmlyc3RDbGFzczsgKnBwQ2xhc3M7IHBwQ2xhc3MgPSAmKCpwcENsYXNzKS0+bmV4dCkKKyAgICAgICAgaWYgKCpwcENsYXNzID09IGNsYXNzUHRyKSBicmVhazsKKyAgICBpZiAoISpwcENsYXNzKQorICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ2xhc3MgbGlzdCBjb3JydXB0ZWRcbiIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAqcHBDbGFzcyA9IGNsYXNzUHRyLT5uZXh0OworCisgICAgLyogRGVsZXRlIHRoZSBjbGFzcyAqLworCisgICAgaWYgKGNsYXNzUHRyLT5oZGNlKSBEQ0VfRnJlZURDRSggY2xhc3NQdHItPmhkY2UgKTsKKyAgICBpZiAoY2xhc3NQdHItPndjLmhickJhY2tncm91bmQpIERlbGV0ZU9iamVjdCggY2xhc3NQdHItPndjLmhickJhY2tncm91bmQgKTsKKyAgICBHbG9iYWxEZWxldGVBdG9tKCBjbGFzc1B0ci0+YXRvbU5hbWUgKTsKKyAgICBpZiAoSElXT1JEKGNsYXNzUHRyLT53Yy5scHN6TWVudU5hbWUpKQorCVVTRVJfSEVBUF9GUkVFKCAoSEFORExFKWNsYXNzUHRyLT53Yy5scHN6TWVudU5hbWUgKTsKKyAgICBVU0VSX0hFQVBfRlJFRSggY2xhc3NQdHItPnNlbGYgKTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBDTEFTU19GcmVlTW9kdWxlQ2xhc3NlcworICovCit2b2lkIENMQVNTX0ZyZWVNb2R1bGVDbGFzc2VzKCBITU9EVUxFIGhNb2R1bGUgKQoreworICAgIENMQVNTICpwdHIsICpuZXh0OworICAKKyAgICBmb3IgKHB0ciA9IGZpcnN0Q2xhc3M7IHB0cjsgcHRyID0gbmV4dCkKKyAgICB7CisgICAgICAgIG5leHQgPSBwdHItPm5leHQ7CisJaWYgKHB0ci0+d2MuaEluc3RhbmNlID09IGhNb2R1bGUpIENMQVNTX0ZyZWVDbGFzcyggcHRyICk7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIENMQVNTX0ZpbmRDbGFzc0J5TmFtZQogICoKLSAqIFJldHVybiBhIGhhbmRsZSBhbmQgYSBwb2ludGVyIHRvIHRoZSBjbGFzcy4KLSAqICdwdHInIGNhbiBiZSBOVUxMIGlmIHRoZSBwb2ludGVyIGlzIG5vdCBuZWVkZWQuCisgKiBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjbGFzcy4KICAqLwotSENMQVNTIENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggU0VHUFRSIG5hbWUsIEhJTlNUQU5DRSBoaW5zdGFuY2UsIENMQVNTICoqcHRyICkKK0NMQVNTICpDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIFNFR1BUUiBuYW1lLCBISU5TVEFOQ0UgaGluc3RhbmNlICkKIHsKICAgICBBVE9NIGF0b207Ci0gICAgSENMQVNTIGNsYXNzOwotICAgIENMQVNTICogY2xhc3NQdHI7CisgICAgQ0xBU1MgKiBjbGFzczsKIAogICAgIGlmICghKGF0b20gPSBHbG9iYWxGaW5kQXRvbSggbmFtZSApKSkgcmV0dXJuIDA7CiAKICAgICAgIC8qIEZpcnN0IHNlYXJjaCB0YXNrLXNwZWNpZmljIGNsYXNzZXMgKi8KIAotICAgIGZvciAoY2xhc3MgPSBmaXJzdENsYXNzOyAoY2xhc3MpOyBjbGFzcyA9IGNsYXNzUHRyLT5oTmV4dCkKKyAgICBmb3IgKGNsYXNzID0gZmlyc3RDbGFzczsgKGNsYXNzKTsgY2xhc3MgPSBjbGFzcy0+bmV4dCkKICAgICB7Ci0gICAgICAgIGNsYXNzUHRyID0gKENMQVNTICopIFVTRVJfSEVBUF9MSU5fQUREUihjbGFzcyk7Ci0gICAgICAgIGlmIChjbGFzc1B0ci0+d2Muc3R5bGUgJiBDU19HTE9CQUxDTEFTUykgY29udGludWU7Ci0gICAgICAgIGlmICgoY2xhc3NQdHItPmF0b21OYW1lID09IGF0b20pICYmIAotICAgICAgICAgICAgKCAoaGluc3RhbmNlPT0oSElOU1RBTkNFKTB4ZmZmZikgfHwKLQkgICAgICAoaGluc3RhbmNlID09IGNsYXNzUHRyLT53Yy5oSW5zdGFuY2UpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHRyKSAqcHRyID0gY2xhc3NQdHI7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3M7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKGNsYXNzLT53Yy5zdHlsZSAmIENTX0dMT0JBTENMQVNTKSBjb250aW51ZTsKKyAgICAgICAgaWYgKChjbGFzcy0+YXRvbU5hbWUgPT0gYXRvbSkgJiYgCisgICAgICAgICAgICAoKGhpbnN0YW5jZT09KEhJTlNUQU5DRSkweGZmZmYpIHx8CisgICAgICAgICAgICAgKGhpbnN0YW5jZSA9PSBjbGFzcy0+d2MuaEluc3RhbmNlKSkpIHJldHVybiBjbGFzczsKICAgICB9CiAgICAgCiAgICAgICAvKiBUaGVuIHNlYXJjaCBnbG9iYWwgY2xhc3NlcyAqLwogCi0gICAgZm9yIChjbGFzcyA9IGZpcnN0Q2xhc3M7IChjbGFzcyk7IGNsYXNzID0gY2xhc3NQdHItPmhOZXh0KQorICAgIGZvciAoY2xhc3MgPSBmaXJzdENsYXNzOyAoY2xhc3MpOyBjbGFzcyA9IGNsYXNzLT5uZXh0KQogICAgIHsKLSAgICAgICAgY2xhc3NQdHIgPSAoQ0xBU1MgKikgVVNFUl9IRUFQX0xJTl9BRERSKGNsYXNzKTsKLSAgICAgICAgaWYgKCEoY2xhc3NQdHItPndjLnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpKSBjb250aW51ZTsKLSAgICAgICAgaWYgKGNsYXNzUHRyLT5hdG9tTmFtZSA9PSBhdG9tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocHRyKSAqcHRyID0gY2xhc3NQdHI7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3M7Ci0gICAgICAgIH0KKyAgICAgICAgaWYgKCEoY2xhc3MtPndjLnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpKSBjb250aW51ZTsKKyAgICAgICAgaWYgKGNsYXNzLT5hdG9tTmFtZSA9PSBhdG9tKSByZXR1cm4gY2xhc3M7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xMzUsMjggKzE2MiwxMiBAQAogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIENMQVNTX0ZpbmRDbGFzc1B0cgotICoKLSAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIENMQVNTIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGEgSENMQVNTLgotICovCi1DTEFTUyAqIENMQVNTX0ZpbmRDbGFzc1B0ciggSENMQVNTIGhjbGFzcyApCi17Ci0gICAgQ0xBU1MgKiBwdHI7Ci0gICAgCi0gICAgaWYgKCFoY2xhc3MpIHJldHVybiBOVUxMOwotICAgIHB0ciA9IChDTEFTUyAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGhjbGFzcyApOwotICAgIGlmIChwdHItPndNYWdpYyAhPSBDTEFTU19NQUdJQykgcmV0dXJuIE5VTEw7Ci0gICAgcmV0dXJuIHB0cjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBSZWdpc3RlckNsYXNzICAgIChVU0VSLjU3KQogICovCiBBVE9NIFJlZ2lzdGVyQ2xhc3MoIExQV05EQ0xBU1MgY2xhc3MgKQogewotICAgIENMQVNTICogbmV3Q2xhc3MsICogcHJldkNsYXNzUHRyOwotICAgIEhDTEFTUyBoYW5kbGUsIHByZXZDbGFzczsKKyAgICBDTEFTUyAqIG5ld0NsYXNzLCAqIHByZXZDbGFzczsKKyAgICBIQ0xBU1MgaGFuZGxlOwogICAgIGludCBjbGFzc0V4dHJhOwogCiAgICAgZHByaW50Zl9jbGFzcyggc3RkZGViLCAiUmVnaXN0ZXJDbGFzczogd25kcHJvYz0lMDhseCBoaW5zdD0lMDR4IG5hbWU9JyVzJyBiYWNrZ3JvdW5kICUwNHhcbiIsCkBAIC0xNzEsMTUgKzE4MiwxNCBAQAogICAgIGNsYXNzLT5oSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGNsYXNzLT5oSW5zdGFuY2UgKTsKICAgICAKICAgICAgIC8qIENoZWNrIGlmIGEgY2xhc3Mgd2l0aCB0aGlzIG5hbWUgYWxyZWFkeSBleGlzdHMgKi8KLSAgICBwcmV2Q2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIGNsYXNzLT5scHN6Q2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MtPmhJbnN0YW5jZSwgJnByZXZDbGFzc1B0ciApOworICAgIHByZXZDbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggY2xhc3MtPmxwc3pDbGFzc05hbWUsIGNsYXNzLT5oSW5zdGFuY2UpOwogICAgIGlmIChwcmV2Q2xhc3MpCiAgICAgewogCSAgLyogQ2xhc3MgY2FuIGJlIGNyZWF0ZWQgb25seSBpZiBpdCBpcyBsb2NhbCBhbmQgKi8KIAkgIC8qIGlmIHRoZSBjbGFzcyB3aXRoIHRoZSBzYW1lIG5hbWUgaXMgZ2xvYmFsLiAgICovCiAKIAlpZiAoY2xhc3MtPnN0eWxlICYgQ1NfR0xPQkFMQ0xBU1MpIHJldHVybiAwOwotCWlmICghKHByZXZDbGFzc1B0ci0+d2Muc3R5bGUgJiBDU19HTE9CQUxDTEFTUykpIHJldHVybiAwOworCWlmICghKHByZXZDbGFzcy0+d2Muc3R5bGUgJiBDU19HTE9CQUxDTEFTUykpIHJldHVybiAwOwogICAgIH0KIAogICAgICAgLyogQ3JlYXRlIGNsYXNzICovCkBAIC0xODgsNyArMTk4LDggQEAKICAgICBoYW5kbGUgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihDTEFTUykgKyBjbGFzc0V4dHJhICk7CiAgICAgaWYgKCFoYW5kbGUpIHJldHVybiAwOwogICAgIG5ld0NsYXNzID0gKENMQVNTICopIFVTRVJfSEVBUF9MSU5fQUREUiggaGFuZGxlICk7Ci0gICAgbmV3Q2xhc3MtPmhOZXh0ICAgICAgICAgPSBmaXJzdENsYXNzOworICAgIG5ld0NsYXNzLT5zZWxmICAgICAgICAgID0gaGFuZGxlOworICAgIG5ld0NsYXNzLT5uZXh0ICAgICAgICAgID0gZmlyc3RDbGFzczsKICAgICBuZXdDbGFzcy0+d01hZ2ljICAgICAgICA9IENMQVNTX01BR0lDOwogICAgIG5ld0NsYXNzLT5jV2luZG93cyAgICAgID0gMDsgIAogICAgIG5ld0NsYXNzLT53YyAgICAgICAgICAgID0gKmNsYXNzOwpAQCAtMjE2LDcgKzIyNyw3IEBACiAgICAgfQogCiAgICAgaWYgKGNsYXNzRXh0cmEpIG1lbXNldCggbmV3Q2xhc3MtPndFeHRyYSwgMCwgY2xhc3NFeHRyYSApOwotICAgIGZpcnN0Q2xhc3MgPSBoYW5kbGU7CisgICAgZmlyc3RDbGFzcyA9IG5ld0NsYXNzOwogICAgIHJldHVybiBuZXdDbGFzcy0+YXRvbU5hbWU7CiB9CiAKQEAgLTIyNiw0MCArMjM3LDE2IEBACiAgKi8KIEJPT0wgVW5yZWdpc3RlckNsYXNzKCBTRUdQVFIgY2xhc3NOYW1lLCBIQU5ETEUgaGluc3RhbmNlICkKIHsKLSAgICBIQU5ETEUgY2xhc3MsIHByZXZDbGFzczsKLSAgICBDTEFTUyAqIGNsYXNzUHRyLCAqIHByZXZDbGFzc1B0cjsKLSAgICAKKyAgICBDTEFTUyAqY2xhc3NQdHI7CisKICAgICBoaW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhpbnN0YW5jZSApOworCiAgICAgICAvKiBDaGVjayBpZiB3ZSBjYW4gcmVtb3ZlIHRoaXMgY2xhc3MgKi8KLSAgICBjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggY2xhc3NOYW1lLCBoaW5zdGFuY2UsICZjbGFzc1B0ciApOwotICAgIGlmICghY2xhc3MpIHJldHVybiBGQUxTRTsKKyAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggY2xhc3NOYW1lLCBoaW5zdGFuY2UgKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsKICAgICBpZiAoKGNsYXNzUHRyLT53Yy5oSW5zdGFuY2UgIT0gaGluc3RhbmNlKSB8fCAoY2xhc3NQdHItPmNXaW5kb3dzID4gMCkpCiAJcmV0dXJuIEZBTFNFOwotICAgIAotICAgICAgLyogUmVtb3ZlIHRoZSBjbGFzcyBmcm9tIHRoZSBsaW5rZWQgbGlzdCAqLwotICAgIGlmIChmaXJzdENsYXNzID09IGNsYXNzKSBmaXJzdENsYXNzID0gY2xhc3NQdHItPmhOZXh0OwotICAgIGVsc2UKLSAgICB7Ci0JZm9yIChwcmV2Q2xhc3MgPSBmaXJzdENsYXNzOyBwcmV2Q2xhc3M7IHByZXZDbGFzcz1wcmV2Q2xhc3NQdHItPmhOZXh0KQotCXsKLQkgICAgcHJldkNsYXNzUHRyID0gKENMQVNTICopIFVTRVJfSEVBUF9MSU5fQUREUihwcmV2Q2xhc3MpOwotCSAgICBpZiAocHJldkNsYXNzUHRyLT5oTmV4dCA9PSBjbGFzcykgYnJlYWs7Ci0JfQotCWlmICghcHJldkNsYXNzKQotCXsKLQkgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogQ2xhc3MgbGlzdCBjb3JydXB0ZWRcbiIgKTsKLQkgICAgcmV0dXJuIEZBTFNFOwotCX0KLQlwcmV2Q2xhc3NQdHItPmhOZXh0ID0gY2xhc3NQdHItPmhOZXh0OwotICAgIH0KLQotICAgICAgLyogRGVsZXRlIHRoZSBjbGFzcyAqLwotICAgIGlmIChjbGFzc1B0ci0+aGRjZSkgRENFX0ZyZWVEQ0UoIGNsYXNzUHRyLT5oZGNlICk7Ci0gICAgaWYgKGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKSBEZWxldGVPYmplY3QoIGNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kICk7Ci0gICAgR2xvYmFsRGVsZXRlQXRvbSggY2xhc3NQdHItPmF0b21OYW1lICk7Ci0gICAgaWYgKEhJV09SRChjbGFzc1B0ci0+d2MubHBzek1lbnVOYW1lKSkKLQlVU0VSX0hFQVBfRlJFRSggKEhBTkRMRSljbGFzc1B0ci0+d2MubHBzek1lbnVOYW1lICk7Ci0gICAgVVNFUl9IRUFQX0ZSRUUoIGNsYXNzICk7CisgICAgQ0xBU1NfRnJlZUNsYXNzKCBjbGFzc1B0ciApOwogICAgIHJldHVybiBUUlVFOwogfQogCkBAIC0yNjksNyArMjU2LDI0IEBACiAgKi8KIFdPUkQgR2V0Q2xhc3NXb3JkKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCApCiB7Ci0gICAgcmV0dXJuIChXT1JEKUdldENsYXNzTG9uZyggaHduZCwgb2Zmc2V0ICk7CisgICAgV05EICogd25kUHRyOworICAgIAorICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKKyAgICBpZiAob2Zmc2V0ID49IDApCisgICAgICAgIHJldHVybiAqKFdPUkQgKikoKChjaGFyICopd25kUHRyLT5jbGFzcy0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgc3dpdGNoKG9mZnNldCkKKyAgICB7CisgICAgICAgIGNhc2UgR0NXX0hCUkJBQ0tHUk9VTkQ6IHJldHVybiB3bmRQdHItPmNsYXNzLT53Yy5oYnJCYWNrZ3JvdW5kOworICAgICAgICBjYXNlIEdDV19IQ1VSU09SOiAgICAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+d2MuaEN1cnNvcjsKKyAgICAgICAgY2FzZSBHQ1dfSElDT046ICAgICAgICAgcmV0dXJuIHduZFB0ci0+Y2xhc3MtPndjLmhJY29uOworICAgICAgICBjYXNlIEdDV19ITU9EVUxFOiAgICAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+d2MuaEluc3RhbmNlOworICAgICAgICBjYXNlIEdDV19DQldOREVYVFJBOiAgICByZXR1cm4gd25kUHRyLT5jbGFzcy0+d2MuY2JXbmRFeHRyYTsKKyAgICAgICAgY2FzZSBHQ1dfQ0JDTFNFWFRSQTogICAgcmV0dXJuIHduZFB0ci0+Y2xhc3MtPndjLmNiQ2xzRXh0cmE7CisgICAgICAgIGNhc2UgR0NXX1NUWUxFOiAgICAgICAgIHJldHVybiB3bmRQdHItPmNsYXNzLT53Yy5zdHlsZTsKKyAgICAgICAgY2FzZSBHQ1dfQVRPTTogICAgICAgICAgcmV0dXJuIHduZFB0ci0+Y2xhc3MtPmF0b21OYW1lOworICAgIH0KKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBHZXRDbGFzc1dvcmQoKVxuIiwgb2Zmc2V0KTsKKyAgICByZXR1cm4gMDsKIH0KIAogCkBAIC0yNzgsMTMgKzI4MiwyNiBAQAogICovCiBXT1JEIFNldENsYXNzV29yZCggSFdORCBod25kLCBzaG9ydCBvZmZzZXQsIFdPUkQgbmV3dmFsICkKIHsKLSAgICBDTEFTUyAqIGNsYXNzUHRyOwogICAgIFdORCAqIHduZFB0cjsKICAgICBXT1JEICpwdHIsIHJldHZhbCA9IDA7CiAgICAgCiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIHJldHVybiAwOwotICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIDA7Ci0gICAgcHRyID0gKFdPUkQgKikoKChjaGFyICopY2xhc3NQdHItPndFeHRyYSkgKyBvZmZzZXQpOworICAgIGlmIChvZmZzZXQgPj0gMCkgcHRyID0gKFdPUkQgKikoKChjaGFyICopd25kUHRyLT5jbGFzcy0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgZWxzZSBzd2l0Y2gob2Zmc2V0KQorICAgIHsKKyAgICAgICAgY2FzZSBHQ1dfSEJSQkFDS0dST1VORDogcHRyID0gJnduZFB0ci0+Y2xhc3MtPndjLmhickJhY2tncm91bmQ7IGJyZWFrOworICAgICAgICBjYXNlIEdDV19IQ1VSU09SOiAgICAgICBwdHIgPSAmd25kUHRyLT5jbGFzcy0+d2MuaEN1cnNvcjsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NXX0hJQ09OOiAgICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT53Yy5oSWNvbjsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NXX0hNT0RVTEU6ICAgICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT53Yy5oSW5zdGFuY2U7IGJyZWFrOworICAgICAgICBjYXNlIEdDV19DQldOREVYVFJBOiAgICBwdHIgPSAmd25kUHRyLT5jbGFzcy0+d2MuY2JXbmRFeHRyYTsgYnJlYWs7CisgICAgICAgIGNhc2UgR0NXX0NCQ0xTRVhUUkE6ICAgIHB0ciA9ICZ3bmRQdHItPmNsYXNzLT53Yy5jYkNsc0V4dHJhOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ1dfU1RZTEU6ICAgICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPndjLnN0eWxlOyBicmVhazsKKyAgICAgICAgY2FzZSBHQ1dfQVRPTTogICAgICAgICAgcHRyID0gJnduZFB0ci0+Y2xhc3MtPmF0b21OYW1lOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIldhcm5pbmc6IGludmFsaWQgb2Zmc2V0ICVkIGZvciBTZXRDbGFzc1dvcmQoKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgIG9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICB9CiAgICAgcmV0dmFsID0gKnB0cjsKICAgICAqcHRyID0gbmV3dmFsOwogICAgIHJldHVybiByZXR2YWw7CkBAIC0yOTYsMTIgKzMxMywxOCBAQAogICovCiBMT05HIEdldENsYXNzTG9uZyggSFdORCBod25kLCBzaG9ydCBvZmZzZXQgKQogewotICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgV05EICogd25kUHRyOwogICAgIAogICAgIGlmICghKHduZFB0ciA9IFdJTl9GaW5kV25kUHRyKCBod25kICkpKSByZXR1cm4gMDsKLSAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpIHJldHVybiAwOwotICAgIHJldHVybiAqKExPTkcgKikoKChjaGFyICopY2xhc3NQdHItPndFeHRyYSkgKyBvZmZzZXQpOworICAgIGlmIChvZmZzZXQgPj0gMCkKKyAgICAgICAgcmV0dXJuICooV09SRCAqKSgoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0KTsKKyAgICBzd2l0Y2gob2Zmc2V0KQorICAgIHsKKyAgICAgICAgY2FzZSBHQ0xfTUVOVU5BTUU6IHJldHVybiAoTE9ORyl3bmRQdHItPmNsYXNzLT53Yy5scHN6TWVudU5hbWU7CisgICAgICAgIGNhc2UgR0NMX1dORFBST0M6ICByZXR1cm4gKExPTkcpd25kUHRyLT5jbGFzcy0+d2MubHBmblduZFByb2M7CisgICAgfQorICAgIGZwcmludGYoc3RkZXJyLCAiV2FybmluZzogaW52YWxpZCBvZmZzZXQgJWQgZm9yIEdldENsYXNzTG9uZygpXG4iLCBvZmZzZXQpOworICAgIHJldHVybiAwOwogfQogCiAKQEAgLTMxMCwxMyArMzMzLDIwIEBACiAgKi8KIExPTkcgU2V0Q2xhc3NMb25nKCBIV05EIGh3bmQsIHNob3J0IG9mZnNldCwgTE9ORyBuZXd2YWwgKQogewotICAgIENMQVNTICogY2xhc3NQdHI7CiAgICAgV05EICogd25kUHRyOwogICAgIExPTkcgKnB0ciwgcmV0dmFsID0gMDsKICAgICAKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIDA7Ci0gICAgaWYgKCEoY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NQdHIoIHduZFB0ci0+aENsYXNzICkpKSByZXR1cm4gMDsKLSAgICBwdHIgPSAoTE9ORyAqKSgoKGNoYXIgKiljbGFzc1B0ci0+d0V4dHJhKSArIG9mZnNldCk7CisgICAgaWYgKG9mZnNldCA+PSAwKSBwdHIgPSAoTE9ORyAqKSgoKGNoYXIgKil3bmRQdHItPmNsYXNzLT53RXh0cmEpICsgb2Zmc2V0KTsKKyAgICBlbHNlIHN3aXRjaChvZmZzZXQpCisgICAgeworICAgICAgICBjYXNlIEdDTF9NRU5VTkFNRTogcHRyID0gKExPTkcqKSZ3bmRQdHItPmNsYXNzLT53Yy5scHN6TWVudU5hbWU7IGJyZWFrOworICAgICAgICBjYXNlIEdDTF9XTkRQUk9DOiAgcHRyID0gKExPTkcqKSZ3bmRQdHItPmNsYXNzLT53Yy5scGZuV25kUHJvYzsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJXYXJuaW5nOiBpbnZhbGlkIG9mZnNldCAlZCBmb3IgU2V0Q2xhc3NMb25nKClcbiIsCisgICAgICAgICAgICAgICAgICAgICBvZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgfQogICAgIHJldHZhbCA9ICpwdHI7CiAgICAgKnB0ciA9IG5ld3ZhbDsKICAgICByZXR1cm4gcmV0dmFsOwpAQCAtMzI5LDE0ICszNTksMTIgQEAKIGludCBHZXRDbGFzc05hbWUoSFdORCBod25kLCBMUFNUUiBscENsYXNzTmFtZSwgc2hvcnQgbWF4Q291bnQpCiB7CiAgICAgV05EICp3bmRQdHI7Ci0gICAgQ0xBU1MgKmNsYXNzUHRyOwogCiAgICAgLyogRklYTUU6IFdlIGhhdmUgdGhlIGZpbmQgdGhlIGNvcnJlY3QgaEluc3RhbmNlICovCiAgICAgZHByaW50Zl9jbGFzcyhzdGRkZWIsIkdldENsYXNzTmFtZSglMDR4LCVwLCVkKVxuIixod25kLGxwQ2xhc3NOYW1lLG1heENvdW50KTsKICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0cihod25kKSkpIHJldHVybiAwOwotICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKHduZFB0ci0+aENsYXNzKSkpIHJldHVybiAwOwogICAgIAotICAgIHJldHVybiBHbG9iYWxHZXRBdG9tTmFtZShjbGFzc1B0ci0+YXRvbU5hbWUsIGxwQ2xhc3NOYW1lLCBtYXhDb3VudCk7CisgICAgcmV0dXJuIEdsb2JhbEdldEF0b21OYW1lKCB3bmRQdHItPmNsYXNzLT5hdG9tTmFtZSwgbHBDbGFzc05hbWUsIG1heENvdW50ICk7CiB9CiAKIApAQCAtMzUzLDcgKzM4MSw3IEBACiAKICAgICBoSW5zdGFuY2UgPSBHZXRFeGVQdHIoIGhJbnN0YW5jZSApOwogICAgIAotICAgIGlmICghKENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggbmFtZSwgaEluc3RhbmNlLCAmY2xhc3NQdHIpKSkgcmV0dXJuIEZBTFNFOworICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlOYW1lKCBuYW1lLCBoSW5zdGFuY2UgKSkpIHJldHVybiBGQUxTRTsKICAgICBpZiAoaEluc3RhbmNlICYmIChoSW5zdGFuY2UgIT0gY2xhc3NQdHItPndjLmhJbnN0YW5jZSkpIHJldHVybiBGQUxTRTsKIAogICAgIG1lbWNweShscFduZENsYXNzLCAmKGNsYXNzUHRyLT53YyksIHNpemVvZihXTkRDTEFTUykpOwpAQCAtMzY2LDcgKzM5NCw3IEBACiAgKi8KIEJPT0wgQ2xhc3NGaXJzdCggQ0xBU1NFTlRSWSAqcENsYXNzRW50cnkgKQogewotICAgIHBDbGFzc0VudHJ5LT53TmV4dCA9IGZpcnN0Q2xhc3M7CisgICAgcENsYXNzRW50cnktPndOZXh0ID0gMTsKICAgICByZXR1cm4gQ2xhc3NOZXh0KCBwQ2xhc3NFbnRyeSApOwogfQogCkBAIC0zNzYsMTIgKzQwNCwxOSBAQAogICovCiBCT09MIENsYXNzTmV4dCggQ0xBU1NFTlRSWSAqcENsYXNzRW50cnkgKQogewotICAgIENMQVNTICpjbGFzc1B0ciA9IChDTEFTUyAqKSBVU0VSX0hFQVBfTElOX0FERFIoIHBDbGFzc0VudHJ5LT53TmV4dCApOwotICAgIGlmICghY2xhc3NQdHIpIHJldHVybiBGQUxTRTsKKyAgICBpbnQgaTsKKyAgICBDTEFTUyAqY2xhc3MgPSBmaXJzdENsYXNzOwogCi0gICAgcENsYXNzRW50cnktPmhJbnN0ID0gY2xhc3NQdHItPndjLmhJbnN0YW5jZTsKLSAgICBwQ2xhc3NFbnRyeS0+d05leHQgPSBjbGFzc1B0ci0+aE5leHQ7Ci0gICAgR2xvYmFsR2V0QXRvbU5hbWUoIGNsYXNzUHRyLT5hdG9tTmFtZSwgcENsYXNzRW50cnktPnN6Q2xhc3NOYW1lLAorICAgIGlmICghcENsYXNzRW50cnktPndOZXh0KSByZXR1cm4gRkFMU0U7CisgICAgZm9yIChpID0gMTsgKGkgPCBwQ2xhc3NFbnRyeS0+d05leHQpICYmIGNsYXNzOyBpKyspIGNsYXNzID0gY2xhc3MtPm5leHQ7CisgICAgaWYgKCFjbGFzcykKKyAgICB7CisgICAgICAgIHBDbGFzc0VudHJ5LT53TmV4dCA9IDA7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgcENsYXNzRW50cnktPmhJbnN0ID0gY2xhc3MtPndjLmhJbnN0YW5jZTsKKyAgICBwQ2xhc3NFbnRyeS0+d05leHQrKzsKKyAgICBHbG9iYWxHZXRBdG9tTmFtZSggY2xhc3MtPmF0b21OYW1lLCBwQ2xhc3NFbnRyeS0+c3pDbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwQ2xhc3NFbnRyeS0+c3pDbGFzc05hbWUpICk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL2RjZS5jIGIvd2luZG93cy9kY2UuYwppbmRleCAzZmY5ZjU0Li5hZmRmMzJlIDEwMDY0NAotLS0gYS93aW5kb3dzL2RjZS5jCisrKyBiL3dpbmRvd3MvZGNlLmMKQEAgLTMxMCw5ICszMTAsOSBAQAogICAgICAgICAgICAgICAgICAgIERDWF9DTElQU0lCTElOR1MgfCBEQ1hfUEFSRU5UQ0xJUCk7CiAJaWYgKHduZFB0cikKIAl7Ci0gICAgICAgICAgICBpZiAoIShXSU5fQ0xBU1NfU1RZTEUod25kUHRyKSAmIChDU19PV05EQyB8IENTX0NMQVNTREMpKSkKKyAgICAgICAgICAgIGlmICghKHduZFB0ci0+Y2xhc3MtPndjLnN0eWxlICYgKENTX09XTkRDIHwgQ1NfQ0xBU1NEQykpKQogCQlmbGFncyB8PSBEQ1hfQ0FDSEU7Ci0gICAgICAgICAgICBpZiAoV0lOX0NMQVNTX1NUWUxFKHduZFB0cikgJiBDU19QQVJFTlREQykgZmxhZ3MgfD0gRENYX1BBUkVOVENMSVA7CisgICAgICAgICAgICBpZiAod25kUHRyLT5jbGFzcy0+d2Muc3R5bGUgJiBDU19QQVJFTlREQykgZmxhZ3MgfD0gRENYX1BBUkVOVENMSVA7CiAJICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DTElQQ0hJTERSRU4pIGZsYWdzIHw9IERDWF9DTElQQ0hJTERSRU47CiAJICAgIGlmICh3bmRQdHItPmR3U3R5bGUgJiBXU19DTElQU0lCTElOR1MpIGZsYWdzIHw9IERDWF9DTElQU0lCTElOR1M7CiAJfQpkaWZmIC0tZ2l0IGEvd2luZG93cy9kZWZ3bmQuYyBiL3dpbmRvd3MvZGVmd25kLmMKaW5kZXggZjg0YmRkYS4uY2NlNzMxMSAxMDA2NDQKLS0tIGEvd2luZG93cy9kZWZ3bmQuYworKysgYi93aW5kb3dzL2RlZnduZC5jCkBAIC04LDcgKzgsNiBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSAid2luLmgiCi0jaW5jbHVkZSAiY2xhc3MuaCIKICNpbmNsdWRlICJ1c2VyLmgiCiAjaW5jbHVkZSAibm9uY2xpZW50LmgiCiAjaW5jbHVkZSAid2lucG9zLmgiCkBAIC01Miw3ICs1MSw2IEBACiAgKi8KIExSRVNVTFQgRGVmV2luZG93UHJvYyggSFdORCBod25kLCBVSU5UIG1zZywgV1BBUkFNIHdQYXJhbSwgTFBBUkFNIGxQYXJhbSApCiB7Ci0gICAgQ0xBU1MgKiBjbGFzc1B0cjsKICAgICBMUFNUUiB0ZXh0UHRyOwogICAgIGludCBsZW47CiAgICAgV05EICogd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKQEAgLTE2NCwxOSArMTYyLDE4IEBACiAgICAgY2FzZSBXTV9FUkFTRUJLR05EOgogICAgIGNhc2UgV01fSUNPTkVSQVNFQktHTkQ6CiAJewotCSAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpIHJldHVybiAwOwotCSAgICBpZiAoIWNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKSByZXR1cm4gMDsKLSAgICAgICAgICAgIGlmIChjbGFzc1B0ci0+d2MuaGJyQmFja2dyb3VuZCA8PSAoSEJSVVNIKShDT0xPUl9NQVgrMSkpCisJICAgIGlmICghd25kUHRyLT5jbGFzcy0+d2MuaGJyQmFja2dyb3VuZCkgcmV0dXJuIDA7CisgICAgICAgICAgICBpZiAod25kUHRyLT5jbGFzcy0+d2MuaGJyQmFja2dyb3VuZCA8PSAoSEJSVVNIKShDT0xPUl9NQVgrMSkpCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgIEhCUlVTSCBoYnJ1c2g7CiAgICAgICAgICAgICAgICAgIGhicnVzaCA9IENyZWF0ZVNvbGlkQnJ1c2goCi0gICAgICAgICAgICAgICAgICAgICBHZXRTeXNDb2xvcigoKERXT1JEKWNsYXNzUHRyLT53Yy5oYnJCYWNrZ3JvdW5kKS0xKSk7CisgICAgICAgICAgICAgICAgICAgICBHZXRTeXNDb2xvcigoKERXT1JEKXduZFB0ci0+Y2xhc3MtPndjLmhickJhY2tncm91bmQpLTEpKTsKICAgICAgICAgICAgICAgICAgRmlsbFdpbmRvdyggR2V0UGFyZW50KGh3bmQpLCBod25kLCAoSERDKXdQYXJhbSwgaGJydXNoKTsKICAgICAgICAgICAgICAgICAgRGVsZXRlT2JqZWN0IChoYnJ1c2gpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogCSAgICAgICAgIEZpbGxXaW5kb3coIEdldFBhcmVudChod25kKSwgaHduZCwgKEhEQyl3UGFyYW0sCi0JCSAgICAgICAgY2xhc3NQdHItPndjLmhickJhY2tncm91bmQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd25kUHRyLT5jbGFzcy0+d2MuaGJyQmFja2dyb3VuZCApOwogCSAgICByZXR1cm4gMTsKIAl9CiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvZ3JhcGhpY3MuYyBiL3dpbmRvd3MvZ3JhcGhpY3MuYwppbmRleCBiYTY1ZGJlLi4wYTY4NDc5IDEwMDY0NAotLS0gYS93aW5kb3dzL2dyYXBoaWNzLmMKKysrIGIvd2luZG93cy9ncmFwaGljcy5jCkBAIC05OTQsMyArOTk0LDI2IEBACiB7CiAgICAgcmV0dXJuIEV4dEZsb29kRmlsbCggaGRjLCB4LCB5LCBjb2xvciwgRkxPT0RGSUxMQk9SREVSICk7CiB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgIERyYXdFZGdlICAoVVNFUi42NTkpCisgKi8KK0JPT0wgV0lOQVBJIAorRHJhd0VkZ2UoSERDIGhkYywgTFBSRUNUIHFyYywgVUlOVCBlZGdlLCBVSU5UIGZsYWdzKSB7CisJZnByaW50ZihzdGRuaW1wLCJEcmF3RWRnZSgleCwlcCwlZCwleCksIGVtcHR5IHN0dWIhXG4iLAorCQloZGMscXJjLGVkZ2UsZmxhZ3MKKwkpOworCXJldHVybiBUUlVFOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgRHJhd0ZyYW1lQ29udHJvbCAgKFVTRVIuNjU2KQorICovCitCT09MIFdJTkFQSSAKK0RyYXdGcmFtZUNvbnRyb2woSERDIGhkYywgTFBSRUNUIHFyYywgVUlOVCBlZGdlLCBVSU5UIGZsYWdzKSB7CisJZnByaW50ZihzdGRuaW1wLCJEcmF3RnJhbWVDb250cm9sKCV4LCVwLCVkLCV4KSwgZW1wdHkgc3R1YiFcbiIsCisJCWhkYyxxcmMsZWRnZSxmbGFncworCSk7CisJcmV0dXJuIFRSVUU7Cit9CmRpZmYgLS1naXQgYS93aW5kb3dzL2hvb2suYyBiL3dpbmRvd3MvaG9vay5jCmluZGV4IGRjMjU2ODUuLmQ2OGUwMzggMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvaG9vay5jCisrKyBiL3dpbmRvd3MvaG9vay5jCkBAIC0zMiw3ICszMiw3IEBACiBzdGF0aWMgSEFORExFIEhPT0tfR2V0TmV4dEhvb2soIEhBTkRMRSBob29rICkKIHsKICAgICBIT09LREFUQSAqZGF0YSA9IChIT09LREFUQSAqKVVTRVJfSEVBUF9MSU5fQUREUiggaG9vayApOwotICAgIGlmICghZGF0YSkgcmV0dXJuIDA7CisgICAgaWYgKCFkYXRhIHx8ICFob29rKSByZXR1cm4gMDsKICAgICBpZiAoZGF0YS0+bmV4dCkgcmV0dXJuIGRhdGEtPm5leHQ7CiAgICAgaWYgKCFkYXRhLT5vd25lclF1ZXVlKSByZXR1cm4gMDsgIC8qIEFscmVhZHkgc3lzdGVtIGhvb2sgKi8KICAgICAvKiBOb3cgc3RhcnQgZW51bWVyYXRpbmcgdGhlIHN5c3RlbSBob29rcyAqLwpAQCAtNDUsMTIgKzQ1LDEyIEBACiAgKgogICogR2V0IHRoZSBmaXJzdCBob29rIGZvciBhIGdpdmVuIHR5cGUuCiAgKi8KLXN0YXRpYyBIQU5ETEUgSE9PS19HZXRIb29rKCBzaG9ydCBpZCApCitzdGF0aWMgSEFORExFIEhPT0tfR2V0SG9vayggc2hvcnQgaWQgLCBIUVVFVUUgaFF1ZXVlICkKIHsKICAgICBNRVNTQUdFUVVFVUUgKnF1ZXVlOwogICAgIEhBTkRMRSBob29rID0gMDsKIAotICAgIGlmICgocXVldWUgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jayggR2V0VGFza1F1ZXVlKDApICkpICE9IE5VTEwpCisgICAgaWYgKChxdWV1ZSA9IChNRVNTQUdFUVVFVUUgKilHbG9iYWxMb2NrKCBHZXRUYXNrUXVldWUoaFF1ZXVlKSApKSAhPSBOVUxMKQogICAgICAgICBob29rID0gcXVldWUtPmhvb2tzW2lkIC0gV0hfRklSU1RfSE9PS107CiAgICAgaWYgKCFob29rKSBob29rID0gSE9PS19zeXN0ZW1Ib29rc1tpZCAtIFdIX0ZJUlNUX0hPT0tdOwogICAgIHJldHVybiBob29rOwpAQCAtMjA2LDEzICsyMDYsNzEgQEAKICAqLwogRFdPUkQgSE9PS19DYWxsSG9va3MoIHNob3J0IGlkLCBzaG9ydCBjb2RlLCBXUEFSQU0gd1BhcmFtLCBMUEFSQU0gbFBhcmFtICkKIHsKLSAgICBIQU5ETEUgaG9vayA9IEhPT0tfR2V0SG9vayggaWQgKTsKKyAgICBIQU5ETEUgaG9vayA9IEhPT0tfR2V0SG9vayggaWQgLCAwICk7CiAgICAgaWYgKCFob29rKSByZXR1cm4gMDsKICAgICByZXR1cm4gSE9PS19DYWxsSG9vayggaG9vaywgY29kZSwgd1BhcmFtLCBsUGFyYW0gKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICAgSE9PS19GcmVlTW9kdWxlSG9va3MKKyAqLwordm9pZCBIT09LX0ZyZWVNb2R1bGVIb29rcyggSE1PRFVMRSBoTW9kdWxlICkKK3sKKyAvKiByZW1vdmUgYWxsIHN5c3RlbSBob29rcyByZWdpc3RlcmVkIGJ5IHRoaXMgbW9kdWxlICovCisKKyAgSE9PS0RBVEEqICAgICBocHRyOworICBISE9PSyAgICAgICAgIGhvb2ssIG5leHQ7CisgIGludCAgICAgICAgICAgaWQ7CisKKyAgZm9yKCBpZCA9IFdIX0ZJUlNUX0hPT0s7IGlkIDw9IFdIX0xBU1RfSE9PSzsgaWQrKyApCisgICAgeworICAgICAgIGhvb2sgPSBIT09LX3N5c3RlbUhvb2tzW2lkIC0gV0hfRklSU1RfSE9PS107CisgICAgICAgd2hpbGUoIGhvb2sgKQorICAgICAgICAgIGlmKCAoaHB0ciA9IChIT09LREFUQSAqKVVTRVJfSEVBUF9MSU5fQUREUihob29rKSkgKQorCSAgICB7CisJICAgICAgbmV4dCA9IGhwdHItPm5leHQ7CisJICAgICAgaWYoIGhwdHItPm93bmVyTW9kdWxlID09IGhNb2R1bGUgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgIGhwdHItPmluSG9va1Byb2MgPSAwOworICAgICAgICAgICAgICAgICAgSE9PS19SZW1vdmVIb29rKGhvb2spOworICAgICAgICAgICAgICAgIH0KKwkgICAgICBob29rID0gbmV4dDsKKwkgICAgfQorCSAgZWxzZSBob29rID0gMDsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBIT09LX0ZyZWVRdWV1ZUhvb2tzCisgKi8KK3ZvaWQgSE9PS19GcmVlUXVldWVIb29rcyggSFFVRVVFIGhRdWV1ZSApCit7CisgIC8qIHJlbW92ZSBhbGwgaG9va3MgcmVnaXN0ZXJlZCBieSB0aGlzIHF1ZXVlICovCisKKyAgSE9PS0RBVEEqCWhwdHIgPSBOVUxMOworICBISE9PSyAJaG9vaywgbmV4dDsKKyAgaW50IAkJaWQ7CisKKyAgZm9yKCBpZCA9IFdIX0ZJUlNUX0hPT0s7IGlkIDw9IFdIX0xBU1RfSE9PSzsgaWQrKyApCisgICAgeworICAgICAgIGhvb2sgPSBIT09LX0dldEhvb2soIGlkLCBoUXVldWUgKTsKKyAgICAgICB3aGlsZSggaG9vayApCisJeworCSAgbmV4dCA9IEhPT0tfR2V0TmV4dEhvb2soaG9vayk7CisKKwkgIGhwdHIgPSAoSE9PS0RBVEEgKilVU0VSX0hFQVBfTElOX0FERFIoaG9vayk7CisJICBpZiggaHB0ciAmJiBocHRyLT5vd25lclF1ZXVlID09IGhRdWV1ZSApCisJICAgIHsKKwkgICAgICBocHRyLT5pbkhvb2tQcm9jID0gMDsKKwkgICAgICBIT09LX1JlbW92ZUhvb2soaG9vayk7CisJICAgIH0KKwkgIGhvb2sgPSBuZXh0OworCX0KKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFNldFdpbmRvd3NIb29rICAgKFVTRVIuMTIxKQogICovCiBGQVJQUk9DIFNldFdpbmRvd3NIb29rKCBzaG9ydCBpZCwgSE9PS1BST0MgcHJvYyApCkBAIC0yNDMsNyArMzAxLDcgQEAKICAqLwogQk9PTCBVbmhvb2tXaW5kb3dzSG9vayggc2hvcnQgaWQsIEhPT0tQUk9DIHByb2MgKQogewotICAgIEhBTkRMRSBob29rID0gSE9PS19HZXRIb29rKCBpZCApOworICAgIEhBTkRMRSBob29rID0gSE9PS19HZXRIb29rKCBpZCAsIDAgKTsKIAogICAgIGRwcmludGZfaG9vayggc3RkZGViLCAiVW5ob29rV2luZG93c0hvb2s6ICVkICUwOGx4XG4iLCBpZCwgKERXT1JEKXByb2MgKTsKIApkaWZmIC0tZ2l0IGEvd2luZG93cy9tZGkuYyBiL3dpbmRvd3MvbWRpLmMKaW5kZXggMWE1MzNmOC4uZWE3YTQ1MCAxMDA2NDQKLS0tIGEvd2luZG93cy9tZGkuYworKysgYi93aW5kb3dzL21kaS5jCkBAIC0xMiw2ICsxMiw4IEBACiAgKiAgICAgICAgU2V0V2luZG93UG9zKGNoaWxkSHduZCwuLi4pIGltcGxpY2l0bHkgY2FsbHMgaXQgaWYgU1dQX05PQUNUSVZBVEUKICAqICAgICAgICBpcyBub3QgdXNlZC4KICAqCisgKiAgICAgICAgQWxzbywgRXhjZWwgYW5kIFdpbldvcmQgZG8gX25vdF8gdXNlIE1ESSBzbyBpZiB5b3UncmUgdHJ5aW5nCisgKgkgIHRvIGZpeCB0aGVtIGxvb2sgZWxzZXdoZXJlLiAKICAqLwogCiAjaW5jbHVkZSA8c3RkbGliLmg+CmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IDc4OTQyYmMuLjEyMzdhOGUgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0xMjcsNyArMTI3LDcgQEAKIAlpZiAoZGJsX2NsaWNrICYmIChoaXR0ZXN0ID09IEhUQ0xJRU5UKSkKIAl7CiAJICAgIC8qIENoZWNrIHdoZXRoZXIgd2luZG93IHdhbnRzIHRoZSBkb3VibGUgY2xpY2sgbWVzc2FnZS4gKi8KLSAgICAgICAgICAgIGRibF9jbGljayA9IChXSU5fQ0xBU1NfU1RZTEUocFduZCkgJiBDU19EQkxDTEtTKSAhPSAwOworICAgICAgICAgICAgZGJsX2NsaWNrID0gKHBXbmQtPmNsYXNzLT53Yy5zdHlsZSAmIENTX0RCTENMS1MpICE9IDA7CiAJfQogCiAJaWYgKGRibF9jbGljaykgc3dpdGNoKG1zZy0+bWVzc2FnZSkKQEAgLTgxMiw2ICs4MTIsMTIgQEAKICAgICByZXR1cm4gR2xvYmFsQWRkQXRvbSggc3RyICk7CiB9CiAKK1dPUkQgUmVnaXN0ZXJXaW5kb3dNZXNzYWdlQSggTFBTVFIgc3RyICkKK3sKKyAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgIGxzdHJjcHluKCBidWZmZXIsIHN0ciwgc2l6ZW9mKGJ1ZmZlcikgKTsKKyAgICByZXR1cm4gUmVnaXN0ZXJXaW5kb3dNZXNzYWdlKE1BS0VfU0VHUFRSKGJ1ZmZlcikpOworfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBHZXRUaWNrQ291bnQgICAgKFVTRVIuMTMpIChLRVJORUwzMi4yOTkpCmRpZmYgLS1naXQgYS93aW5kb3dzL25vbmNsaWVudC5jIGIvd2luZG93cy9ub25jbGllbnQuYwppbmRleCBjOTRjYTljLi41N2JhODkyIDEwMDY0NAotLS0gYS93aW5kb3dzL25vbmNsaWVudC5jCisrKyBiL3dpbmRvd3Mvbm9uY2xpZW50LmMKQEAgLTYsNyArNiw2IEBACiAgKi8KIAogI2luY2x1ZGUgIndpbi5oIgotI2luY2x1ZGUgImNsYXNzLmgiCiAjaW5jbHVkZSAibWVzc2FnZS5oIgogI2luY2x1ZGUgInN5c21ldHJpY3MuaCIKICNpbmNsdWRlICJ1c2VyLmgiCkBAIC02NDQsMTEgKzY0MywxMCBAQAogICAgICAqLwogICAgIGlmIChJc0ljb25pYyhod25kKSkKICAgICB7Ci0gICAgICAgIEhJQ09OIGhJY29uID0gV0lOX0NMQVNTX0lORk8od25kUHRyKS5oSWNvbjsKLSAgICAgICAgaWYgKGhJY29uKSAgCisgICAgICAgIGlmICh3bmRQdHItPmNsYXNzLT53Yy5oSWNvbikKICAgICAgICAgewogICAgICAgICAgICAgU2VuZE1lc3NhZ2UoaHduZCwgV01fSUNPTkVSQVNFQktHTkQsIChXUEFSQU0paGRjLCAwKTsKLSAgICAgICAgICAgIERyYXdJY29uKGhkYywgMCwgMCwgaEljb24pOworICAgICAgICAgICAgRHJhd0ljb24oIGhkYywgMCwgMCwgd25kUHRyLT5jbGFzcy0+d2MuaEljb24gKTsKICAgICAgICAgfQogICAgICAgICBSZWxlYXNlREMoaHduZCwgaGRjKTsKICAgICAgICAgd25kUHRyLT5mbGFncyAmPSB+V0lOX0lOVEVSTkFMX1BBSU5UOwpAQCAtNzgzLDEyICs3ODEsMTAgQEAKICAgICBjYXNlIEhUQ0xJRU5UOgogCXsKIAkgICAgV05EICp3bmRQdHI7Ci0JICAgIENMQVNTICpjbGFzc1B0cjsKIAkgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSkpIGJyZWFrOwotCSAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKSkpIGJyZWFrOwotCSAgICBpZiAoY2xhc3NQdHItPndjLmhDdXJzb3IpCisJICAgIGlmICh3bmRQdHItPmNsYXNzLT53Yy5oQ3Vyc29yKQogCSAgICB7Ci0JCVNldEN1cnNvciggY2xhc3NQdHItPndjLmhDdXJzb3IgKTsKKwkJU2V0Q3Vyc29yKCB3bmRQdHItPmNsYXNzLT53Yy5oQ3Vyc29yICk7CiAJCXJldHVybiBUUlVFOwogCSAgICB9CiAJICAgIGVsc2UgcmV0dXJuIEZBTFNFOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9wYWludGluZy5jIGIvd2luZG93cy9wYWludGluZy5jCmluZGV4IDMxNTczZmYuLmQzZjc2OTQgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcGFpbnRpbmcuYworKysgYi93aW5kb3dzL3BhaW50aW5nLmMKQEAgLTMxNyw4ICszMTcsOCBAQAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAvKiBEb24ndCBzZW5kIFdNX0VSQVNFQktHTkQgdG8gaWNvbnMgKi8KICAgICAgICAgICAgICAgLyogKFdNX0lDT05FUkFTRUJLR05EIGlzIHNlbnQgZHVyaW5nIHByb2Nlc3Npbmcgb2YgV01fTkNQQUlOVCkgKi8KLSAgICAgICAgICAgICAgICBpZiAoISh3bmRQdHItPmR3U3R5bGUgJiBXU19NSU5JTUlaRSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIVdJTl9DTEFTU19JTkZPKHduZFB0cikuaEljb24pCisgICAgICAgICAgICAgICAgaWYgKCEod25kUHRyLT5kd1N0eWxlICYgV1NfTUlOSU1JWkUpIHx8CisgICAgICAgICAgICAgICAgICAgICF3bmRQdHItPmNsYXNzLT53Yy5oSWNvbikKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChTZW5kTWVzc2FnZSggaHduZCwgV01fRVJBU0VCS0dORCwgKFdQQVJBTSloZGMsIDAgKSkKICAgICAgICAgICAgICAgICAgICAgICAgIHduZFB0ci0+ZmxhZ3MgJj0gfldJTl9ORUVEU19FUkFTRUJLR05EOwpkaWZmIC0tZ2l0IGEvd2luZG93cy9xdWV1ZS5jIGIvd2luZG93cy9xdWV1ZS5jCmluZGV4IDA2MDY2NDUuLjA0ZDgwODEgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvcXVldWUuYworKysgYi93aW5kb3dzL3F1ZXVlLmMKQEAgLTkxLDYgKzkxLDggQEAKICAgICBNRVNTQUdFUVVFVUUgKiBtc2dRdWV1ZTsKICAgICBpbnQgcXVldWVTaXplOwogCisgICAgZHByaW50Zl9tc2coc3RkZGViLCJDcmVhdGluZyBtZXNzYWdlIHF1ZXVlLi4uXG4iKTsKKwogICAgIHF1ZXVlU2l6ZSA9IHNpemVvZihNRVNTQUdFUVVFVUUpICsgc2l6ZSAqIHNpemVvZihRTVNHKTsKICAgICBpZiAoIShoUXVldWUgPSBHbG9iYWxBbGxvYyggR01FTV9GSVhFRCB8IEdNRU1fWkVST0lOSVQsIHF1ZXVlU2l6ZSApKSkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0xMTMsNiArMTE1LDggQEAKICAgICBNRVNTQUdFUVVFVUUgKiBtc2dRdWV1ZSA9IChNRVNTQUdFUVVFVUUqKUdsb2JhbExvY2soaFF1ZXVlKTsKICAgICBIUVVFVUUgKnBQcmV2OwogCisgICAgZHByaW50Zl9tc2coc3RkZGViLCJEZWxldGluZyBtZXNzYWdlIHF1ZXVlICUwNHhcbiIsIGhRdWV1ZSk7CisKICAgICBpZiAoIWhRdWV1ZSB8fCAhbXNnUXVldWUpCiAgICAgewogCWRwcmludGZfbXNnKHN0ZGRlYiwiRGVsZXRlTXNnUXVldWU6IGludmFsaWQgYXJndW1lbnQuXG4iKTsKQEAgLTM5OSw2ICs0MDMsOCBAQAogICAgIEhRVUVVRSBoUXVldWUsIGhOZXdRdWV1ZTsKICAgICBNRVNTQUdFUVVFVUUgKnF1ZXVlUHRyOwogCisgICAgZHByaW50Zl9tc2coc3RkZGViLCJTZXRNZXNzYWdlUXVldWU6IHRhc2sgJTA0eCBzaXplICVpXG4iLCBHZXRDdXJyZW50VGFzaygpLCBzaXplKTsgCisKICAgICBpZiAoKHNpemUgPiBNQVhfUVVFVUVfU0laRSkgfHwgKHNpemUgPD0gMCkpIHJldHVybiBUUlVFOwogCiAgICAgaWYoICEoaE5ld1F1ZXVlID0gUVVFVUVfQ3JlYXRlTXNnUXVldWUoIHNpemUgKSkpIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggOWE0MWI1ZC4uY2UyYjcwYSAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC02Niw3ICs2Niw2IEBACiAgKi8KIHZvaWQgV0lOX0R1bXBXaW5kb3coIEhXTkQgaHduZCApCiB7Ci0gICAgQ0xBU1MgKmNsYXNzUHRyOwogICAgIFdORCAqcHRyOwogICAgIGNoYXIgY2xhc3NOYW1lWzgwXTsKICAgICBpbnQgaTsKQEAgLTgyLDEzICs4MSwxMyBAQAogCiAgICAgZnByaW50Ziggc3RkZXJyLCAiV2luZG93ICUwNHggKCVwKTpcbiIsIGh3bmQsIHB0ciApOwogICAgIGZwcmludGYoIHN0ZGVyciwKLSAgICAgICAgICAgICAibmV4dD0lcCAgY2hpbGQ9JXAgIHBhcmVudD0lcCAgb3duZXI9JXAgIGNsYXNzPSUwNHggJyVzJ1xuIgorICAgICAgICAgICAgICJuZXh0PSVwICBjaGlsZD0lcCAgcGFyZW50PSVwICBvd25lcj0lcCAgY2xhc3M9JXAgJyVzJ1xuIgogICAgICAgICAgICAgICJpbnN0PSUwNHggIHRhc2tRPSUwNHggIHVwZFJnbj0lMDR4ICBhY3RpdmU9JTA0eCBoZGNlPSUwNHggIGlkbWVudT0lMDR4XG4iCiAgICAgICAgICAgICAgInN0eWxlPSUwOGx4ICBleHN0eWxlPSUwOGx4ICB3bmRwcm9jPSUwOGx4ICB0ZXh0PSUwNHggJyVzJ1xuIgogICAgICAgICAgICAgICJjbGllbnQ9JWQsJWQtJWQsJWQgIHdpbmRvdz0lZCwlZC0lZCwlZCAgaWNvbnBvcz0lZCwlZCAgbWF4cG9zPSVkLCVkXG4iCiAgICAgICAgICAgICAgInN5c21lbnU9JTA0eCAgZmxhZ3M9JTA0eCAgcHJvcHM9JTA0eCAgdnNjcm9sbD0lMDR4ICBoc2Nyb2xsPSUwNHhcbiIsCiAgICAgICAgICAgICAgcHRyLT5uZXh0LCBwdHItPmNoaWxkLCBwdHItPnBhcmVudCwgcHRyLT5vd25lciwKLSAgICAgICAgICAgICBwdHItPmhDbGFzcywgY2xhc3NOYW1lLCBwdHItPmhJbnN0YW5jZSwgcHRyLT5obWVtVGFza1EsCisgICAgICAgICAgICAgcHRyLT5jbGFzcywgY2xhc3NOYW1lLCBwdHItPmhJbnN0YW5jZSwgcHRyLT5obWVtVGFza1EsCiAgICAgICAgICAgICAgcHRyLT5ocmduVXBkYXRlLCBwdHItPmh3bmRMYXN0QWN0aXZlLCBwdHItPmhkY2UsIHB0ci0+d0lEbWVudSwKICAgICAgICAgICAgICBwdHItPmR3U3R5bGUsIHB0ci0+ZHdFeFN0eWxlLCAoRFdPUkQpcHRyLT5scGZuV25kUHJvYywgcHRyLT5oVGV4dCwKICAgICAgICAgICAgICBwdHItPmhUZXh0ID8gKGNoYXIqKVVTRVJfSEVBUF9MSU5fQUREUihwdHItPmhUZXh0KSA6ICIiLApAQCAtOTgsMTEgKzk3LDEwIEBACiAgICAgICAgICAgICAgcHRyLT5wdEljb25Qb3MueSwgcHRyLT5wdE1heFBvcy54LCBwdHItPnB0TWF4UG9zLnksIHB0ci0+aFN5c01lbnUsCiAgICAgICAgICAgICAgcHRyLT5mbGFncywgcHRyLT5oUHJvcCwgcHRyLT5oVlNjcm9sbCwgcHRyLT5oSFNjcm9sbCApOwogCi0gICAgaWYgKChjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggcHRyLT5oQ2xhc3MgKSkgJiYKLSAgICAgICAgY2xhc3NQdHItPndjLmNiV25kRXh0cmEpCisgICAgaWYgKHB0ci0+Y2xhc3MtPndjLmNiV25kRXh0cmEpCiAgICAgewogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJleHRyYSBieXRlczoiICk7Ci0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBjbGFzc1B0ci0+d2MuY2JXbmRFeHRyYTsgaSsrKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgcHRyLT5jbGFzcy0+d2MuY2JXbmRFeHRyYTsgaSsrKQogICAgICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiICUwMngiLCAqKChCWVRFKilwdHItPndFeHRyYStpKSApOwogICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJcbiIgKTsKICAgICB9CkBAIC0xMTgsNyArMTE2LDYgQEAKIHZvaWQgV0lOX1dhbGtXaW5kb3dzKCBIV05EIGh3bmQsIGludCBpbmRlbnQgKQogewogICAgIFdORCAqcHRyOwotICAgIENMQVNTICpjbGFzc1B0cjsKICAgICBjaGFyIGNsYXNzTmFtZVs4MF07CiAKICAgICBwdHIgPSBod25kID8gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKSA6IHBXbmREZXNrdG9wOwpAQCAtMTM1LDkgKzEzMiw4IEBACiAgICAgd2hpbGUgKHB0cikKICAgICB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJSpzJTA0eCUqcyIsIGluZGVudCwgIiIsIHB0ci0+aHduZFNlbGYsIDEzLWluZGVudCwiIik7Ci0gICAgICAgIAotICAgICAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggcHRyLT5oQ2xhc3MgKSkpIHN0cmNweSggY2xhc3NOYW1lLCAiI05VTEwjIiApOwotICAgICAgICBlbHNlIEdsb2JhbEdldEF0b21OYW1lKCBjbGFzc1B0ci0+YXRvbU5hbWUsIGNsYXNzTmFtZSwgc2l6ZW9mKGNsYXNzTmFtZSkgKTsKKworICAgICAgICBHbG9iYWxHZXRBdG9tTmFtZSggcHRyLT5jbGFzcy0+YXRvbU5hbWUsIGNsYXNzTmFtZSwgc2l6ZW9mKGNsYXNzTmFtZSkpOwogICAgICAgICAKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiJTA4bHggJS02LjR4ICUtMTcuMTdzICUwOHggJTA0eDolMDR4XG4iLAogICAgICAgICAgICAgICAgICAoRFdPUkQpcHRyLCBwdHItPmhtZW1UYXNrUSwgY2xhc3NOYW1lLApAQCAtMzA3LDE0ICszMDMsMTMgQEAKIHN0YXRpYyB2b2lkIFdJTl9EZXN0cm95V2luZG93KCBIV05EIGh3bmQgKQogewogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGh3bmQgKTsKLSAgICBDTEFTUyAqY2xhc3NQdHIgPSBDTEFTU19GaW5kQ2xhc3NQdHIoIHduZFB0ci0+aENsYXNzICk7CiAKICNpZmRlZiBDT05GSUdfSVBDCiAgICAgaWYgKG1haW5fYmxvY2spCiAJRERFX0Rlc3Ryb3lXaW5kb3coaHduZCk7CiAjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KIAkKLSAgICBpZiAoIXduZFB0ciB8fCAhY2xhc3NQdHIpIHJldHVybjsKKyAgICBpZiAoIXduZFB0cikgcmV0dXJuOwogICAgIFdJTl9VbmxpbmtXaW5kb3coIGh3bmQgKTsgLyogUmVtb3ZlIHRoZSB3aW5kb3cgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KICAgICB3bmRQdHItPmR3TWFnaWMgPSAwOyAgLyogTWFyayBpdCBhcyBpbnZhbGlkICovCiAgICAgd25kUHRyLT5od25kU2VsZiA9IDA7CkBAIC0zMjksMjggKzMyNCw0NCBAQAogICAgIH0KICAgICBpZiAod25kUHRyLT5oU3lzTWVudSkgRGVzdHJveU1lbnUoIHduZFB0ci0+aFN5c01lbnUgKTsKICAgICBpZiAod25kUHRyLT53aW5kb3cpIFhEZXN0cm95V2luZG93KCBkaXNwbGF5LCB3bmRQdHItPndpbmRvdyApOwotICAgIGlmIChjbGFzc1B0ci0+d2Muc3R5bGUgJiBDU19PV05EQykgRENFX0ZyZWVEQ0UoIHduZFB0ci0+aGRjZSApOwotICAgIGNsYXNzUHRyLT5jV2luZG93cy0tOworICAgIGlmICh3bmRQdHItPmNsYXNzLT53Yy5zdHlsZSAmIENTX09XTkRDKSBEQ0VfRnJlZURDRSggd25kUHRyLT5oZGNlICk7CisgICAgd25kUHRyLT5jbGFzcy0+Y1dpbmRvd3MtLTsKICAgICBVU0VSX0hFQVBfRlJFRSggaHduZCApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoJICAgICBXSU5fRGVzdHJveVF1ZXVlV2luZG93cworICovCit2b2lkIFdJTl9EZXN0cm95UXVldWVXaW5kb3dzKCBXTkQqIHduZCwgSFFVRVVFIGhRdWV1ZSApCit7CisgICAgV05EKiBuZXh0OworCisgICAgd2hpbGUgKHduZCkKKyAgICB7CisgICAgICAgIG5leHQgPSB3bmQtPm5leHQ7CisgICAgICAgIGlmICh3bmQtPmhtZW1UYXNrUSA9PSBoUXVldWUpIERlc3Ryb3lXaW5kb3coIHduZC0+aHduZFNlbGYgKTsKKyAgICAgICAgZWxzZSBXSU5fRGVzdHJveVF1ZXVlV2luZG93cyggd25kLT5jaGlsZCwgaFF1ZXVlICk7CisgICAgICAgIHduZCA9IG5leHQ7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIFdJTl9DcmVhdGVEZXNrdG9wV2luZG93CiAgKgogICogQ3JlYXRlIHRoZSBkZXNrdG9wIHdpbmRvdy4KICAqLwogQk9PTCBXSU5fQ3JlYXRlRGVza3RvcFdpbmRvdyh2b2lkKQogewotICAgIEhDTEFTUyBoY2xhc3M7Ci0gICAgQ0xBU1MgKmNsYXNzUHRyOworICAgIENMQVNTICpjbGFzczsKICAgICBIREMgaGRjOwogICAgIEhXTkQgaHduZERlc2t0b3A7CiAKLSAgICBpZiAoIShoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIERFU0tUT1BfQ0xBU1NfQVRPTSwgMCwgJmNsYXNzUHRyICkpKQorICAgIGlmICghKGNsYXNzID0gQ0xBU1NfRmluZENsYXNzQnlOYW1lKCBERVNLVE9QX0NMQVNTX0FUT00sIDAgKSkpCiAJcmV0dXJuIEZBTFNFOwogCi0gICAgaHduZERlc2t0b3AgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihXTkQpK2NsYXNzUHRyLT53Yy5jYlduZEV4dHJhICk7CisgICAgaHduZERlc2t0b3AgPSBVU0VSX0hFQVBfQUxMT0MoIHNpemVvZihXTkQpK2NsYXNzLT53Yy5jYlduZEV4dHJhICk7CiAgICAgaWYgKCFod25kRGVza3RvcCkgcmV0dXJuIEZBTFNFOwogICAgIHBXbmREZXNrdG9wID0gKFdORCAqKSBVU0VSX0hFQVBfTElOX0FERFIoIGh3bmREZXNrdG9wICk7CiAKQEAgLTM1OCw5ICszNjksOSBAQAogICAgIHBXbmREZXNrdG9wLT5jaGlsZCAgICAgICAgICAgICA9IE5VTEw7CiAgICAgcFduZERlc2t0b3AtPnBhcmVudCAgICAgICAgICAgID0gTlVMTDsKICAgICBwV25kRGVza3RvcC0+b3duZXIgICAgICAgICAgICAgPSBOVUxMOworICAgIHBXbmREZXNrdG9wLT5jbGFzcyAgICAgICAgICAgICA9IGNsYXNzOwogICAgIHBXbmREZXNrdG9wLT5kd01hZ2ljICAgICAgICAgICA9IFdORF9NQUdJQzsKICAgICBwV25kRGVza3RvcC0+aHduZFNlbGYgICAgICAgICAgPSBod25kRGVza3RvcDsKLSAgICBwV25kRGVza3RvcC0+aENsYXNzICAgICAgICAgICAgPSBoY2xhc3M7CiAgICAgcFduZERlc2t0b3AtPmhJbnN0YW5jZSAgICAgICAgID0gMDsKICAgICBwV25kRGVza3RvcC0+cmVjdFdpbmRvdy5sZWZ0ICAgPSAwOwogICAgIHBXbmREZXNrdG9wLT5yZWN0V2luZG93LnRvcCAgICA9IDA7CkBAIC0zNzUsNyArMzg2LDcgQEAKICAgICBwV25kRGVza3RvcC0+aG1lbVRhc2tRICAgICAgICAgPSAwOyAvKiBEZXNrdG9wIGRvZXMgbm90IGJlbG9uZyB0byBhIHRhc2sgKi8KICAgICBwV25kRGVza3RvcC0+aHJnblVwZGF0ZSAgICAgICAgPSAwOwogICAgIHBXbmREZXNrdG9wLT5od25kTGFzdEFjdGl2ZSAgICA9IGh3bmREZXNrdG9wOwotICAgIHBXbmREZXNrdG9wLT5scGZuV25kUHJvYyAgICAgICA9IGNsYXNzUHRyLT53Yy5scGZuV25kUHJvYzsKKyAgICBwV25kRGVza3RvcC0+bHBmblduZFByb2MgICAgICAgPSBjbGFzcy0+d2MubHBmblduZFByb2M7CiAgICAgcFduZERlc2t0b3AtPmR3U3R5bGUgICAgICAgICAgID0gV1NfVklTSUJMRSB8IFdTX0NMSVBDSElMRFJFTiB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfQ0xJUFNJQkxJTkdTOwogICAgIHBXbmREZXNrdG9wLT5kd0V4U3R5bGUgICAgICAgICA9IDA7CkBAIC00MTgsNyArNDI5LDcgQEAKIAkJICAgICBEV09SRCBzdHlsZSwgSU5UIHgsIElOVCB5LCBJTlQgd2lkdGgsIElOVCBoZWlnaHQsCiAJCSAgICAgSFdORCBwYXJlbnQsIEhNRU5VIG1lbnUsIEhBTkRMRSBpbnN0YW5jZSwgU0VHUFRSIGRhdGEgKSAKIHsKLSAgICBIQU5ETEUgY2xhc3MsIGh3bmQ7CisgICAgSEFORExFIGh3bmQ7CiAgICAgQ0xBU1MgKmNsYXNzUHRyOwogICAgIFdORCAqd25kUHRyOwogICAgIFBPSU5UIG1heFNpemUsIG1heFBvcywgbWluVHJhY2ssIG1heFRyYWNrOwpAQCAtNDI3LDggKzQzOCw2IEBACiAgICAgWFNldFdpbmRvd0F0dHJpYnV0ZXMgd2luX2F0dHI7CiAgICAgQXRvbSBYQV9XTV9ERUxFVEVfV0lORE9XOwogCi0gICAgLyogRklYTUU6IHdpbmRvd05hbWUgYW5kIGNsYXNzTmFtZSBzaG91bGQgYmUgU0VHUFRScyAqLwotCiAgICAgZHByaW50Zl93aW4oIHN0ZGRlYiwgIkNyZWF0ZVdpbmRvd0V4OiAiICk7CiAgICAgaWYgKEhJV09SRCh3aW5kb3dOYW1lKSkKIAlkcHJpbnRmX3dpbiggc3RkZGViLCAiJyVzJyAiLCAoY2hhciAqKVBUUl9TRUdfVE9fTElOKHdpbmRvd05hbWUpICk7CkBAIC00NjgsOCArNDc3LDcgQEAKIAl9CiAgICAgfQogCi0gICAgaWYgKCEoY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIGNsYXNzTmFtZSwgR2V0RXhlUHRyKGluc3RhbmNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNsYXNzUHRyICkpKQorICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzQnlOYW1lKCBjbGFzc05hbWUsIEdldEV4ZVB0cihpbnN0YW5jZSkgKSkpCiAgICAgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwiQ3JlYXRlV2luZG93IEJBRCBDTEFTU05BTUUgIiApOwogICAgICAgICBpZiAoSElXT1JEKGNsYXNzTmFtZSkpIGZwcmludGYoIHN0ZGVyciwgIiclcydcbiIsIApAQCAtNTAwLDkgKzUwOCw5IEBACiAgICAgd25kUHRyLT5wYXJlbnQgICAgICAgICA9IChzdHlsZSAmIFdTX0NISUxEKSA/IFdJTl9GaW5kV25kUHRyKCBwYXJlbnQgKSA6IHBXbmREZXNrdG9wOwogICAgIHduZFB0ci0+b3duZXIgICAgICAgICAgPSAoc3R5bGUgJiBXU19DSElMRCkgPyBOVUxMIDogV0lOX0ZpbmRXbmRQdHIoV0lOX0dldFRvcFBhcmVudChwYXJlbnQpKTsKICAgICB3bmRQdHItPndpbmRvdyAgICAgICAgID0gMDsKKyAgICB3bmRQdHItPmNsYXNzICAgICAgICAgID0gY2xhc3NQdHI7CiAgICAgd25kUHRyLT5kd01hZ2ljICAgICAgICA9IFdORF9NQUdJQzsKICAgICB3bmRQdHItPmh3bmRTZWxmICAgICAgID0gaHduZDsKLSAgICB3bmRQdHItPmhDbGFzcyAgICAgICAgID0gY2xhc3M7CiAgICAgd25kUHRyLT5oSW5zdGFuY2UgICAgICA9IGluc3RhbmNlOwogICAgIHduZFB0ci0+cHRJY29uUG9zLnggICAgPSAtMTsKICAgICB3bmRQdHItPnB0SWNvblBvcy55ICAgID0gLTE7CkBAIC02NzksNyArNjg3LDYgQEAKIEJPT0wgRGVzdHJveVdpbmRvdyggSFdORCBod25kICkKIHsKICAgICBXTkQgKiB3bmRQdHI7Ci0gICAgQ0xBU1MgKiBjbGFzc1B0cjsKIAogICAgIGRwcmludGZfd2luKHN0ZGRlYiwgIkRlc3Ryb3lXaW5kb3coJTA0eClcbiIsIGh3bmQpOwogICAgIApAQCAtNjg3LDcgKzY5NCw2IEBACiAKICAgICBpZiAoaHduZCA9PSBwV25kRGVza3RvcC0+aHduZFNlbGYpIHJldHVybiBGQUxTRTsgLyogQ2FuJ3QgZGVzdHJveSBkZXNrdG9wKi8KICAgICBpZiAoISh3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApKSkgcmV0dXJuIEZBTFNFOwotICAgIGlmICghKGNsYXNzUHRyID0gQ0xBU1NfRmluZENsYXNzUHRyKCB3bmRQdHItPmhDbGFzcyApKSkgcmV0dXJuIEZBTFNFOwogCiAgICAgICAvKiBIaWRlIHRoZSB3aW5kb3cgKi8KIApAQCAtNzU0LDIyICs3NjAsMTkgQEAKICAqLwogSFdORCBGaW5kV2luZG93KCBTRUdQVFIgQ2xhc3NNYXRjaCwgTFBTVFIgVGl0bGVNYXRjaCApCiB7Ci0gICAgSENMQVNTIGhjbGFzczsKLSAgICBDTEFTUyAqY2xhc3NQdHI7CiAgICAgV05EICp3bmRQdHI7CisgICAgQ0xBU1MgKmNsYXNzID0gTlVMTDsKIAogICAgIGlmIChDbGFzc01hdGNoKQogICAgIHsKLQloY2xhc3MgPSBDTEFTU19GaW5kQ2xhc3NCeU5hbWUoIENsYXNzTWF0Y2gsIChISU5TVEFOQ0UpMHhmZmZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbGFzc1B0ciApOwotCWlmICghaGNsYXNzKSByZXR1cm4gMDsKKwlpZiAoIShjbGFzcyA9IENMQVNTX0ZpbmRDbGFzc0J5TmFtZSggQ2xhc3NNYXRjaCwgKEhJTlNUQU5DRSkweGZmZmYgKSkpCisgICAgICAgICAgICByZXR1cm4gMDsKICAgICB9Ci0gICAgZWxzZSBoY2xhc3MgPSAwOwogCiAgICAgd25kUHRyID0gcFduZERlc2t0b3AtPmNoaWxkOwogICAgIHdoaWxlICh3bmRQdHIpCiAgICAgewotCWlmICghaGNsYXNzIHx8ICh3bmRQdHItPmhDbGFzcyA9PSBoY2xhc3MpKQorCWlmICghY2xhc3MgfHwgKHduZFB0ci0+Y2xhc3MgPT0gY2xhc3MpKQogCXsKIAkgICAgICAvKiBGb3VuZCBtYXRjaGluZyBjbGFzcyAqLwogCSAgICBpZiAoIVRpdGxlTWF0Y2gpIHJldHVybiB3bmRQdHItPmh3bmRTZWxmOwpkaWZmIC0tZ2l0IGEvd2luZG93cy93aW5wb3MuYyBiL3dpbmRvd3Mvd2lucG9zLmMKaW5kZXggMDlhZDc2YS4uOWU3ZjA3MyAxMDA2NDQKLS0tIGEvd2luZG93cy93aW5wb3MuYworKysgYi93aW5kb3dzL3dpbnBvcy5jCkBAIC0xMDU2LDggKzEwNTYsNiBAQAogICovCiBzdGF0aWMgdm9pZCBXSU5QT1NfU2l6ZU1vdmVDbGVhbihXTkQqIFduZCwgSFJHTiBvbGRWaXNSZ24sIExQUkVDVCBscE9sZFduZFJlY3QsIExQUkVDVCBscE9sZENsaWVudFJlY3QsIEJPT0wgYk5vQ29weSApCiB7Ci0gLyogdmlzaWJsZSByZWdpb25zIGFyZSBpbiB3aW5kb3cgY29vcmRpbmF0ZXMgKi8KLQogIEhSR04gbmV3VmlzUmduICAgID0gRENFX0dldFZpc1JnbihXbmQtPmh3bmRTZWxmLCBEQ1hfV0lORE9XIHwgRENYX0NMSVBTSUJMSU5HUyApOwogIEhSR04gZGlydHlSZ24gICAgID0gQ3JlYXRlUmVjdFJnbigwLDAsMCwwKTsKICBpbnQgIG90aGVyLCBteTsKZGlmZiAtLWdpdCBhL3dpbmUubWFuIGIvd2luZS5tYW4KaW5kZXggYzA4ZjU2NC4uOGQ1ZjE3YyAxMDA2NDQKLS0tIGEvd2luZS5tYW4KKysrIGIvd2luZS5tYW4KQEAgLTEwNCw3ICsxMDQsNyBAQAogLkkgLWxhbmd1YWdlIHh4CiBTZXQgdGhlIGxhbmd1YWdlIHRvCiAuSSB4eAotKG9uZSBvZiBFbiwgRXMsIERlLCBObywgRnIsIEZpLCBEYSwgQ3osIEVvLCBJdCkKKyhvbmUgb2YgRW4sIEVzLCBEZSwgTm8sIEZyLCBGaSwgRGEsIEN6LCBFbywgSXQsIEtvKQogLlRQCiAuSSAtbWFuYWdlZAogQ3JlYXRlIGVhY2ggdG9wLWxldmVsIHdpbmRvdyBhcyBhIHByb3Blcmx5IG1hbmFnZWQgWCB3aW5kb3cK