ZGlmZiAtLWdpdCBhL0FOTk9VTkNFIGIvQU5OT1VOQ0UKaW5kZXggMTM3ODc4Zi4uODEyMDMwNCAxMDA2NDQKLS0tIGEvQU5OT1VOQ0UKKysrIGIvQU5OT1VOQ0UKQEAgLTEsMTQgKzEsMTUgQEAKLVRoaXMgaXMgcmVsZWFzZSA5NTA4MTcgb2YgV2luZSB0aGUgTVMgV2luZG93cyBlbXVsYXRvci4gIFRoaXMgaXMgc3RpbGwgYQorVGhpcyBpcyByZWxlYXNlIDk1MDkwMSBvZiBXaW5lIHRoZSBNUyBXaW5kb3dzIGVtdWxhdG9yLiAgVGhpcyBpcyBzdGlsbCBhCiBkZXZlbG9wZXIncyBvbmx5IHJlbGVhc2UuICBUaGVyZSBhcmUgbWFueSBidWdzIGFuZCBtYW55IHVuaW1wbGVtZW50ZWQgQVBJCiBmZWF0dXJlcy4gIE1vc3QgYXBwbGljYXRpb25zIHN0aWxsIGRvIG5vdCB3b3JrLgogCiBQYXRjaGVzIHNob3VsZCBiZSBzdWJtaXR0ZWQgdG8gIndpbmUtbmV3QGFtc2NvbnMuY29tIi4gIFBsZWFzZSBkb24ndCBmb3JnZXQKLXRvIGluY2x1ZGUgYSBDaGFuZ2VMb2cgZW50cnkuICBJJ2xsIG1ha2UgYSBuZXcgcmVsZWFzZSBldmVyeSBvdGhlciBTdW5kYXkuCit0byBpbmNsdWRlIGEgQ2hhbmdlTG9nIGVudHJ5LiAgSSdsbCBtYWtlIGEgbmV3IHJlbGVhc2UgZXZlcnkgb3RoZXIgd2Vlay4KIAotV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTUwODE3OiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKLQktIEJ1aWx0LWluIGRlYnVnZ2VyIGltcHJvdmVtZW50cy4KLQktIE11bHRpbWVkaWEgZml4ZXMuCi0JLSBJUEMgY2FuIGJlIGRpc2FibGVkIGF0IHJ1bi10aW1lLgorV0hBVCdTIE5FVyB3aXRoIFdpbmUtOTUwOTAxOiAoc2VlIENoYW5nZUxvZyBmb3IgZGV0YWlscykKKwktIEFjY2Vzc2VzIHRvIEJJT1Mgc2VnbWVudCAweDQwIGFyZSB0cmFwcGVkIGFuZCBlbXVsYXRlZC4KKwktIE11bHRpbWVkaWEgaW1wcm92ZW1lbnRzLgorCS0gSVBDIGNhbiBub3cgYmUgZGlzYWJsZWQgYXQgY29tcGlsZS10aW1lLgorCS0gRG9jdW1lbnRhdGlvbiBmb3IgdGhlIElQQyBjb2RlLgogCS0gTG90cyBvZiBidWcgZml4ZXMuCiAKIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gdGhlIGRpc3RyaWJ1dGlvbiBmb3IgaW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucy4KQEAgLTE3LDExICsxOCwxMSBAQAogdGhlIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGF0IHRoZSBmdHAgc2l0ZXMuICBUaGUgc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZQogZnJvbSB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKIAotICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvV2luZS05NTA4MTcudGFyLmd6Ci0gICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwODE3LnRhci5negotICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTUwODE3LnRhci5negotICAgIGZ0cC5mdW5ldC5maTovcHViL09TL0xpbnV4L0FMUEhBL1dpbmUvV2luZS05NTA4MTcudGFyLmd6Ci0gICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwODE3LnRhci5negorICAgIHN1bnNpdGUudW5jLmVkdTovcHViL0xpbnV4L0FMUEhBL3dpbmUvV2luZS05NTA5MDEudGFyLmd6CisgICAgdHN4LTExLm1pdC5lZHU6L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTAxLnRhci5negorICAgIGZ0cC5pbmZvbWFnaWMuY29tOi9wdWIvbWlycm9ycy9saW51eC93aW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTAxLnRhci5negorICAgIGZ0cC5mdW5ldC5maTovcHViL09TL0xpbnV4L0FMUEhBL1dpbmUvV2luZS05NTA5MDEudGFyLmd6CisgICAgYXJpcy5jb206L3B1Yi9saW51eC9BTFBIQS9XaW5lL2RldmVsb3BtZW50L1dpbmUtOTUwOTAxLnRhci5negogCiBJdCBzaG91bGQgYWxzbyBiZSBhdmFpbGFibGUgZnJvbSBhbnkgc2l0ZSB0aGF0IG1pcnJvcnMgdHN4LTExIG9yIHN1bnNpdGUuCiAKZGlmZiAtLWdpdCBhL0NoYW5nZUxvZyBiL0NoYW5nZUxvZwppbmRleCAyOWM4NDk3Li41YTY0MjI3IDEwMDY0NAotLS0gYS9DaGFuZ2VMb2cKKysrIGIvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTA4IEBACitUaHUgQXVnIDMxIDE3OjE5OjU3IDE5OTUgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQHN1bnNpdGUudW5jLmVkdT4KKworCSogW0NvbmZpZ3VyZV0KKwlBZGRlZCBjb21waWxlLXRpbWUgb3B0aW9uIGZvciBJUEMuCisKKwkqIFtjb25maWd1cmUuaW5dCisJQWRkZWQgY29tbWFuZC1saW5lIG9wdGlvbnMgZm9yIGxhbmd1YWdlLCBJUEMgYW5kIG1hbGxvYworCWRlYnVnZ2luZy4KKworCSogW2NvbnRyb2xzL21lbnUuY10KKwlXTV9NRU5VU0VMRUNUIHdhcyBzb21ldGltZXMgc2VudCB0byB0aGUgd3Jvbmcgd2luZG93LgorCisJKiBbZGVidWdnZXIvYnJlYWsuY10KKwlGb3IgdGhlICduZXh0JyBjb21tYW5kLCBvbmx5IHN0ZXAgb3ZlciBpbnN0cnVjdGlvbiB0aGF0IHJlcXVpcmUKKwlpdC4gVGhpcyBhbGxvd3MgJ25leHQnIHRvIGRvIHRoZSByaWdodCB0aGluZyB3aXRoIGptcCBhbmQgcmV0CisJaW5zdHJ1Y3Rpb25zLgorCisJKiBbaXBjLyouY10gW21lbW9yeS9hdG9tLmNdIFttZW1vcnkvZ2xvYmFsLmNdCisJSVBDIGNhbiBub3cgYmUgY29uZmlndXJlZCBvdXQgYXQgY29tcGlsZS10aW1lLgorCisJKiBbbG9hZGVyL3Rhc2suY10KKwlCdWcgZml4IGluIFRBU0tfUmVzY2hlZHVsZSgpIHRoYXQgY291bGQgY2F1c2UgYSB0YXNrIHRvIGJlIGRlbGV0ZWQKKwl0d2ljZS4KKworCSogW21pc2NlbXUvZG9zbWVtLmNdIChOZXcgZmlsZSkKKwlQYXJ0aWFsIGVtdWxhdGlvbiBvZiB0aGUgQklPUyBkYXRhIHNlZ21lbnQuCisKKwkqIFttaXNjZW11L2luc3RyLmNdCisJVHJhcCBhdHRlbXB0cyB0byBhY2Nlc3Mgc2VsZWN0b3IgMHg0MCBhbmQgcmVtYXAgdGhlIGFjY2VzcyB0bworCXNlZ21lbnQgX18wMDQwSC4KKworCSogW3Rvb2xzL2J1aWxkLmNdCisJRml4ZWQgYnVnIGluIENhbGxUbzMyX0xhcmdlU3RhY2soKSB0aGF0IGNhdXNlZCBwcm9ibGVtcyB3aGVuCisJY29tcGlsaW5nIFdpbmUgd2l0aCB0aGUgLWZvbWl0LWZyYW1lLXBvaW50ZXIgb3B0aW9uLgorCisJKiBbd2luZG93cy9tZXNzYWdlLmNdCisJRml4ZWQgYnVnIGluIGhhcmR3YXJlIGV2ZW50IGhhbmRsaW5nIHRoYXQgY291bGQgY2F1c2Ugc29tZSBldmVudHMKKwl0byBnZXQgaWdub3JlZC4KKworU2F0IEF1ZyAyNiAxMzoxMjo1OSBJU1QgMTk5NSBNaWNoYWVsIFZla3NsZXIgPG12ZWtzbGVyQHZuZXQuaWJtLmNvbT4KKworCSogW2lwYy9SRUFETUVdIFtpcGMvZGRlLnRleF0KKwlMYVRlWCBkb2N1bWVudGF0aW9uIGZvciB0aGUgaXBjIGFuZCBEREUgc3R1ZmYuCisKK1dlZCBBdWcgMjMgMjI6MDE6MjMgR01UIDE5OTUgTWljaGFlbCBWZWtzbGVyIDxtdmVrc2xlckB2bmV0LmlibS5jb20+CisKKwkqIFtpcGMvSW1ha2VmaWxlXSBbaXBjL3dpbmVfdGVzdF9zdHViLmNdCisJRml4ZWQgSVBDIHRlc3RpbmcuIE5vdyBpdCBjYW4gYmUgY29tcGlsZWQgd2l0aCAibWFrZSB0ZXN0cyIKKworV2VkIEF1ZyAyMyAyMTowNDoxNCAxOTk1ICBGb25zIEJvdG1hbiAgPGJvdG1hbkB3YWItdGlzLnJhYm9iYW5rLm5sPgorCisJKiBbaWYxNjMyL2tlcm5lbC5zcGVjXSBbaW5jbHVkZS93aW5kb3dzLmhdIFttaXNjL21haW4uY10KKwlBZGRlZCBHZXRXaW5EZWJ1Z0luZm8vU2V0V2luRGVidWdJbmZvIHN0dWIgZm9yIHBsYXllci5leGUKKworU3VuIEF1ZyAgMjAgMTM6NDk6NDIgMTk5NSAgTWFyY3VzIE1laXNzbmVyICA8bXNtZWlzc25AZmF1aTAxLmluZm9ybWF0aWsudW5pLWVybGFuZ2VuLmRlPgorCisJKiBbbWlzY2VtdS9pbnQyMS5jXQorCU1pc2MgZml4IHRvIGludDIxLGFoPTQwICh3cml0ZSkgdG8gbWF0Y2ggX2x3cml0ZSgpLgorCUFYPTB4NDQwQSAoY2hlY2sgaWYgaGFuZGxlIGlzIHJlbW90ZSkgYWRkZWQuCisKKwkqIFttdWx0aW1lZGlhL21tc3lzdGVtLmNdCisJTW92ZWQgbWNpU2VuZFN0cmluZyB0byBtY2lzdHJpbmcuYy4KKworCSogW211bHRpbWVkaWEvbWNpc3RyaW5nLmNdCisJTmV3IGZpbGUsIHN0cmluZyBpbnRlcmZhY2UgZm9yIE1DSSAobm90IGNvbXBsZXRlLCBub3QgdGhvcm91Z2hseQorCXRlc3RlZCkuCisKKwkqIFttdWx0aW1lZGlhL2F1ZGlvLmNdCisJSU9DVEwgcHJpbnRzIGVycm9yczsgb25lIHBhcmFub2lkIGNoZWNrIGRpc2FibGVkLgorCisJKiBbbWlzYy9maWxlLmNdCisJTWlzYyBvcGVyYXRvciBwcmVjZWRlbmNlIGZpeGVzLgorCisJKiBbaWYxNjMyL2dkaS5zcGVjXSBbb2JqZWN0cy9iaXRibHQuY10KKwlTdHViIGZvciBGYXN0V2luZG93RnJhbWUgKHBhcmFtZXRlcnMgbm90IGNvcnJlY3QpLgorCitTYXQgQXVnIDE5IDAxOjMxOjIzIDE5OTUgIEdyYWhhbSBNZW5oZW5uaXR0IDxnZm1Ad2VycGxlLm1pcmEubmV0LmF1PgorCisJKiBbbG9hZGVyL25lX2ltYWdlLmNdCisJUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgaXRlcmF0ZWQgc2VnbWVudHMuCisKK1NhdCBBdWcgMTkgMDA6NDM6MDQgMTk5NSAgQW5kcmV3IFRheWxvciAgKGFuZHJld0ByaXNjYW4uY29tKQorCisJKiBbd2luZG93cy9tYXBwaW5nLmNdCisJSW4gZnVuY3Rpb24gTUFQUElOR19GaXhJc290cm9waWMoKSwgVnBvcnRFeHRbWFldIGlzIG11bHRpcGxpZWQgYnkKKyAJdGhlIGFic29sdXRlIHZhbHVlIG9mICh5ZGltIC8geGRpbSkgb3IgKHhkaW0gLyB5ZGltKS4KKworVGh1IEF1ZyAxNSAyMzowMDoxNiAgR3JlZ29yeSBUcnViZXRza295ICA8Z3Jpc2hhQG1pcmEuY29tPgorCisJKiBbb2JqZWN0cy9vZW1iaXRtYXAuY10KKwlBZGRlZCBzb21lIGluY2x1ZGVzIGZvciBXaW5kb3dzIDk1LgorCisJKiBbaW5jbHVkZS9zeXNtZXRyaWNzLmhdCisJQWRkZWQgc29tZSBzeXNtZXRyaWNzIGZvciBXaW5kb3dzIDk1LgorCisJKiBbaW5jbHVkZS9iaXRtYXBzLyo5NV0KKwlOZXcgZmlsZXM6IG9ibV9jbG9zZV85NSwgb2JtX2Nsb3NlZF85NSwgb2JtX3JlZHVjZV85NSwgb2JtX3JlZHVjZWRfOTUKKwlvYm1fem9vbV85NSwgb2JtX3pvb21kXzk1IC0gdGhlc2UgYXJlIHNvbWUgcGl4bWFwcyBmb3IgV2luZG93cyA5NS4KKworVGh1IEF1ZyAxMCAxMjowMDowMCAxOTk1ICBKYW4gV2lsbGFtb3dpdXMgIChqYW5AamFuaGguc2huZXQub3JnKQorCisJKiBbbWlzYy9zaGVsbC5jXSBbcmMvc3lzcmVzKi5yY10KKwlUaGUgY2FwdGlvbiBvZiB0aGUgU2hlbGxBYm91dCBkaWFsb2cgYm94IGlzIGxhbmd1YWdlIHNwZWNpZmljIGFuZAorIAlzaG91bGQgYmUgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2VzLgorCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBUaHUgQXVnIDE3IDE5OjMwOjE0IDE5OTUgIEFsZXhhbmRyZSBKdWxsaWFyZCAgPGp1bGxpYXJkQHN1bnNpdGUudW5jLmVkdT4KIApkaWZmIC0tZ2l0IGEvQ29uZmlndXJlIGIvQ29uZmlndXJlCmluZGV4IDlhOTQzNWEuLjdlN2Y0YTAgMTAwNjQ0Ci0tLSBhL0NvbmZpZ3VyZQorKysgYi9Db25maWd1cmUKQEAgLTQ5LDYgKzQ5LDEyIEBACiBkb25lCiBBTExERUZJTkVTPSIkQUxMREVGSU5FUyAtQUxBTkdcKCRMQU5HVUFHRVwpIgogCitwcm9tcHQgIkludGVyLXByb2Nlc3MgY29tbXVuaWNhdGlvbiIgQ09ORklHX0lQQyBOCitpZiBbIENPTkZJR19JUEMgPSAnWScgLW8gJENPTkZJR19JUEMgPSAneScgXQordGhlbgorICAgICAgIEFMTERFRklORVM9IiRBTExERUZJTkVTIC1EQ09ORklHX0lQQyIKK2ZpCisKIHByb21wdCAiTWFsbG9jIGRlYnVnZ2luZyIgTUFMTE9DX0RFQlVHR0lORyBOCiBpZiBbIE1BTExPQ19ERUJVR0dJTkcgPSAnWScgLW8gJE1BTExPQ19ERUJVR0dJTkcgPSAneScgXQogdGhlbgpkaWZmIC0tZ2l0IGEvSW1ha2VmaWxlIGIvSW1ha2VmaWxlCmluZGV4IDU0ODg5NDUuLjQ3ZmZhYzYgMTAwNjQ0Ci0tLSBhL0ltYWtlZmlsZQorKysgYi9JbWFrZWZpbGUKQEAgLTMsNyArMyw2IEBACiAKICNpZiBkZWZpbmVkKGkzODZGcmVlQnNkKSB8fCBkZWZpbmVkKEZyZWVCU0RBcmNoaXRlY3R1cmUpCiBNQUtFID0gZ21ha2UKLUNDID0gZ2NjIC1EX19GcmVlQlNEX18KICNlbmRpZgogCiBERUZJTkVTID0gQXV0b0RlZmluZXMgLURVU0VfUkVBRExJTkUKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmluIGIvTWFrZWZpbGUuaW4KaW5kZXggNTljZDZjYi4uZmQ3MTE5MiAxMDA2NDQKLS0tIGEvTWFrZWZpbGUuaW4KKysrIGIvTWFrZWZpbGUuaW4KQEAgLTEyLDYgKzEyLDcgQEAKIAogQ0MgCT0gQENDQAogQ0ZMQUdTIAk9IEBDRkxBR1NACitERUZTICAgID0gQERFRlNACiBYSU5DTCAJPSBAeF9pbmNsdWRlc0AKIFRPUFNSQyAgPSBAdG9wX3NyY2RpckAKIERJVklOQ0wgPSAtSSQoVE9QU1JDKS9pbmNsdWRlCkBAIC0yMiw3ICsyMyw3IEBACiBMRAk9IEBMREAKIExBTkcJPSBATEFOR0AKIExEQ09NQklORUZMQUdTID0gQExEQ09NQklORUZMQUdTQAotIAorQFNFVF9NQUtFQAogCiBDT01NT05TVUJESVJTID0gY29udHJvbHMgcmMgaXBjIGxvYWRlciBtaXNjIG11bHRpbWVkaWEgb2JqZWN0cyB3aW5kb3dzCiAKQEAgLTUzLDcgKzU0LDcgQEAKIAkkKENDKSAtbyB3aW5lICQoT0JKUykgJChMRE9QVElPTlMpICQoWERJUikgJChYUE1fTElCKSAkKFhMSUIpICQoTERMSUJTKQogCiAkKFNVQkRJUlMpOiBkdW1teQotCUBjZCAkQDsgJChNQUtFKSAnQ0M9JChDQyknICdDRkxBR1M9JChDRkxBR1MpJyAnTEQ9JChMRCknICdMRENPTUJJTkVGTEFHUz0kKExEQ09NQklORUZMQUdTKScgJ0xBTkc9JChMQU5HKScKKwlAY2QgJEA7ICQoTUFLRSkgJ0NDPSQoQ0MpJyAnQ0ZMQUdTPSQoQ0ZMQUdTKScgJ0RFRlM9JChERUZTKScgJ0xEPSQoTEQpJyAnTERDT01CSU5FRkxBR1M9JChMRENPTUJJTkVGTEFHUyknICdMQU5HPSQoTEFORyknCiAKIGRlcGVuZDoKIAlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGRlcGVuZCk7IGRvbmUKQEAgLTYzLDE0ICs2NCwxNCBAQAogCiBjbGVhbjoKIAlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGNsZWFuKTsgZG9uZQotCXJtIC1mICoubyBcIypcIyAqfiB3aW5lIHdpbmUuc3ltIFRBR1MKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgd2luZSB3aW5lLnN5bSBUQUdTCiAKIGRpc3RjbGVhbjoKIAlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGRpc3RjbGVhbik7IGRvbmUKIAllY2hvICIvKiBhdXRvY29uZi5oIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5LiAgUnVuIENvbmZpZ3VyZSAqLyIgPmF1dG9jb25mLmgKIAllY2hvICIjZXJyb3IgWW91IG11c3QgcnVuIENvbmZpZ3VyZSBiZWZvcmUgeW91IGNhbiBidWlsZCB0aGUgbWFrZWZpbGVzLiIgPj5hdXRvY29uZi5oCi0Jcm0gLWYgKi5vIFwjKlwjICp+IHdpbmUgd2luZS5zeW0KLQlybSAtZiBzdGFtcC1jb25maWcgY29uZmlnLiogaW5jbHVkZS9jb25maWcuaCBNYWtlZmlsZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB3aW5lIHdpbmUuc3ltIFRBR1MKKwlybSAtZiBjb25maWcuKiBpbmNsdWRlL2NvbmZpZy5oIE1ha2VmaWxlCiAKIGNvdW50cnljbGVhbjoKIAlmb3IgaSBpbiAkKFNVQkRJUlMpOyBkbyAoY2QgJCRpOyAkKE1BS0UpIGNvdW50cnljbGVhbik7IGRvbmUKZGlmZiAtLWdpdCBhL1JFTEVBU0UtTk9URVMgYi9SRUxFQVNFLU5PVEVTCmluZGV4IDg1MDI4YjEuLmVlOTI3YmUgMTAwNjQ0Ci0tLSBhL1JFTEVBU0UtTk9URVMKKysrIGIvUkVMRUFTRS1OT1RFUwpAQCAtMTIsMTYgKzEyLDE5IEBACiBzdXJlIHRvIGFuYWx5emUgdGhlIHByb2JsZW0gYmVmb3JlIHlvdSByZXBvcnQgaXQgdG8gdGhlIG5ld3Nncm91cC4KIAogMi4gV2hhdCBhcmUgdGhlc2UgcXVlc3Rpb25zIGluIENvbmZpZ3VyZT8KLUVtdWxhdG9yL0xpYnJhcnk6IFlvdSBuZWVkIGFuIGVtdWxhdG9yIHdoZW4geW91IHdhbnQgdG8gcnVuIE1TLVdpbgotYmluYXJpZXMuIFlvdSBuZWVkIGEgbGlicmFyeSB3aGVuIHlvdSB3YW50IHRvIGNvbXBpbGUgdGhlIHNvdXJjZSBjb2RlCi1vZiBhIFdpbmRvd3MgcHJvZ3JhbS4KLUxhbmd1YWdlOiBXaW5lIGNhbiBwcmVzZW50IHRoZSBzeXN0ZW0gbWVudSBpbiBtdWx0aXBsZSBsYW5ndWFnZXMuIFNlbGVjdAotb25lIG9mIEVuZ2xpc2gsIEdlcm1hbiwgb3IgTm9yd2VnaWFuIGhlcmUuCi1NYWxsb2MgZGVidWdnaW5nOiBXaGVuIGVuYWJsZWQsIHRoZSBtdHJhY2UgYW5kIG1jaGVjayBHTlUgbGliYyBmdW5jdGlvbnMKLWFyZSBjYWxsZWQuIFlvdSBtaWdodCB3YW50IHRvIHNldCB0aGUgTUFMTE9DX1RSQUNFIGVudmlyb25tZW50IHZhcmlhYmxlCi10byBhIHRyYWNlIGZpbGUgbmFtZS4gSWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgYW5vdGhlciB3YXkgb2YgbWFsbG9jIAotZGVidWdnaW5nLCBmZWVsIGZyZWUgdG8gYWRkIGl0LgotQ29uZmlnIGZpbGU6IFNldHMgdGhlIFdpbmUgZW52aXJvbm1lbnQuIFNlZSBSRUFETUUgZm9yIGRldGFpbHMuCistIEVtdWxhdG9yL0xpYnJhcnk6IFlvdSBuZWVkIGFuIGVtdWxhdG9yIHdoZW4geW91IHdhbnQgdG8gcnVuIE1TLVdpbgorICAgIGJpbmFyaWVzLiBZb3UgbmVlZCBhIGxpYnJhcnkgd2hlbiB5b3Ugd2FudCB0byBjb21waWxlIHRoZSBzb3VyY2UgY29kZQorICAgIG9mIGEgV2luZG93cyBwcm9ncmFtLgorLSBMYW5ndWFnZTogV2luZSBjYW4gcHJlc2VudCB0aGUgc3lzdGVtIG1lbnUgaW4gbXVsdGlwbGUgbGFuZ3VhZ2VzLiBTZWxlY3QKKyAgICBvbmUgb2YgRW5nbGlzaCwgR2VybWFuLCBvciBOb3J3ZWdpYW4gaGVyZS4KKy0gSW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uOiBBbGxvd3Mgc2V0dGluZyB1cCBhIERERSBjb252ZXJzYXRpb24KKyAgICBiZXR3ZWVuIGRpZmZlcmVudCBpbnN0YW5jZXMgb2YgV2luZS4gT25seSByZWFsbHkgdXNlZnVsIHdoZW4KKyAgICBidWlsZGluZyBXaW5lIGFzIGEgbGlicmFyeS4KKy0gTWFsbG9jIGRlYnVnZ2luZzogV2hlbiBlbmFibGVkLCB0aGUgbXRyYWNlIGFuZCBtY2hlY2sgR05VIGxpYmMgZnVuY3Rpb25zCisgICAgYXJlIGNhbGxlZC4gWW91IG1pZ2h0IHdhbnQgdG8gc2V0IHRoZSBNQUxMT0NfVFJBQ0UgZW52aXJvbm1lbnQgdmFyaWFibGUKKyAgICB0byBhIHRyYWNlIGZpbGUgbmFtZS4gSWYgeW91ciBzeXN0ZW0gc3VwcG9ydHMgYW5vdGhlciB3YXkgb2YgbWFsbG9jIAorICAgIGRlYnVnZ2luZywgZmVlbCBmcmVlIHRvIGFkZCBpdC4KKy0gQ29uZmlnIGZpbGU6IFNldHMgdGhlIFdpbmUgZW52aXJvbm1lbnQuIFNlZSBSRUFETUUgZm9yIGRldGFpbHMuCiAKIDMuIEJBUi5FWEUgdXNlZCB0byB3b3JrLCBidXQgZG9lcyBub3Qgd29yayBhbnltb3JlCiBMb29rIGF0IHRoZSBDaGFuZ2VMb2cgdG8gc2VlIHdoYXQgZmlsZXMgaGF2ZSBiZWVuIGNoYW5nZWQuIFRyeSB0byB1bmRvCmRpZmYgLS1naXQgYS9jb25maWd1cmUgYi9jb25maWd1cmUKaW5kZXggZjQ5NWE5Mi4uM2I4ZDdkYSAxMDA3NTUKLS0tIGEvY29uZmlndXJlCisrKyBiL2NvbmZpZ3VyZQpAQCAtMTMsNiArMTMsMTIgQEAKIGFjX2RlZmF1bHRfcHJlZml4PS91c3IvbG9jYWwKICMgQW55IGFkZGl0aW9ucyBmcm9tIGNvbmZpZ3VyZS5pbjoKIGFjX2hlbHA9IiRhY19oZWxwCisgIC0td2l0aC1sYW5ndWFnZT1MQU5HICAgIGNoYW5nZSB0aGUgZGVmYXVsdCBsYW5ndWFnZSAoTEFORz1Fbi9EZS9ObykiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtaXBjICAgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREUiCithY19oZWxwPSIkYWNfaGVscAorICAtLXdpdGgtbWFsbG9jLWRlYnVnICAgICBlbmFibGUgbWFsbG9jKCkgZGVidWdnaW5nIgorYWNfaGVscD0iJGFjX2hlbHAKICAgLS13aXRoLXggICAgICAgICAgICAgICAgdXNlIHRoZSBYIFdpbmRvdyBTeXN0ZW0iCiAKICMgSW5pdGlhbGl6ZSBzb21lIHZhcmlhYmxlcyBzZXQgYnkgb3B0aW9ucy4KQEAgLTQwMiwxMSArNDA4LDM4IEBACiAKIAkJCiAKLQogIyBXZSB3YW50IHRoZXNlIGJlZm9yZSB0aGUgY2hlY2tzLCBzbyB0aGUgY2hlY2tzIGNhbiBtb2RpZnkgdGhlaXIgdmFsdWVzLgogdGVzdCAteiAiJENGTEFHUyIgJiYgQ0ZMQUdTPSItZyAtTzIgLVdhbGwiIAogdGVzdCAteiAiJExERkxBR1MiICYmIExERkxBR1M9LWcgCiAKKyMgQ2hlY2sgd2hldGhlciAtLXdpdGgtbGFuZ3VhZ2Ugb3IgLS13aXRob3V0LWxhbmd1YWdlIHdhcyBnaXZlbi4KK3dpdGh2YWw9IiR3aXRoX2xhbmd1YWdlIgoraWYgdGVzdCAtbiAiJHdpdGh2YWwiOyB0aGVuCisgIExBTkc9Ii1BTEFOR1woJHdpdGh2YWxcKSIKK2Vsc2UKKyAgTEFORz0iLUFMQU5HXChFblwpIgorZmkKKworCisjIENoZWNrIHdoZXRoZXIgLS13aXRoLWlwYyBvciAtLXdpdGhvdXQtaXBjIHdhcyBnaXZlbi4KK3dpdGh2YWw9IiR3aXRoX2lwYyIKK2lmIHRlc3QgLW4gIiR3aXRodmFsIjsgdGhlbgorICBjYXQgPj4gY29uZmRlZnMuaCA8PFxFT0YKKyNkZWZpbmUgQ09ORklHX0lQQyAxCitFT0YKKworZmkKKworIyBDaGVjayB3aGV0aGVyIC0td2l0aC1tYWxsb2MtZGVidWcgb3IgLS13aXRob3V0LW1hbGxvYy1kZWJ1ZyB3YXMgZ2l2ZW4uCit3aXRodmFsPSIkd2l0aF9tYWxsb2NfZGVidWciCitpZiB0ZXN0IC1uICIkd2l0aHZhbCI7IHRoZW4KKyAgY2F0ID4+IGNvbmZkZWZzLmggPDxcRU9GCisjZGVmaW5lIE1BTExPQ19ERUJVR0dJTkcgMQorRU9GCisKK2ZpCisKKwogZWNobyAkYWNfbiAiY2hlY2tpbmcgd2hldGhlciAke01BS0UtbWFrZX0gc2V0cyBcJHtNQUtFfSIiLi4uICRhY19jIiAxPiY2CiBzZXQgZHVtbXkgJHtNQUtFLW1ha2V9OyBhY19tYWtlPSQyCiBpZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfcHJvZ19tYWtlXyR7YWNfbWFrZX1fc2V0JytzZXR9J2BcIiA9IHNldCI7IHRoZW4KQEAgLTUyMSw3ICs1NTQsNyBAQAogICAjIE9uIHRoZSBOZVhULCBjYyAtRSBydW5zIHRoZSBjb2RlIHRocm91Z2ggdGhlIGNvbXBpbGVyJ3MgcGFyc2VyLAogICAjIG5vdCBqdXN0IHRocm91Z2ggY3BwLgogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA1MjUgImNvbmZpZ3VyZSIKKyNsaW5lIDU1OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8YXNzZXJ0Lmg+CiBTeW50YXggRXJyb3IKQEAgLTUzNSw3ICs1NjgsNyBAQAogICBybSAtcmYgY29uZnRlc3QqCiAgIENQUD0iJHtDQy1jY30gLUUgLXRyYWRpdGlvbmFsLWNwcCIKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNTM5ICJjb25maWd1cmUiCisjbGluZSA1NzIgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPGFzc2VydC5oPgogU3ludGF4IEVycm9yCkBAIC02MjEsNyArNjU0LDcgQEAKIHRlc3QgLXogIiR4X2RpcmVjdF90ZXN0X2Z1bmN0aW9uIiAmJiB4X2RpcmVjdF90ZXN0X2Z1bmN0aW9uPVh0TWFsbG9jCiB0ZXN0IC16ICIkeF9kaXJlY3RfdGVzdF9pbmNsdWRlIiAmJiB4X2RpcmVjdF90ZXN0X2luY2x1ZGU9WDExL0ludHJpbnNpYy5oCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSA2MjUgImNvbmZpZ3VyZSIKKyNsaW5lIDY1OCAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8JHhfZGlyZWN0X3Rlc3RfaW5jbHVkZT4KIEVPRgpAQCAtNjg0LDcgKzcxNyw3IEBACiBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWwkeF9kaXJlY3RfdGVzdF9saWJyYXJ5ICRMSUJTIgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgNjg4ICJjb25maWd1cmUiCisjbGluZSA3MjEgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogCiBpbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KQEAgLTg0MCw3ICs4NzMsNyBAQAogICBhY19zYXZlX0xJQlM9IiRMSUJTIgogTElCUz0iLWwkYWNfbGliICAkTElCUyIKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDg0NCAiY29uZmlndXJlIgorI2xpbmUgODc3ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKIAogaW50IG1haW4oKSB7IHJldHVybiAwOyB9CkBAIC04OTEsNyArOTI0LDcgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgODk1ICJjb25maWd1cmUiCisjbGluZSA5MjggImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogLyogU3lzdGVtIGhlYWRlciB0byBkZWZpbmUgX19zdHViIG1hY3JvcyBhbmQgaG9wZWZ1bGx5IGZldyBwcm90b3R5cGVzLAogICAgIHdoaWNoIGNhbiBjb25mbGljdCB3aXRoIGNoYXIgJGFjX2Z1bmMoKTsgYmVsb3cuICAqLwpAQCAtOTQzLDcgKzk3Niw3IEBACiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDk0NyAiY29uZmlndXJlIgorI2xpbmUgOTgwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDwkYWNfaGRyPgogRU9GCkBAIC05NzEsMTIyICsxMDA0LDEyIEBACiBmaQogZG9uZQogCi1hY19oZWFkZXJfZGlyZW50PW5vCi1mb3IgYWNfaGRyIGluIGRpcmVudC5oIHN5cy9uZGlyLmggc3lzL2Rpci5oIG5kaXIuaAotZG8KLWFjX3NhZmU9YGVjaG8gIiRhY19oZHIiIHwgdHIgJy4vXDA1NScgJ19fXydgCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgJGFjX2hkciB0aGF0IGRlZmluZXMgRElSIiIuLi4gJGFjX2MiIDE+JjYKLWlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlJytzZXR9J2BcIiA9IHNldCI7IHRoZW4KLSAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKLWVsc2UKLSAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgOTg0ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDwkYWNfaGRyPgotaW50IG1haW4oKSB7IHJldHVybiAwOyB9Ci1pbnQgdCgpIHsKLURJUiAqZGlycCA9IDA7Ci07IHJldHVybiAwOyB9Ci1FT0YKLWlmIGV2YWwgJGFjX2NvbXBpbGU7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPXllcyIKLWVsc2UKLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9oZWFkZXJfZGlyZW50XyRhY19zYWZlPW5vIgotZmkKLXJtIC1mIGNvbmZ0ZXN0KgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfaGVhZGVyX2RpcmVudF8nJGFjX3NhZmVgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgICBhY190cl9oZHI9SEFWRV9gZWNobyAkYWNfaGRyIHwgdHIgJ1thLXpdLi9cMDU1JyAnW0EtWl1fX18nYAotICBjYXQgPj4gY29uZmRlZnMuaCA8PEVPRgotI2RlZmluZSAkYWNfdHJfaGRyIDEKLUVPRgotIGFjX2hlYWRlcl9kaXJlbnQ9JGFjX2hkcjsgYnJlYWsKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZG9uZQotIyBUd28gdmVyc2lvbnMgb2Ygb3BlbmRpciBldCBhbC4gYXJlIGluIC1sZGlyIGFuZCAtbHggb24gU0NPIFhlbml4LgotaWYgdGVzdCAkYWNfaGVhZGVyX2RpcmVudCA9IGRpcmVudC5oOyB0aGVuCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgLWxkaXIiIi4uLiAkYWNfYyIgMT4mNgotaWYgZXZhbCAidGVzdCBcImBlY2hvICckJyd7J2FjX2N2X2xpYl9kaXInK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWxkaXIgICRMSUJTIgotY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTAyMyAiY29uZmlndXJlIgotI2luY2x1ZGUgImNvbmZkZWZzLmgiCi0KLWludCBtYWluKCkgeyByZXR1cm4gMDsgfQotaW50IHQoKSB7Ci1vcGVuZGlyKCkKLTsgcmV0dXJuIDA7IH0KLUVPRgotaWYgZXZhbCAkYWNfbGluazsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl9kaXI9eWVzIgotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGV2YWwgImFjX2N2X2xpYl9kaXI9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXydkaXJgXCIgPSB5ZXMiOyB0aGVuCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLSAgTElCUz0iJExJQlMgLWxkaXIiCi1lbHNlCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotZmkKLQotZWxzZQotZWNobyAkYWNfbiAiY2hlY2tpbmcgZm9yIC1seCIiLi4uICRhY19jIiAxPiY2Ci1pZiBldmFsICJ0ZXN0IFwiYGVjaG8gJyQnJ3snYWNfY3ZfbGliX3gnK3NldH0nYFwiID0gc2V0IjsgdGhlbgotICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgotZWxzZQotICBhY19zYXZlX0xJQlM9IiRMSUJTIgotTElCUz0iLWx4ICAkTElCUyIKLWNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEwNTcgImNvbmZpZ3VyZSIKLSNpbmNsdWRlICJjb25mZGVmcy5oIgotCi1pbnQgbWFpbigpIHsgcmV0dXJuIDA7IH0KLWludCB0KCkgewotb3BlbmRpcigpCi07IHJldHVybiAwOyB9Ci1FT0YKLWlmIGV2YWwgJGFjX2xpbms7IHRoZW4KLSAgcm0gLXJmIGNvbmZ0ZXN0KgotICBldmFsICJhY19jdl9saWJfeD15ZXMiCi1lbHNlCi0gIHJtIC1yZiBjb25mdGVzdCoKLSAgZXZhbCAiYWNfY3ZfbGliX3g9bm8iCi1maQotcm0gLWYgY29uZnRlc3QqCi1MSUJTPSIkYWNfc2F2ZV9MSUJTIgotCi1maQotaWYgZXZhbCAidGVzdCBcImBlY2hvICckYWNfY3ZfbGliXyd4YFwiID0geWVzIjsgdGhlbgotICBlY2hvICIkYWNfdCIieWVzIiAxPiY2Ci0gIExJQlM9IiRMSUJTIC1seCIKLWVsc2UKLSAgZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotCi1maQotCiBlY2hvICRhY19uICJjaGVja2luZyB3aGV0aGVyIHN0YXQgZmlsZS1tb2RlIG1hY3JvcyBhcmUgYnJva2VuIiIuLi4gJGFjX2MiIDE+JjYKIGlmIGV2YWwgInRlc3QgXCJgZWNobyAnJCcneydhY19jdl9oZWFkZXJfc3RhdF9icm9rZW4nK3NldH0nYFwiID0gc2V0IjsgdGhlbgogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMDkwICJjb25maWd1cmUiCisjbGluZSAxMDEzICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgpAQCAtMTE0MCw3ICsxMDYzLDcgQEAKICAgZWNobyAkYWNfbiAiKGNhY2hlZCkgJGFjX2MiIDE+JjYKIGVsc2UKICAgY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTE0NCAiY29uZmlndXJlIgorI2xpbmUgMTA2NyAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAKIGludCBtYWluKCkgeyByZXR1cm4gMDsgfQpAQCAtMTIxNyw3ICsxMTQwLDcgQEAKICAgYWNfY3ZfY19jcm9zcz15ZXMKIGVsc2UKIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyMjEgImNvbmZpZ3VyZSIKKyNsaW5lIDExNDQgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogbWFpbigpe3JldHVybigwKTt9CiBFT0YKQEAgLTEyMzgsNyArMTE2MSw3IEBACiAgIGVjaG8gJGFjX24gIihjYWNoZWQpICRhY19jIiAxPiY2CiBlbHNlCiAgIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNDIgImNvbmZpZ3VyZSIKKyNsaW5lIDExNjUgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0ZGFyZy5oPgpAQCAtMTI2MCw3ICsxMTgzLDcgQEAKIGlmIHRlc3QgJGFjX2N2X2hlYWRlcl9zdGRjID0geWVzOyB0aGVuCiAgICMgU3VuT1MgNC54IHN0cmluZy5oIGRvZXMgbm90IGRlY2xhcmUgbWVtKiwgY29udHJhcnkgdG8gQU5TSS4KIGNhdCA+IGNvbmZ0ZXN0LiRhY19leHQgPDxFT0YKLSNsaW5lIDEyNjQgImNvbmZpZ3VyZSIKKyNsaW5lIDExODcgImNvbmZpZ3VyZSIKICNpbmNsdWRlICJjb25mZGVmcy5oIgogI2luY2x1ZGUgPHN0cmluZy5oPgogRU9GCkBAIC0xMjc4LDcgKzEyMDEsNyBAQAogaWYgdGVzdCAkYWNfY3ZfaGVhZGVyX3N0ZGMgPSB5ZXM7IHRoZW4KICAgIyBJU0MgMi4wLjIgc3RkbGliLmggZG9lcyBub3QgZGVjbGFyZSBmcmVlLCBjb250cmFyeSB0byBBTlNJLgogY2F0ID4gY29uZnRlc3QuJGFjX2V4dCA8PEVPRgotI2xpbmUgMTI4MiAiY29uZmlndXJlIgorI2xpbmUgMTIwNSAiY29uZmlndXJlIgogI2luY2x1ZGUgImNvbmZkZWZzLmgiCiAjaW5jbHVkZSA8c3RkbGliLmg+CiBFT0YKQEAgLTEyOTksNyArMTIyMiw3IEBACiAgIGFjX2N2X2hlYWRlcl9zdGRjPW5vCiBlbHNlCiBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzAzICJjb25maWd1cmUiCisjbGluZSAxMjI2ICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxjdHlwZS5oPgogI2RlZmluZSBJU0xPV0VSKGMpICgnYScgPD0gKGMpICYmIChjKSA8PSAneicpCkBAIC0xMzMzLDcgKzEyNTYsNyBAQAogICBlY2hvICRhY19uICIoY2FjaGVkKSAkYWNfYyIgMT4mNgogZWxzZQogICBjYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxMzM3ICJjb25maWd1cmUiCisjbGluZSAxMjYwICJjb25maWd1cmUiCiAjaW5jbHVkZSAiY29uZmRlZnMuaCIKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpZiBTVERDX0hFQURFUlMKQEAgLTEzNjUsODIgKzEyODgsNiBAQAogZWxzZQogVE9QX1NSQ0RJUj0iJHt0b3Bfc3JjZGlyfSIKIGZpCi1lY2hvICRhY19uICJjaGVja2luZyBmb3IgbGFuZ3VhZ2UgaW4gYXV0b2NvbmYuaCIiLi4uICRhY19jIiAxPiY2Ci1pZiB0ZXN0IC1mICR7VE9QX1NSQ0RJUn0vYXV0b2NvbmYuaDsgdGhlbgotTEFORz1gdHIgJyAnICdcbicgPCAke1RPUF9TUkNESVJ9L2F1dG9jb25mLmggfCBncmVwICdcLUFMQU5HJyB8IGhlYWQgLTFgCi1pZiB0ZXN0IC1uICIke0xBTkd9IjsgdGhlbgotZWNobyAiJGFjX3QiImBlY2hvICIke0xBTkd9IiB8IGN1dCAtYjktMTBgIiAxPiY2Ci1maQotZmkKLWlmIHRlc3QgLXogIiR7TEFOR30iOyB0aGVuCi1lY2hvICIkYWNfdCIibm8iIDE+JjYKLWZpCi0KLQotaWYgdGVzdCAteiAiJHtMQU5HfSI7IHRoZW4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsYW5ndWFnZSB0aHJvdWdoIGRvbWFpbm5hbWUiIi4uLiAkYWNfYyIgMT4mNgotRE5BTUU9YGRvbWFpbm5hbWVgCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLm5vImAgLW5lIDA7IHRoZW4KLUxBTkc9Ii1BTEFOR1woTm9cKSIKLWVjaG8gIiRhY190IiJObyIgMT4mNgotZmkKLWlmIHRlc3QgYGVjaG8gIiR7RE5BTUV9IiB8IGdyZXAgLWMgIlwuZGUiYCAtbmUgMDsgdGhlbgotTEFORz0iLUFMQU5HXChEZVwpIgotZWNobyAiJGFjX3QiIkRlIiAxPiY2Ci1maQotaWYgdGVzdCBgZWNobyAiJHtETkFNRX0iIHwgZ3JlcCAtYyAiXC51ayJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1lY2hvICIkYWNfdCIiRW4iIDE+JjYKLWZpCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLmNvbSJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1lY2hvICIkYWNfdCIiRW4iIDE+JjYKLWZpCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLmVkdSJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1lY2hvICIkYWNfdCIiRW4iIDE+JjYKLWZpCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLmdvdiJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1lY2hvICIkYWNfdCIiRW4iIDE+JjYKLWZpCi1pZiB0ZXN0IC16ICIke0xBTkd9IjsgdGhlbgotZWNobyAiJGFjX3QiIm5vIiAxPiY2Ci1maQotZmkKLQotaWYgdGVzdCAteiAiJHtMQU5HfSI7IHRoZW4KLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsaW51eCIiLi4uICRhY19jIiAxPiY2Ci1jYXQgPiBjb25mdGVzdC4kYWNfZXh0IDw8RU9GCi0jbGluZSAxNDE2ICJjb25maWd1cmUiCi0jaW5jbHVkZSAiY29uZmRlZnMuaCIKLSNpZmRlZiBsaW51eAotICAgeWVzCi0jZW5kaWYKLQotRU9GCi1pZiAoZXZhbCAiJGFjX2NwcCBjb25mdGVzdC4kYWNfZXh0IikgMj4mNSB8Ci0gIGVncmVwICJ5ZXMiID4vZGV2L251bGwgMj4mMTsgdGhlbgotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJ5ZXMiIDE+JjYKLWVjaG8gJGFjX24gImNoZWNraW5nIGZvciBsYW5ndWFnZSBieSBleGFtaW5pbmcga2V5bWFwIiIuLi4gJGFjX2MiIDE+JjYKLWlmIHRlc3QgYGR1bXBrZXlzIHwgZ3JlcCAia2V5Y29kZSAqMjYiIHwgdHIgJyAnICdcbicgfCBncmVwIC1jIHVkaWFlcmVzaXNgIC1uZSAwOyB0aGVuCi1lY2hvICIkYWNfdCIiRGUiIDE+JjYKLUxBTkc9Jy1BTEFOR1woRGVcKScKLWVsc2UKLWVjaG8gIiRhY190IiJubyIgMT4mNgotTEFORz0nLUFMQU5HXChFblwpJwotZmkKLQotZWxzZQotICBybSAtcmYgY29uZnRlc3QqCi0gIGVjaG8gIiRhY190IiJubyIgMT4mNgotTEFORz0nLUFMQU5HXChFblwpJwotCi1maQotcm0gLWYgY29uZnRlc3QqCi0KLWZpCiAKIGVjaG8gJGFjX24gImNoZWNraW5nIGZvciB3aW5lLmluaSBpbiBhdXRvY29uZi5oIiIuLi4gJGFjX2MiIDE+JjYKIGlmIHRlc3QgLWYgJHtUT1BfU1JDRElSfS9hdXRvY29uZi5oOyB0aGVuCkBAIC0xNTE4LDcgKzEzNjUsMTkgQEAKIAogdHJhcCAncm0gLWYgJENPTkZJR19TVEFUVVMgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQogCi1ERUZTPS1ESEFWRV9DT05GSUdfSAorIyBUcmFuc2Zvcm0gY29uZmRlZnMuaCBpbnRvIERFRlMuCisjIFByb3RlY3QgYWdhaW5zdCBzaGVsbCBleHBhbnNpb24gd2hpbGUgZXhlY3V0aW5nIE1ha2VmaWxlIHJ1bGVzLgorIyBQcm90ZWN0IGFnYWluc3QgTWFrZWZpbGUgbWFjcm8gZXhwYW5zaW9uLgorY2F0ID4gY29uZnRlc3QuZGVmcyA8PFxFT0YKK3MlI2RlZmluZSBcKFtBLVphLXpfXVtBLVphLXowLTlfXSpcKSBcKC4qXCklLURcMT1cMiVnCitzJVsgCWB+IyReJiooKXt9XFx8OyciPD4/XSVcXCYlZworcyVcWyVcXCYlZworcyVcXSVcXCYlZworcyVcJCUkJCVnCitFT0YKK0RFRlM9YHNlZCAtZiBjb25mdGVzdC5kZWZzIGNvbmZkZWZzLmggfCB0ciAnXDAxMicgJyAnYAorcm0gLWYgY29uZnRlc3QuZGVmcworCiAKICMgV2l0aG91dCB0aGUgIi4vIiwgc29tZSBzaGVsbHMgbG9vayBpbiBQQVRIIGZvciBjb25maWcuc3RhdHVzLgogOiAke0NPTkZJR19TVEFUVVM9Li9jb25maWcuc3RhdHVzfQpAQCAtMTU1NSw3ICsxNDE0LDcgQEAKIAogYWNfZ2l2ZW5fc3JjZGlyPSRzcmNkaXIKIAotdHJhcCAncm0gLWZyIGBlY2hvICJjb250cm9scy9NYWtlZmlsZSBpcGMvTWFrZWZpbGUgbG9hZGVyL01ha2VmaWxlIG1lbW9yeS9NYWtlZmlsZSBtaXNjL01ha2VmaWxlIG1pc2NlbXUvTWFrZWZpbGUgbXVsdGltZWRpYS9NYWtlZmlsZSBvYmplY3RzL01ha2VmaWxlIHdpbmRvd3MvTWFrZWZpbGUgcmMvTWFrZWZpbGUgZGVidWdnZXIvTWFrZWZpbGUgZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgaWYxNjMyL01ha2VmaWxlIE1ha2VmaWxlIGF1dG9jb25mLmggaW5jbHVkZS9jb25maWcuaCIgfCBzZWQgInMvOlteIF0qLy9nImAgY29uZnRlc3QqOyBleGl0IDEnIDEgMiAxNQordHJhcCAncm0gLWZyIGBlY2hvICJjb250cm9scy9NYWtlZmlsZSBpcGMvTWFrZWZpbGUgbG9hZGVyL01ha2VmaWxlIG1lbW9yeS9NYWtlZmlsZSBtaXNjL01ha2VmaWxlIG1pc2NlbXUvTWFrZWZpbGUgbXVsdGltZWRpYS9NYWtlZmlsZSBvYmplY3RzL01ha2VmaWxlIHdpbmRvd3MvTWFrZWZpbGUgcmMvTWFrZWZpbGUgZGVidWdnZXIvTWFrZWZpbGUgZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgaWYxNjMyL01ha2VmaWxlIE1ha2VmaWxlIGF1dG9jb25mLmgiIHwgc2VkICJzLzpbXiBdKi8vZyJgIGNvbmZ0ZXN0KjsgZXhpdCAxJyAxIDIgMTUKIAogIyBQcm90ZWN0IGFnYWluc3QgYmVpbmcgb24gdGhlIHJpZ2h0IHNpZGUgb2YgYSBzZWQgc3Vic3QgaW4gY29uZmlnLnN0YXR1cy4gCiBzZWQgJ3MvJUAvQEAvOyBzL0AlL0BALzsgcy8lZyQvQGcvOyAvQGckL3MvW1xcXFwmJV0vXFxcXCYvZzsgCkBAIC0xNTcxLDYgKzE0MzAsNyBAQAogcyVAZXhlY19wcmVmaXhAJSRleGVjX3ByZWZpeCVnCiBzJUBwcmVmaXhAJSRwcmVmaXglZwogcyVAcHJvZ3JhbV90cmFuc2Zvcm1fbmFtZUAlJHByb2dyYW1fdHJhbnNmb3JtX25hbWUlZworcyVATEFOR0AlJExBTkclZwogcyVAU0VUX01BS0VAJSRTRVRfTUFLRSVnCiBzJUBDQ0AlJENDJWcKIHMlQENQUEAlJENQUCVnCkBAIC0xNTgzLDcgKzE0NDMsNiBAQAogcyVATElCT0JKU0AlJExJQk9CSlMlZwogcyVATERAJSRMRCVnCiBzJUBMRENPTUJJTkVGTEFHU0AlJExEQ09NQklORUZMQUdTJWcKLXMlQExBTkdAJSRMQU5HJWcKIHMlQFdJTkVfSU5JX0dMT0JBTEAlJFdJTkVfSU5JX0dMT0JBTCVnCiAKIENFT0YKQEAgLTE2NDEsMTA0ICsxNTAwLDggQEAKIGZpOyBkb25lCiBybSAtZiBjb25mdGVzdC5zdWJzCiAKLSMgVGhlc2Ugc2VkIGNvbW1hbmRzIGFyZSBwYXNzZWQgdG8gc2VkIGFzICJBIE5BTUUgQiBOQU1FIEMgVkFMVUUgRCIsIHdoZXJlCi0jIE5BTUUgaXMgdGhlIGNwcCBtYWNybyBiZWluZyBkZWZpbmVkIGFuZCBWQUxVRSBpcyB0aGUgdmFsdWUgaXQgaXMgYmVpbmcgZ2l2ZW4uCi0jCi0jIGFjX2Qgc2V0cyB0aGUgdmFsdWUgaW4gIiNkZWZpbmUgTkFNRSBWQUxVRSIgbGluZXMuCi1hY19kQT0ncyVeXChbIAldKlwpI1woWyAJXSpkZWZpbmVbIAldWyAJXSpcKScKLWFjX2RCPSdcKFsgCV1bIAldKlwpW14gCV0qJVwxI1wyJwotYWNfZEM9J1wzJwotYWNfZEQ9JyVnJwotIyBhY191IHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX3VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfdUI9J1woWyAJXVwpJVwxI1wyZGVmaW5lXDMnCi1hY191Qz0nICcKLWFjX3VEPSdcNCVnJwotIyBhY19lIHR1cm5zICIjdW5kZWYgTkFNRSIgd2l0aG91dCB0cmFpbGluZyBibGFua3MgaW50byAiI2RlZmluZSBOQU1FIFZBTFVFIi4KLWFjX2VBPSdzJV5cKFsgCV0qXCkjXChbIAldKlwpdW5kZWZcKFsgCV1bIAldKlwpJwotYWNfZUI9JyQlXDEjXDJkZWZpbmVcMycKLWFjX2VDPScgJwotYWNfZUQ9JyVnJwotCi1DT05GSUdfSEVBREVSUz0ke0NPTkZJR19IRUFERVJTLSJpbmNsdWRlL2NvbmZpZy5oIn0KLWZvciBhY19maWxlIGluIC4uICRDT05GSUdfSEVBREVSUzsgZG8gaWYgdGVzdCAieCRhY19maWxlIiAhPSB4Li47IHRoZW4KLSAgIyBTdXBwb3J0ICJvdXRmaWxlWzppbmZpbGVdIiwgZGVmYXVsdGluZyBpbmZpbGU9Im91dGZpbGUuaW4iLgotICBjYXNlICIkYWNfZmlsZSIgaW4KLSAgKjoqKSBhY19maWxlX2luPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJS4qOiUlJ2AKLSAgICAgICBhY19maWxlPWBlY2hvICIkYWNfZmlsZSJ8c2VkICdzJTouKiUlJ2AgOzsKLSAgKikgYWNfZmlsZV9pbj0iJHthY19maWxlfS5pbiIgOzsKLSAgZXNhYwotCi0gIGVjaG8gY3JlYXRpbmcgJGFjX2ZpbGUKLQotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluIGNvbmZ0ZXN0Lm91dAotICBjcCAkYWNfZ2l2ZW5fc3JjZGlyLyRhY19maWxlX2luIGNvbmZ0ZXN0LmluCi0KLUVPRgotCi0jIFRyYW5zZm9ybSBjb25mZGVmcy5oIGludG8gYSBzZWQgc2NyaXB0IGNvbmZ0ZXN0LnZhbHMgdGhhdCBzdWJzdGl0dXRlcwotIyB0aGUgcHJvcGVyIHZhbHVlcyBpbnRvIGNvbmZpZy5oLmluIHRvIHByb2R1Y2UgY29uZmlnLmguICBBbmQgZmlyc3Q6Ci0jIFByb3RlY3QgYWdhaW5zdCBiZWluZyBvbiB0aGUgcmlnaHQgc2lkZSBvZiBhIHNlZCBzdWJzdCBpbiBjb25maWcuc3RhdHVzLiAKLSMgUHJvdGVjdCBhZ2FpbnN0IGJlaW5nIGluIGFuIHVucXVvdGVkIGhlcmUgZG9jdW1lbnQgaW4gY29uZmlnLnN0YXR1cy4KLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLWNhdCA+IGNvbmZ0ZXN0LmhkciA8PFxFT0YKLXMvW1xcJiVdL1xcJi9nCi1zJVtcXCRgXSVcXCYlZwotcyUjZGVmaW5lIFwoW0EtWmEtel9dW0EtWmEtejAtOV9dKlwpIFwoLipcKSUke2FjX2RBfVwxJHthY19kQn1cMSR7YWNfZEN9XDIke2FjX2REfSVncAotcyVhY19kJWFjX3UlZ3AKLXMlYWNfdSVhY19lJWdwCi1FT0YKLXNlZCAtbiAtZiBjb25mdGVzdC5oZHIgY29uZmRlZnMuaCA+IGNvbmZ0ZXN0LnZhbHMKLXJtIC1mIGNvbmZ0ZXN0LmhkcgotCi0jIFRoaXMgc2VkIGNvbW1hbmQgcmVwbGFjZXMgI3VuZGVmIHdpdGggY29tbWVudHMuICBUaGlzIGlzIG5lY2Vzc2FyeSwgZm9yCi0jIGV4YW1wbGUsIGluIHRoZSBjYXNlIG9mIF9QT1NJWF9TT1VSQ0UsIHdoaWNoIGlzIHByZWRlZmluZWQgYW5kIHJlcXVpcmVkCi0jIG9uIHNvbWUgc3lzdGVtcyB3aGVyZSBjb25maWd1cmUgd2lsbCBub3QgZGVjaWRlIHRvIGRlZmluZSBpdC4KLWNhdCA+PiBjb25mdGVzdC52YWxzIDw8XEVPRgotcyVeWyAJXSojWyAJXSp1bmRlZlsgCV1bIAldKlthLXpBLVpfXVthLXpBLVpfMC05XSolLyogJiAqLyUKLUVPRgotCi0jIEJyZWFrIHVwIGNvbmZ0ZXN0LnZhbHMgYmVjYXVzZSBzb21lIHNoZWxscyBoYXZlIGEgbGltaXQgb24KLSMgdGhlIHNpemUgb2YgaGVyZSBkb2N1bWVudHMsIGFuZCBvbGQgc2VkcyBoYXZlIHNtYWxsIGxpbWl0cyB0b28uCi0jIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIHB1dCBpbiBhIHNpbmdsZSBoZXJlIGRvY3VtZW50LgotYWNfbWF4X2hlcmVfbGluZXM9MTIKLQotcm0gLWYgY29uZnRlc3QudGFpbAotd2hpbGUgOgotZG8KLSAgYWNfbGluZXM9YGdyZXAgLWMgLiBjb25mdGVzdC52YWxzYAotICAjIGdyZXAgLWMgZ2l2ZXMgZW1wdHkgb3V0cHV0IGZvciBhbiBlbXB0eSBmaWxlIG9uIHNvbWUgQUlYIHN5c3RlbXMuCi0gIGlmIHRlc3QgLXogIiRhY19saW5lcyIgfHwgdGVzdCAiJGFjX2xpbmVzIiAtZXEgMDsgdGhlbiBicmVhazsgZmkKLSAgIyBXcml0ZSBhIGxpbWl0ZWQtc2l6ZSBoZXJlIGRvY3VtZW50IHRvIGNvbmZ0ZXN0LmZyYWcuCi0gIGVjaG8gJyAgY2F0ID4gY29uZnRlc3QuZnJhZyA8PENFT0YnID4+ICRDT05GSUdfU1RBVFVTCi0gIHNlZCAke2FjX21heF9oZXJlX2xpbmVzfXEgY29uZnRlc3QudmFscyA+PiAkQ09ORklHX1NUQVRVUwotICBlY2hvICdDRU9GCi0gIHNlZCAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmluID4gY29uZnRlc3Qub3V0Ci0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIG12IGNvbmZ0ZXN0Lm91dCBjb25mdGVzdC5pbgotJyA+PiAkQ09ORklHX1NUQVRVUwotICBzZWQgMSwke2FjX21heF9oZXJlX2xpbmVzfWQgY29uZnRlc3QudmFscyA+IGNvbmZ0ZXN0LnRhaWwKLSAgcm0gLWYgY29uZnRlc3QudmFscwotICBtdiBjb25mdGVzdC50YWlsIGNvbmZ0ZXN0LnZhbHMKLWRvbmUKLXJtIC1mIGNvbmZ0ZXN0LnZhbHMKLQotY2F0ID4+ICRDT05GSUdfU1RBVFVTIDw8XEVPRgotICBybSAtZiBjb25mdGVzdC5mcmFnIGNvbmZ0ZXN0LmgKLSAgZWNobyAiLyogJGFjX2ZpbGUuICBHZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSBjb25maWd1cmUuICAqLyIgPiBjb25mdGVzdC5oCi0gIGNhdCBjb25mdGVzdC5pbiA+PiBjb25mdGVzdC5oCi0gIHJtIC1mIGNvbmZ0ZXN0LmluCi0gIGlmIGNtcCAtcyAkYWNfZmlsZSBjb25mdGVzdC5oIDI+L2Rldi9udWxsOyB0aGVuCi0gICAgZWNobyAiJGFjX2ZpbGUgaXMgdW5jaGFuZ2VkIgotICAgIHJtIC1mIGNvbmZ0ZXN0LmgKLSAgZWxzZQotICAgIHJtIC1mICRhY19maWxlCi0gICAgbXYgY29uZnRlc3QuaCAkYWNfZmlsZQotICBmaQotZmk7IGRvbmUKIAogCi10b3VjaCBzdGFtcC1jb25maWcKIGV4aXQgMAogRU9GCiBjaG1vZCAreCAkQ09ORklHX1NUQVRVUwpkaWZmIC0tZ2l0IGEvY29uZmlndXJlLmluIGIvY29uZmlndXJlLmluCmluZGV4IGVkZWQ1MGEuLjcxYWFjNWMgMTAwNjQ0Ci0tLSBhL2NvbmZpZ3VyZS5pbgorKysgYi9jb25maWd1cmUuaW4KQEAgLTMsMTIgKzMsMjMgQEAKIGRubCAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0cmFAaXRwMS5waHlzaWsudHUtYmVybGluLmRlPgogQUNfUkVWSVNJT04oW2NvbmZpZ3VyZS5pbiAxLjAwXSkKIEFDX0lOSVQoY29udHJvbHMvZWRpdC5jKQkJCi1BQ19DT05GSUdfSEVBREVSKGluY2x1ZGUvY29uZmlnLmgpCiAKICMgV2Ugd2FudCB0aGVzZSBiZWZvcmUgdGhlIGNoZWNrcywgc28gdGhlIGNoZWNrcyBjYW4gbW9kaWZ5IHRoZWlyIHZhbHVlcy4KIHRlc3QgLXogIiRDRkxBR1MiICYmIENGTEFHUz0iLWcgLU8yIC1XYWxsIiBBQ19TVUJTVChDRkxBR1MpCiB0ZXN0IC16ICIkTERGTEFHUyIgJiYgTERGTEFHUz0tZyBBQ19TVUJTVChMREZMQUdTKQogCitBQ19BUkdfV0lUSChsYW5ndWFnZSwKK1sgIC0td2l0aC1sYW5ndWFnZT1MQU5HICAgIGNoYW5nZSB0aGUgZGVmYXVsdCBsYW5ndWFnZSAoTEFORz1Fbi9EZS9ObyldLAorW0xBTkc9Ii1BTEFOR1woJHdpdGh2YWxcKSJdLAorW0xBTkc9Ii1BTEFOR1woRW5cKSJdLCkKK0FDX1NVQlNUKExBTkcpCitBQ19BUkdfV0lUSChpcGMsCitbICAtLXdpdGgtaXBjICAgICAgICAgICAgICB1c2UgaW50ZXItcHJvY2VzcyBjb21tdW5pY2F0aW9uIGZvciBEREVdLAorW0FDX0RFRklORShDT05GSUdfSVBDKV0pCitBQ19BUkdfV0lUSChtYWxsb2MtZGVidWcsCitbICAtLXdpdGgtbWFsbG9jLWRlYnVnICAgICBlbmFibGUgbWFsbG9jKCkgZGVidWdnaW5nXSwKK1tBQ19ERUZJTkUoTUFMTE9DX0RFQlVHR0lORyldKQorCiBBQ19QUk9HX01BS0VfU0VUCiBBQ19QUk9HX0NDCiBBQ19QQVRIX1gKQEAgLTQxLDcwICs1Miw2IEBACiBlbHNlCiBUT1BfU1JDRElSPSIke3RvcF9zcmNkaXJ9IgogZmkKLUFDX01TR19DSEVDS0lORyhmb3IgbGFuZ3VhZ2UgaW4gYXV0b2NvbmYuaCkKLWlmIHRlc3QgLWYgJHtUT1BfU1JDRElSfS9hdXRvY29uZi5oOyB0aGVuCi1MQU5HPWB0ciAnICcgJ1xuJyA8ICR7VE9QX1NSQ0RJUn0vYXV0b2NvbmYuaCB8IGdyZXAgJ1wtQUxBTkcnIHwgaGVhZCAtMWAKLWlmIHRlc3QgLW4gIiR7TEFOR30iOyB0aGVuCi1BQ19NU0dfUkVTVUxUKGBlY2hvICIke0xBTkd9IiB8IGN1dCAtYjktMTBgKQotZmkKLWZpCi1pZiB0ZXN0IC16ICIke0xBTkd9IjsgdGhlbgotQUNfTVNHX1JFU1VMVChubykKLWZpCi1BQ19TVUJTVChMQU5HKQotCi1pZiB0ZXN0IC16ICIke0xBTkd9IjsgdGhlbgotQUNfTVNHX0NIRUNLSU5HKGZvciBsYW5ndWFnZSB0aHJvdWdoIGRvbWFpbm5hbWUpCi1ETkFNRT1gZG9tYWlubmFtZWAKLWlmIHRlc3QgYGVjaG8gIiR7RE5BTUV9IiB8IGdyZXAgLWMgIlwubm8iYCAtbmUgMDsgdGhlbgotTEFORz0iLUFMQU5HXChOb1wpIgotQUNfTVNHX1JFU1VMVChObykKLWZpCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLmRlImAgLW5lIDA7IHRoZW4KLUxBTkc9Ii1BTEFOR1woRGVcKSIKLUFDX01TR19SRVNVTFQoRGUpCi1maQotaWYgdGVzdCBgZWNobyAiJHtETkFNRX0iIHwgZ3JlcCAtYyAiXC51ayJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1BQ19NU0dfUkVTVUxUKEVuKQotZmkKLWlmIHRlc3QgYGVjaG8gIiR7RE5BTUV9IiB8IGdyZXAgLWMgIlwuY29tImAgLW5lIDA7IHRoZW4KLUxBTkc9Ii1BTEFOR1woRW5cKSIKLUFDX01TR19SRVNVTFQoRW4pCi1maQotaWYgdGVzdCBgZWNobyAiJHtETkFNRX0iIHwgZ3JlcCAtYyAiXC5lZHUiYCAtbmUgMDsgdGhlbgotTEFORz0iLUFMQU5HXChFblwpIgotQUNfTVNHX1JFU1VMVChFbikKLWZpCi1pZiB0ZXN0IGBlY2hvICIke0ROQU1FfSIgfCBncmVwIC1jICJcLmdvdiJgIC1uZSAwOyB0aGVuCi1MQU5HPSItQUxBTkdcKEVuXCkiCi1BQ19NU0dfUkVTVUxUKEVuKQotZmkKLWlmIHRlc3QgLXogIiR7TEFOR30iOyB0aGVuCi1BQ19NU0dfUkVTVUxUKG5vKQotZmkKLWZpCi0KLWlmIHRlc3QgLXogIiR7TEFOR30iOyB0aGVuCi1BQ19NU0dfQ0hFQ0tJTkcoZm9yIGxpbnV4KQotQUNfRUdSRVBfQ1BQKHllcywKLVsjaWZkZWYgbGludXgKLSAgIHllcwotI2VuZGlmCi1dLCBBQ19NU0dfUkVTVUxUKHllcykKLUFDX01TR19DSEVDS0lORyhmb3IgbGFuZ3VhZ2UgYnkgZXhhbWluaW5nIGtleW1hcCkKLWlmIHRlc3QgYGR1bXBrZXlzIHwgZ3JlcCAia2V5Y29kZSAqMjYiIHwgdHIgJyAnICdcbicgfCBncmVwIC1jIHVkaWFlcmVzaXNgIC1uZSAwOyB0aGVuCi1BQ19NU0dfUkVTVUxUKERlKQotTEFORz0nLUFMQU5HXChEZVwpJwotZWxzZQotQUNfTVNHX1JFU1VMVChubykKLUxBTkc9Jy1BTEFOR1woRW5cKScKLWZpCi0sCi1BQ19NU0dfUkVTVUxUKG5vKQotTEFORz0nLUFMQU5HXChFblwpJwotKQotZmkKIAogQUNfTVNHX0NIRUNLSU5HKGZvciB3aW5lLmluaSBpbiBhdXRvY29uZi5oKQogaWYgdGVzdCAtZiAke1RPUF9TUkNESVJ9L2F1dG9jb25mLmg7IHRoZW4KQEAgLTEyOSwxMSArNzYsNyBAQAogZmkKIEFDX1NVQlNUKFdJTkVfSU5JX0dMT0JBTCkKIAotCi10ZXN0IC16ICIkTERGTEFHUyIgJiYgTERGTEFHUz0tZyBBQ19TVUJTVChMREZMQUdTKQotCi0KLUFDX09VVFBVVChjb250cm9scy9NYWtlZmlsZSBpcGMvTWFrZWZpbGUgbG9hZGVyL01ha2VmaWxlIG1lbW9yeS9NYWtlZmlsZSBtaXNjL01ha2VmaWxlIG1pc2NlbXUvTWFrZWZpbGUgbXVsdGltZWRpYS9NYWtlZmlsZSBvYmplY3RzL01ha2VmaWxlIHdpbmRvd3MvTWFrZWZpbGUgcmMvTWFrZWZpbGUgZGVidWdnZXIvTWFrZWZpbGUgZGVidWdnZXIvcmVhZGxpbmUvTWFrZWZpbGUgdG9vbHMvTWFrZWZpbGUgaWYxNjMyL01ha2VmaWxlIE1ha2VmaWxlIGF1dG9jb25mLmgsIFt0b3VjaCBzdGFtcC1jb25maWddKQorQUNfT1VUUFVUKGNvbnRyb2xzL01ha2VmaWxlIGlwYy9NYWtlZmlsZSBsb2FkZXIvTWFrZWZpbGUgbWVtb3J5L01ha2VmaWxlIG1pc2MvTWFrZWZpbGUgbWlzY2VtdS9NYWtlZmlsZSBtdWx0aW1lZGlhL01ha2VmaWxlIG9iamVjdHMvTWFrZWZpbGUgd2luZG93cy9NYWtlZmlsZSByYy9NYWtlZmlsZSBkZWJ1Z2dlci9NYWtlZmlsZSBkZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZSB0b29scy9NYWtlZmlsZSBpZjE2MzIvTWFrZWZpbGUgTWFrZWZpbGUgYXV0b2NvbmYuaCkKIAogZWNobwogZWNobyAiQ29uZmlndXJlIGZpbmlzaGVkLiAgRG8gJ21ha2UgZGVwZW5kOyBtYWtlJyB0byBjb21waWxlIFdpbmUuIgpkaWZmIC0tZ2l0IGEvY29udHJvbHMvTWFrZWZpbGUuaW4gYi9jb250cm9scy9NYWtlZmlsZS5pbgppbmRleCA5YWEyMGM3Li4wMmNiYjNiIDEwMDY0NAotLS0gYS9jb250cm9scy9NYWtlZmlsZS5pbgorKysgYi9jb250cm9scy9NYWtlZmlsZS5pbgpAQCAtMjcsNyArMjcsNyBAQAogCW12IHRtcF9tYWtlIE1ha2VmaWxlCiAKIGNsZWFuOgotCXJtIC1mICoubyBcIypcIyAqfiB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQogCiBkaXN0Y2xlYW46IGNsZWFuCiAJcm0gLWYgTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL2J1dHRvbi5jIGIvY29udHJvbHMvYnV0dG9uLmMKaW5kZXggOWUyOWU1NC4uYjMzOTAwYSAxMDA2NDQKLS0tIGEvY29udHJvbHMvYnV0dG9uLmMKKysrIGIvY29udHJvbHMvYnV0dG9uLmMKQEAgLTI2MSw3ICsyNjEsNiBAQAogICAgIEhCUlVTSCBoT2xkQnJ1c2g7CiAgICAgY2hhciAqdGV4dDsKICAgICBEV09SRCBkd1RleHRTaXplOwotICAgIGludCBkZWx0YTsKICAgICBURVhUTUVUUklDIHRtOwogICAgIFdORCAqd25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoIGhCdXR0b24gKTsKICAgICBCVVRUT05JTkZPICppbmZvUHRyID0gKEJVVFRPTklORk8gKil3bmRQdHItPndFeHRyYTsKZGlmZiAtLWdpdCBhL2NvbnRyb2xzL21lbnUuYyBiL2NvbnRyb2xzL21lbnUuYwppbmRleCA4OGM0YzE1Li41OThkZTNhIDEwMDY0NAotLS0gYS9jb250cm9scy9tZW51LmMKKysrIGIvY29udHJvbHMvbWVudS5jCkBAIC02OTcsNyArNjk3LDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfU2VsZWN0SXRlbQogICovCi1zdGF0aWMgdm9pZCBNRU5VX1NlbGVjdEl0ZW0oIEhNRU5VIGhtZW51LCBXT1JEIHdJbmRleCApCitzdGF0aWMgdm9pZCBNRU5VX1NlbGVjdEl0ZW0oIEhXTkQgaHduZE93bmVyLCBITUVOVSBobWVudSwgV09SRCB3SW5kZXggKQogewogICAgIE1FTlVJVEVNICppdGVtczsKICAgICBMUFBPUFVQTUVOVSBscHBvcDsKQEAgLTczOSw4ICs3MzksOSBAQAogCSAgICBNRU5VX0RyYXdNZW51SXRlbSggbHBwb3AtPmhXbmQsIGhkYywgJml0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0sIGxwcG9wLT5IZWlnaHQsCiAJCQkgICAgICAgIShscHBvcC0+d0ZsYWdzICYgTUZfUE9QVVApICk7CiAJICAgIGRwcmludGZfbWVudShzdGRkZWIsIlNlbmRpbmcgV01fTUVOVVNFTEVDVCAlMDR4ICUwNHhcbiIsIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCxpdGVtc1tscHBvcC0+Rm9jdXNlZEl0ZW1dLml0ZW1fZmxhZ3MpOwotCSAgICBTZW5kTWVzc2FnZShscHBvcC0+aFduZCwgV01fTUVOVVNFTEVDVCwgaXRlbXNbbHBwb3AtPkZvY3VzZWRJdGVtXS5pdGVtX2lkLAotCQkgICAgICAgTUFLRUxPTkcoIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSkpOworCSAgICBTZW5kTWVzc2FnZSggaHduZE93bmVyLCBXTV9NRU5VU0VMRUNULAorICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9pZCwKKwkJICAgICAgICAgTUFLRUxPTkcoIGl0ZW1zW2xwcG9wLT5Gb2N1c2VkSXRlbV0uaXRlbV9mbGFncyB8IE1GX01PVVNFU0VMRUNULCBobWVudSkpOwogCX0KICAgICB9CiAgICAgUmVsZWFzZURDKCBscHBvcC0+aFduZCwgaGRjICk7CkBAIC03NTAsNyArNzUxLDcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0KICAqLwotc3RhdGljIHZvaWQgTUVOVV9TZWxlY3ROZXh0SXRlbSggSE1FTlUgaG1lbnUgKQorc3RhdGljIHZvaWQgTUVOVV9TZWxlY3ROZXh0SXRlbSggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51ICkKIHsKICAgICBpbnQgaTsKICAgICBNRU5VSVRFTSAqaXRlbXM7CkBAIC03NjYsMTMgKzc2NywxMyBAQAogCXsKIAkgICAgaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJICAgIHsKLQkJTUVOVV9TZWxlY3RJdGVtKCBobWVudSwgaSApOworCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKIAkJcmV0dXJuOwogCSAgICB9CiAJfQogCWlmIChNRU5VX0hhc1N5c01lbnUoIG1lbnUgKSkKIAl7Ci0JICAgIE1FTlVfU2VsZWN0SXRlbSggaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVEICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQpAQCAtNzgwLDE4ICs3ODEsMTkgQEAKICAgICB7CiAJaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGhtZW51LCBpICk7CisJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgaSApOwogCSAgICByZXR1cm47CiAJfQogICAgIH0KLSAgICBpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpIE1FTlVfU2VsZWN0SXRlbSggaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKyAgICBpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpCisgICAgICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgU1lTTUVOVV9TRUxFQ1RFRCApOwogfQogCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIE1FTlVfU2VsZWN0UHJldkl0ZW0KICAqLwotc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RQcmV2SXRlbSggSE1FTlUgaG1lbnUgKQorc3RhdGljIHZvaWQgTUVOVV9TZWxlY3RQcmV2SXRlbSggSFdORCBod25kT3duZXIsIEhNRU5VIGhtZW51ICkKIHsKICAgICBpbnQgaTsKICAgICBNRU5VSVRFTSAqaXRlbXM7CkBAIC04MDcsMTMgKzgwOSwxMyBAQAogCXsKIAkgICAgaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJICAgIHsKLQkJTUVOVV9TZWxlY3RJdGVtKCBobWVudSwgaSApOworCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGkgKTsKIAkJcmV0dXJuOwogCSAgICB9CiAJfQogCWlmIChNRU5VX0hhc1N5c01lbnUoIG1lbnUgKSkKIAl7Ci0JICAgIE1FTlVfU2VsZWN0SXRlbSggaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKwkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhtZW51LCBTWVNNRU5VX1NFTEVDVEVEICk7CiAJICAgIHJldHVybjsKIAl9CiAgICAgfQpAQCAtODIxLDExICs4MjMsMTIgQEAKICAgICB7CiAJaWYgKCEoaXRlbXNbaV0uaXRlbV9mbGFncyAmIE1GX1NFUEFSQVRPUikpCiAJewotCSAgICBNRU5VX1NlbGVjdEl0ZW0oIGhtZW51LCBpICk7CisJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgaSApOwogCSAgICByZXR1cm47CiAJfQogICAgIH0KLSAgICBpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpIE1FTlVfU2VsZWN0SXRlbSggaG1lbnUsIFNZU01FTlVfU0VMRUNURUQgKTsKKyAgICBpZiAoTUVOVV9IYXNTeXNNZW51KCBtZW51ICkpCisgICAgICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBobWVudSwgU1lTTUVOVV9TRUxFQ1RFRCApOwogfQogCiAKQEAgLTg1Niw3ICs4NTksNyBAQAogICoKICAqIEhpZGUgdGhlIHN1Yi1wb3B1cCBtZW51cyBvZiB0aGlzIG1lbnUuCiAgKi8KLXN0YXRpYyB2b2lkIE1FTlVfSGlkZVN1YlBvcHVwcyggSE1FTlUgaG1lbnUgKQorc3RhdGljIHZvaWQgTUVOVV9IaWRlU3ViUG9wdXBzKCBIV05EIGh3bmRPd25lciwgSE1FTlUgaG1lbnUgKQogewogICAgIE1FTlVJVEVNICppdGVtOwogICAgIFBPUFVQTUVOVSAqbWVudSwgKnN1Ym1lbnU7CkBAIC04NzcsOSArODgwLDkgQEAKIAloc3VibWVudSA9IGl0ZW0tPml0ZW1faWQ7CiAgICAgfQogICAgIHN1Ym1lbnUgPSAoUE9QVVBNRU5VICopIFVTRVJfSEVBUF9MSU5fQUREUiggaHN1Ym1lbnUgKTsKLSAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGhzdWJtZW51ICk7CisgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhzdWJtZW51ICk7CiAgICAgaWYgKHN1Ym1lbnUtPmhXbmQpIFNob3dXaW5kb3coIHN1Ym1lbnUtPmhXbmQsIFNXX0hJREUgKTsKLSAgICBNRU5VX1NlbGVjdEl0ZW0oIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNICk7CisgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kT3duZXIsIGhzdWJtZW51LCBOT19TRUxFQ1RFRF9JVEVNICk7CiB9CiAKIApAQCAtOTAyLDcgKzkwNSw3IEBACiAgICAgewogCU1FTlVfU2hvd1BvcHVwKGh3bmRPd25lciwgd25kUHRyLT5oU3lzTWVudSwgMCwgd25kUHRyLT5yZWN0Q2xpZW50LmxlZnQsCiAJCXduZFB0ci0+cmVjdENsaWVudC50b3AgLSBtZW51LT5IZWlnaHQgLSAyKlNZU01FVFJJQ1NfQ1lCT1JERVIpOwotCWlmIChzZWxlY3RGaXJzdCkgTUVOVV9TZWxlY3ROZXh0SXRlbSggd25kUHRyLT5oU3lzTWVudSApOworCWlmIChzZWxlY3RGaXJzdCkgTUVOVV9TZWxlY3ROZXh0SXRlbSggaHduZE93bmVyLCB3bmRQdHItPmhTeXNNZW51ICk7CiAJcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7CiAgICAgfQogICAgIGl0ZW0gPSAoKE1FTlVJVEVNICopVVNFUl9IRUFQX0xJTl9BRERSKG1lbnUtPmhJdGVtcykpICsgbWVudS0+Rm9jdXNlZEl0ZW07CkBAIC05MjEsNyArOTI0LDcgQEAKIAkJICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cubGVmdCArIGl0ZW0tPnJlY3QubGVmdCwKIAkJICAgICAgICB3bmRQdHItPnJlY3RXaW5kb3cudG9wICsgaXRlbS0+cmVjdC5ib3R0b20gKTsKICAgICB9Ci0gICAgaWYgKHNlbGVjdEZpcnN0KSBNRU5VX1NlbGVjdE5leHRJdGVtKCAoSE1FTlUpaXRlbS0+aXRlbV9pZCApOworICAgIGlmIChzZWxlY3RGaXJzdCkgTUVOVV9TZWxlY3ROZXh0SXRlbSggaHduZE93bmVyLCAoSE1FTlUpaXRlbS0+aXRlbV9pZCApOwogICAgIHJldHVybiAoSE1FTlUpaXRlbS0+aXRlbV9pZDsKIH0KIApAQCAtMTAyNyw3ICsxMDMwLDcgQEAKIAkgICAgewogCQlpZiAobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApCiAJCXsKLQkJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaG1lbnUgKTsKKwkJICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudSApOwogCQkgICAgKmhtZW51Q3VycmVudCA9IGhtZW51OwogCQl9CiAJCWVsc2UgcmV0dXJuIEZBTFNFOwpAQCAtMTAzNyw4ICsxMDQwLDggQEAKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlNRU5VX0hpZGVTdWJQb3B1cHMoIGhtZW51ICk7Ci0JTUVOVV9TZWxlY3RJdGVtKCBobWVudSwgaWQgKTsKKwlNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnUgKTsKKwlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkICk7CiAJKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTEwODEsOCArMTA4NCw4IEBACiAJaHN1Ym1lbnUgPSBpdGVtLT5pdGVtX2lkOwogICAgIH0KICAgICAgIC8qIFNlbGVjdCBmaXJzdCBpdGVtIG9mIHN1Yi1wb3B1cCAqLwotICAgIE1FTlVfU2VsZWN0SXRlbSggaHN1Ym1lbnUsIE5PX1NFTEVDVEVEX0lURU0gKTsKLSAgICBNRU5VX1NlbGVjdE5leHRJdGVtKCBoc3VibWVudSApOworICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCBoc3VibWVudSwgTk9fU0VMRUNURURfSVRFTSApOworICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmRPd25lciwgaHN1Ym1lbnUgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTExMywxMiArMTExNiwxMiBAQAogICAgIH0JCiAgICAgaWYgKGlkID09IE5PX1NFTEVDVEVEX0lURU0pCiAgICAgewotCU1FTlVfU2VsZWN0SXRlbSggKmhtZW51Q3VycmVudCwgTk9fU0VMRUNURURfSVRFTSApOworCU1FTlVfU2VsZWN0SXRlbSggaHduZE93bmVyLCAqaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNICk7CiAgICAgfQogICAgIGVsc2UgaWYgKG1lbnUtPkZvY3VzZWRJdGVtICE9IGlkKQogICAgIHsKLQlNRU5VX0hpZGVTdWJQb3B1cHMoIGhtZW51ICk7Ci0JTUVOVV9TZWxlY3RJdGVtKCBobWVudSwgaWQgKTsKKwlNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnUgKTsKKwlNRU5VX1NlbGVjdEl0ZW0oIGh3bmRPd25lciwgaG1lbnUsIGlkICk7CiAJKmhtZW51Q3VycmVudCA9IE1FTlVfU2hvd1N1YlBvcHVwKCBod25kT3duZXIsIGhtZW51LCBGQUxTRSApOwogICAgIH0KICAgICByZXR1cm4gVFJVRTsKQEAgLTExNDMsMTIgKzExNDYsMTIgQEAKIAlobWVudXRtcCA9IE1FTlVfR2V0U3ViUG9wdXAoIGhtZW51cHJldiApOwogCWlmIChobWVudXRtcCAhPSAqaG1lbnVDdXJyZW50KSBobWVudXByZXYgPSBobWVudXRtcDsKICAgICB9Ci0gICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBobWVudXByZXYgKTsKKyAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGh3bmRPd25lciwgaG1lbnVwcmV2ICk7CiAKICAgICBpZiAoKGhtZW51cHJldiA9PSBobWVudSkgJiYgIShtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkpCiAgICAgewogCSAgLyogU2VsZWN0IHByZXZpb3VzIGl0ZW0gb24gdGhlIG1lbnUgYmFyICovCi0JTUVOVV9TZWxlY3RQcmV2SXRlbSggaG1lbnUgKTsKKwlNRU5VX1NlbGVjdFByZXZJdGVtKCBod25kT3duZXIsIGhtZW51ICk7CiAJaWYgKCpobWVudUN1cnJlbnQgIT0gaG1lbnUpCiAJewogCSAgICAgIC8qIEEgcG9wdXAgbWVudSB3YXMgZGlzcGxheWVkIC0+IGRpc3BsYXkgdGhlIG5leHQgb25lICovCkBAIC0xMTg2LDggKzExODksOCBAQAogICAgICAgLyogSWYgb24gbWVudS1iYXIsIGdvIHRvIG5leHQgaXRlbSAqLwogICAgIGlmICghKG1lbnUtPndGbGFncyAmIE1GX1BPUFVQKSkKICAgICB7Ci0JTUVOVV9IaWRlU3ViUG9wdXBzKCBobWVudSApOwotCU1FTlVfU2VsZWN0TmV4dEl0ZW0oIGhtZW51ICk7CisJTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kT3duZXIsIGhtZW51ICk7CisJTUVOVV9TZWxlY3ROZXh0SXRlbSggaHduZE93bmVyLCBobWVudSApOwogCWlmICgqaG1lbnVDdXJyZW50ICE9IGhtZW51KQogCXsKIAkgICAgICAvKiBBIHBvcHVwIG1lbnUgd2FzIGRpc3BsYXllZCAtPiBkaXNwbGF5IHRoZSBuZXh0IG9uZSAqLwpAQCAtMTIwMyw3ICsxMjA2LDcgQEAKIAkgICAgaG1lbnV0bXAgPSBNRU5VX0dldFN1YlBvcHVwKCBobWVudXByZXYgKTsKIAkgICAgaWYgKGhtZW51dG1wICE9ICpobWVudUN1cnJlbnQpIGhtZW51cHJldiA9IGhtZW51dG1wOwogCX0KLQlNRU5VX0hpZGVTdWJQb3B1cHMoIGhtZW51cHJldiApOworCU1FTlVfSGlkZVN1YlBvcHVwcyggaHduZE93bmVyLCBobWVudXByZXYgKTsKIAkqaG1lbnVDdXJyZW50ID0gaG1lbnVwcmV2OwogICAgIH0KIH0KQEAgLTEyOTMsMTcgKzEyOTYsMTcgQEAKIAkJc3dpdGNoKG1zZy0+d1BhcmFtKQogCQl7CiAJCWNhc2UgVktfSE9NRToKLQkJICAgIE1FTlVfU2VsZWN0SXRlbSggaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNICk7Ci0JCSAgICBNRU5VX1NlbGVjdE5leHRJdGVtKCBobWVudUN1cnJlbnQgKTsKKwkJICAgIE1FTlVfU2VsZWN0SXRlbSggaHduZCwgaG1lbnVDdXJyZW50LCBOT19TRUxFQ1RFRF9JVEVNICk7CisJCSAgICBNRU5VX1NlbGVjdE5leHRJdGVtKCBod25kLCBobWVudUN1cnJlbnQgKTsKIAkJICAgIGJyZWFrOwogCiAJCWNhc2UgVktfRU5EOgotCQkgICAgTUVOVV9TZWxlY3RJdGVtKCBobWVudUN1cnJlbnQsIE5PX1NFTEVDVEVEX0lURU0gKTsKLQkJICAgIE1FTlVfU2VsZWN0UHJldkl0ZW0oIGhtZW51Q3VycmVudCApOworCQkgICAgTUVOVV9TZWxlY3RJdGVtKCBod25kLCBobWVudUN1cnJlbnQsIE5PX1NFTEVDVEVEX0lURU0gKTsKKwkJICAgIE1FTlVfU2VsZWN0UHJldkl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCApOwogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBWS19VUDoKLQkJICAgIE1FTlVfU2VsZWN0UHJldkl0ZW0oIGhtZW51Q3VycmVudCApOworCQkgICAgTUVOVV9TZWxlY3RQcmV2SXRlbSggaHduZCwgaG1lbnVDdXJyZW50ICk7CiAJCSAgICBicmVhazsKIAogCQljYXNlIFZLX0RPV046CkBAIC0xMzExLDcgKzEzMTQsNyBAQAogCQkgICAgaWYgKCEobWVudS0+d0ZsYWdzICYgTUZfUE9QVVApICYmIChobWVudUN1cnJlbnQgPT0gaG1lbnUpKQogCQkJaG1lbnVDdXJyZW50ID0gTUVOVV9TaG93U3ViUG9wdXAoIGh3bmQsIGhtZW51LCBUUlVFICk7CiAJCSAgICBlbHNlCi0JCQlNRU5VX1NlbGVjdE5leHRJdGVtKCBobWVudUN1cnJlbnQgKTsKKwkJCU1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCApOwogCQkgICAgYnJlYWs7CiAKIAkJY2FzZSBWS19MRUZUOgpAQCAtMTM1Nyw3ICsxMzYwLDcgQEAKIAkJICAgIGVsc2UgaWYgKHBvcyA9PSAoV09SRCktMSkgTWVzc2FnZUJlZXAoMCk7CiAJCSAgICBlbHNlCiAJCSAgICB7Ci0JCQlNRU5VX1NlbGVjdEl0ZW0oIGhtZW51Q3VycmVudCwgcG9zICk7CisJCQlNRU5VX1NlbGVjdEl0ZW0oIGh3bmQsIGhtZW51Q3VycmVudCwgcG9zICk7CiAJCQlmQ2xvc2VkID0gIU1FTlVfRXhlY0ZvY3VzZWRJdGVtKCBod25kLCBobWVudUN1cnJlbnQsCiAJCQkJCQkJICZobWVudUN1cnJlbnQgKTsKIAkJCQpAQCAtMTM3OCw5ICsxMzgxLDEwIEBACiAgICAgfQogICAgIFVTRVJfSEVBUF9GUkVFKCBoTXNnICk7CiAgICAgUmVsZWFzZUNhcHR1cmUoKTsKLSAgICBNRU5VX0hpZGVTdWJQb3B1cHMoIGhtZW51ICk7CisgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBod25kLCBobWVudSApOwogICAgIGlmIChtZW51LT53RmxhZ3MgJiBNRl9QT1BVUCkgU2hvd1dpbmRvdyggbWVudS0+aFduZCwgU1dfSElERSApOwotICAgIE1FTlVfU2VsZWN0SXRlbSggaG1lbnUsIE5PX1NFTEVDVEVEX0lURU0gKTsKKyAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmQsIGhtZW51LCBOT19TRUxFQ1RFRF9JVEVNICk7CisgICAgU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX01FTlVTRUxFQ1QsIDAsIE1BS0VMT05HKCAweGZmZmYsIDAgKSApOwogICAgIGZFbmRNZW51Q2FsbGVkID0gRkFMU0U7CiAgICAgcmV0dXJuIFRSVUU7CiB9CkBAIC0xNDEyLDggKzE0MTYsOCBAQAogICAgIGlmICghd25kUHRyLT53SURtZW51KSByZXR1cm47CiAgICAgU2VuZE1lc3NhZ2UoIGh3bmQsIFdNX0VOVEVSTUVOVUxPT1AsIDAsIDAgKTsKICAgICAgIC8qIFNlbGVjdCBmaXJzdCBzZWxlY3RhYmxlIGl0ZW0gKi8KLSAgICBNRU5VX1NlbGVjdEl0ZW0oIHduZFB0ci0+d0lEbWVudSwgTk9fU0VMRUNURURfSVRFTSApOwotICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIChITUVOVSl3bmRQdHItPndJRG1lbnUgKTsKKyAgICBNRU5VX1NlbGVjdEl0ZW0oIGh3bmQsIHduZFB0ci0+d0lEbWVudSwgTk9fU0VMRUNURURfSVRFTSApOworICAgIE1FTlVfU2VsZWN0TmV4dEl0ZW0oIGh3bmQsIChITUVOVSl3bmRQdHItPndJRG1lbnUgKTsKICAgICBNRU5VX1RyYWNrTWVudSggKEhNRU5VKXduZFB0ci0+d0lEbWVudSwgVFBNX0xFRlRBTElHTiB8IFRQTV9MRUZUQlVUVE9OLAogCQkgICAgMCwgMCwgaHduZCwgTlVMTCApOwogICAgIFNlbmRNZXNzYWdlKCBod25kLCBXTV9FWElUTUVOVUxPT1AsIDAsIDAgKTsKQEAgLTE1OTUsOCArMTU5OSw4IEBACiAgICAgaWYgKCEobHBpdGVtID0gTUVOVV9GaW5kSXRlbSggJmhNZW51LCAmd0l0ZW1JRCwgd0hpbGl0ZSApKSkgcmV0dXJuIEZBTFNFOwogICAgIGlmICghKG1lbnUgPSAoTFBQT1BVUE1FTlUpIFVTRVJfSEVBUF9MSU5fQUREUihoTWVudSkpKSByZXR1cm4gRkFMU0U7CiAgICAgaWYgKG1lbnUtPkZvY3VzZWRJdGVtID09IHdJdGVtSUQpIHJldHVybiBUUlVFOwotICAgIE1FTlVfSGlkZVN1YlBvcHVwcyggaE1lbnUgKTsKLSAgICBNRU5VX1NlbGVjdEl0ZW0oIGhNZW51LCB3SXRlbUlEICk7CisgICAgTUVOVV9IaWRlU3ViUG9wdXBzKCBoV25kLCBoTWVudSApOworICAgIE1FTlVfU2VsZWN0SXRlbSggaFduZCwgaE1lbnUsIHdJdGVtSUQgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KIApAQCAtMTk1NywxNiArMTk2MSwxMyBAQAogICovCiBITUVOVSBHZXRTeXN0ZW1NZW51KEhXTkQgaFduZCwgQk9PTCBiUmV2ZXJ0KQogewotCVdORAkJKnduZFB0cjsKLQl3bmRQdHIgPSBXSU5fRmluZFduZFB0cihoV25kKTsKLQlpZiAoIWJSZXZlcnQpIHsKLQkJcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7Ci0JCX0KLQllbHNlIHsKLQkJRGVzdHJveU1lbnUod25kUHRyLT5oU3lzTWVudSk7Ci0JCXduZFB0ci0+aFN5c01lbnUgPSBDb3B5U3lzTWVudSgpOwotCQl9Ci0JcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7CisgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaFduZCApOworICAgIGlmICghd25kUHRyKSByZXR1cm4gMDsKKworICAgIGlmICghYlJldmVydCkgcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7CisgICAgRGVzdHJveU1lbnUod25kUHRyLT5oU3lzTWVudSk7CisgICAgd25kUHRyLT5oU3lzTWVudSA9IENvcHlTeXNNZW51KCk7CisgICAgcmV0dXJuIHduZFB0ci0+aFN5c01lbnU7CiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9NYWtlZmlsZS5pbiBiL2RlYnVnZ2VyL01ha2VmaWxlLmluCmluZGV4IGVkNTBmMWIuLjc1YjAzMTYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL01ha2VmaWxlLmluCisrKyBiL2RlYnVnZ2VyL01ha2VmaWxlLmluCkBAIC00MSwxMSArNDEsMTIgQEAKIAogY2xlYW46CiAJKGNkIHJlYWRsaW5lOyAkKE1BS0UpIGNsZWFuKQotCXJtIC1mICoubyBcIypcIyAqfiBkYmcudGFiLmMgZGJnLnRhYi5oIGxleC55eS5jIHkudGFiLmMgeS50YWIuaCB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQorCXJtIC1mIGRiZy50YWIuYyBkYmcudGFiLmggbGV4Lnl5LmMgeS50YWIuYyB5LnRhYi5oCiAKIGRpc3RjbGVhbjoKIAkoY2QgcmVhZGxpbmU7ICQoTUFLRSkgZGlzdGNsZWFuKQotCXJtIC1mICoubyBcIypcIyAqfiBkYmcudGFiLmMgZGJnLnRhYi5oIGxleC55eS5jIHkudGFiLmMgeS50YWIuaCB0bXBfbWFrZSBNYWtlZmlsZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayBkYmcudGFiLmMgZGJnLnRhYi5oIGxleC55eS5jIHkudGFiLmMgeS50YWIuaCB0bXBfbWFrZSBNYWtlZmlsZQogCiBjb3VudHJ5Y2xlYW46CiAKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL2JyZWFrLmMgYi9kZWJ1Z2dlci9icmVhay5jCmluZGV4IGIyMzdjZTAuLjQ0MDZiMmYgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL2JyZWFrLmMKKysrIGIvZGVidWdnZXIvYnJlYWsuYwpAQCAtNjYsNiArNjYsNzEgQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBERUJVR19Jc1N0ZXBPdmVySW5zdHIKKyAqCisgKiBEZXRlcm1pbmUgaWYgdGhlIGluc3RydWN0aW9uIGF0IENTOkVJUCBpcyBhbiBpbnN0cnVjdGlvbiB0aGF0CisgKiB3ZSBuZWVkIHRvIHN0ZXAgb3ZlciAobGlrZSBhIGNhbGwgb3IgYSByZXBldGl0aXZlIHN0cmluZyBtb3ZlKS4KKyAqLworc3RhdGljIEJPT0wgREVCVUdfSXNTdGVwT3Zlckluc3RyKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQgKQoreworICAgIEJZVEUgKmluc3RyID0gKEJZVEUgKilQVFJfU0VHX09GRl9UT19MSU4oQ1NfcmVnKGNvbnRleHQpLEVJUF9yZWcoY29udGV4dCkpOworCisgICAgZm9yICg7OykKKyAgICB7CisgICAgICAgIHN3aXRjaCgqaW5zdHIpCisgICAgICAgIHsKKyAgICAgICAgICAvKiBTa2lwIGFsbCBwcmVmaXhlcyAqLworCisgICAgICAgIGNhc2UgMHgyZTogIC8qIGNzOiAqLworICAgICAgICBjYXNlIDB4MzY6ICAvKiBzczogKi8KKyAgICAgICAgY2FzZSAweDNlOiAgLyogZHM6ICovCisgICAgICAgIGNhc2UgMHgyNjogIC8qIGVzOiAqLworICAgICAgICBjYXNlIDB4NjQ6ICAvKiBmczogKi8KKyAgICAgICAgY2FzZSAweDY1OiAgLyogZ3M6ICovCisgICAgICAgIGNhc2UgMHg2NjogIC8qIG9wY29kZSBzaXplIHByZWZpeCAqLworICAgICAgICBjYXNlIDB4Njc6ICAvKiBhZGRyIHNpemUgcHJlZml4ICovCisgICAgICAgIGNhc2UgMHhmMDogIC8qIGxvY2sgKi8KKyAgICAgICAgY2FzZSAweGYyOiAgLyogcmVwbmUgKi8KKyAgICAgICAgY2FzZSAweGYzOiAgLyogcmVwZSAqLworICAgICAgICAgICAgaW5zdHIrKzsKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgLyogSGFuZGxlIGNhbGwgaW5zdHJ1Y3Rpb25zICovCisKKyAgICAgICAgY2FzZSAweGU4OiAgLyogY2FsbCA8b2Zmc2V0PiAqLworICAgICAgICBjYXNlIDB4OWE6ICAvKiBsY2FsbCA8c2VnPjo8b2ZmPiAqLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSAweGZmOiAgLyogY2FsbCA8cmVnbW9kcm0+ICovCisgICAgICAgICAgICByZXR1cm4gKCgoaW5zdHJbMV0gJiAweDM4KSA9PSAweDEwKSB8fAorICAgICAgICAgICAgICAgICAgICAoKGluc3RyWzFdICYgMHgzOCkgPT0gMHgxOCkpOworCisgICAgICAgICAgLyogSGFuZGxlIHN0cmluZyBpbnN0cnVjdGlvbnMgKi8KKworICAgICAgICBjYXNlIDB4NmM6ICAvKiBpbnNiICovCisgICAgICAgIGNhc2UgMHg2ZDogIC8qIGluc3cgKi8KKyAgICAgICAgY2FzZSAweDZlOiAgLyogb3V0c2IgKi8KKyAgICAgICAgY2FzZSAweDZmOiAgLyogb3V0c3cgKi8KKyAgICAgICAgY2FzZSAweGE0OiAgLyogbW92c2IgKi8KKyAgICAgICAgY2FzZSAweGE1OiAgLyogbW92c3cgKi8KKyAgICAgICAgY2FzZSAweGE2OiAgLyogY21wc2IgKi8KKyAgICAgICAgY2FzZSAweGE3OiAgLyogY21wc3cgKi8KKyAgICAgICAgY2FzZSAweGFhOiAgLyogc3Rvc2IgKi8KKyAgICAgICAgY2FzZSAweGFiOiAgLyogc3Rvc3cgKi8KKyAgICAgICAgY2FzZSAweGFjOiAgLyogbG9kc2IgKi8KKyAgICAgICAgY2FzZSAweGFkOiAgLyogbG9kc3cgKi8KKyAgICAgICAgY2FzZSAweGFlOiAgLyogc2Nhc2IgKi8KKyAgICAgICAgY2FzZSAweGFmOiAgLyogc2Nhc3cgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgREVCVUdfU2V0QnJlYWtwb2ludHMKICAqCiAgKiBTZXQgb3IgcmVtb3ZlIGFsbCB0aGUgYnJlYWtwb2ludHMuCkBAIC0yNTcsMTQgKzMyMiwxOCBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgRVhFQ19TVEVQX09WRVI6ICAvKiBTdGVwcGluZyBvdmVyIGEgY2FsbCAqLwotICAgICAgICBFRkxfcmVnKERFQlVHX2NvbnRleHQpICY9IH5TVEVQX0ZMQUc7Ci0gICAgICAgIGFkZHIub2ZmICs9IGluc3RyX2xlbjsKLSAgICAgICAgYnJlYWtwb2ludHNbMF0uYWRkciAgICA9IGFkZHI7Ci0gICAgICAgIGJyZWFrcG9pbnRzWzBdLmVuYWJsZWQgPSBUUlVFOwotICAgICAgICBicmVha3BvaW50c1swXS5pbl91c2UgID0gVFJVRTsKLSAgICAgICAgYnJlYWtwb2ludHNbMF0ub3Bjb2RlICA9ICooQllURSAqKURCR19BRERSX1RPX0xJTiggJmFkZHIgKTsKLSAgICAgICAgREVCVUdfU2V0QnJlYWtwb2ludHMoIFRSVUUgKTsKLSAgICAgICAgYnJlYWs7CisgICAgICAgIGlmIChERUJVR19Jc1N0ZXBPdmVySW5zdHIoREVCVUdfY29udGV4dCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVGTF9yZWcoREVCVUdfY29udGV4dCkgJj0gflNURVBfRkxBRzsKKyAgICAgICAgICAgIGFkZHIub2ZmICs9IGluc3RyX2xlbjsKKyAgICAgICAgICAgIGJyZWFrcG9pbnRzWzBdLmFkZHIgICAgPSBhZGRyOworICAgICAgICAgICAgYnJlYWtwb2ludHNbMF0uZW5hYmxlZCA9IFRSVUU7CisgICAgICAgICAgICBicmVha3BvaW50c1swXS5pbl91c2UgID0gVFJVRTsKKyAgICAgICAgICAgIGJyZWFrcG9pbnRzWzBdLm9wY29kZSAgPSAqKEJZVEUgKilEQkdfQUREUl9UT19MSU4oICZhZGRyICk7CisgICAgICAgICAgICBERUJVR19TZXRCcmVha3BvaW50cyggVFJVRSApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gc2luZ2xlLXN0ZXBwaW5nICovCiAKICAgICBjYXNlIEVYRUNfU1RFUF9JTlNUUjogLyogU2luZ2xlLXN0ZXBwaW5nIGFuIGluc3RydWN0aW9uICovCiAgICAgICAgIEVGTF9yZWcoREVCVUdfY29udGV4dCkgfD0gU1RFUF9GTEFHOwpkaWZmIC0tZ2l0IGEvZGVidWdnZXIvbWVtb3J5LmMgYi9kZWJ1Z2dlci9tZW1vcnkuYwppbmRleCA4MGRmY2QzLi4yMDZlNTg3IDEwMDY0NAotLS0gYS9kZWJ1Z2dlci9tZW1vcnkuYworKysgYi9kZWJ1Z2dlci9tZW1vcnkuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAJCXsKIAkJCWZwcmludGYoc3RkZXJyLCIgJTA0eCIsICp3ZHVtcCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmICs9IDI7Ci0JCQlpZiAoKGkgJSAxMCkgPT0gNykgeworCQkJaWYgKChpICUgOCkgPT0gNykgewogCQkJCWZwcmludGYoc3RkZXJyLCJcbiIpOwogCQkJCURFQlVHX1ByaW50QWRkcmVzcyggJmFkZHIsIGRiZ19tb2RlICk7CiAJCQkJZnByaW50ZihzdGRlcnIsIjogICIpOwpAQCAtMTMzLDcgKzEzMyw3IEBACiAJCQl9IGVsc2UKIAkJCQlmcHJpbnRmKHN0ZGVyciwiICVjIiwgKnBudCsrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmKys7Ci0JCQlpZiAoKGkgJSAzMikgPT0gNykgeworCQkJaWYgKChpICUgMzIpID09IDMxKSB7CiAJCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCQkJREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7CkBAIC0xNDcsNyArMTQ3LDcgQEAKIAkJewogCQkJZnByaW50ZihzdGRlcnIsIiAlMDJ4IiwgKCpwbnQrKykgJiAweGZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHIub2ZmKys7Ci0JCQlpZiAoKGkgJSAzMikgPT0gNykgeworCQkJaWYgKChpICUgMTYpID09IDE1KSB7CiAJCQkJZnByaW50ZihzdGRlcnIsIlxuIik7CiAJCQkJREVCVUdfUHJpbnRBZGRyZXNzKCAmYWRkciwgZGJnX21vZGUgKTsKIAkJCQlmcHJpbnRmKHN0ZGVyciwiOiAgIik7CmRpZmYgLS1naXQgYS9kZWJ1Z2dlci9yZWFkbGluZS9NYWtlZmlsZS5pbiBiL2RlYnVnZ2VyL3JlYWRsaW5lL01ha2VmaWxlLmluCmluZGV4IDVmMzI3NTMuLjg3M2YzZDIgMTAwNjQ0Ci0tLSBhL2RlYnVnZ2VyL3JlYWRsaW5lL01ha2VmaWxlLmluCisrKyBiL2RlYnVnZ2VyL3JlYWRsaW5lL01ha2VmaWxlLmluCkBAIC0xLDExICsxLDEyIEBACiBDQyAJPSBAQ0NACiBDRkxBR1MgCT0gQENGTEFHU0AKK0RFRlMgICAgPSBAREVGU0AKIFhJTkNMIAk9IEB4X2luY2x1ZGVzQAogVE9QU1JDICA9IEB0b3Bfc3JjZGlyQAogRElWSU5DTCA9IC1JJChUT1BTUkMpL2luY2x1ZGUKIExECT0gQExEQAogTERDT01CSU5FRkxBR1MgPSBATERDT01CSU5FRkxBR1NACi1ESVZERUZTCT0gQERFRlNAIC1ESElERSAtREFOU0lfQVJST1dTCitESVZERUZTCT0gJChERUZTKSAtREhJREUgLURBTlNJX0FSUk9XUwogCiAKIE1PRFVMRSAJPSByZWFkbGluZQpAQCAtMjgsNyArMjksNyBAQAogCW12IHRtcF9tYWtlIE1ha2VmaWxlCiAKIGNsZWFuOgotCXJtIC1mICoubyBcIypcIyAqfiB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQogCiBkaXN0Y2xlYW46IGNsZWFuCiAJcm0gLWYgTWFrZWZpbGUKZGlmZiAtLWdpdCBhL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYwppbmRleCBmZGM4ZDJkLi4wMTA3NDRlMSAxMDA2NDQKLS0tIGEvZGVidWdnZXIvcmVhZGxpbmUvc3lzdW5peC5jCisrKyBiL2RlYnVnZ2VyL3JlYWRsaW5lL3N5c3VuaXguYwpAQCAtNCwxMCArNCw2IEBACiAqLwogI2luY2x1ZGUgImVkaXRsaW5lLmgiCiAKLSNpZmRlZiBIQVZFX0NPTkZJR19ICi0jaW5jbHVkZSAiY29uZmlnLmgiCi0jZW5kaWYKLQogI2lmCWRlZmluZWQoSEFWRV9UQ0dFVEFUVFIpCiAjaW5jbHVkZSA8dGVybWlvcy5oPgogCmRpZmYgLS1naXQgYS9pZjE2MzIvTWFrZWZpbGUuaW4gYi9pZjE2MzIvTWFrZWZpbGUuaW4KaW5kZXggMjI1ZDVmYi4uNGVhYjYyYyAxMDA2NDQKLS0tIGEvaWYxNjMyL01ha2VmaWxlLmluCisrKyBiL2lmMTYzMi9NYWtlZmlsZS5pbgpAQCAtMjQsNyArMjQsOCBAQAogCiBPQkpTID0gJChTUkNTOi5jPS5vKSAkKERMTFMxNjouc3BlYz0ubykgJChETExTMzI6LnNwZWM9Lm8pIGNhbGwxNi5vIGNhbGwzMi5vCiAKLVNGSUxFUyA9ICQoRExMUzE2Oi5zcGVjPS5TKQorU1BFQzE2X0ZJTEVTID0gJChETExTMTY6LnNwZWM9LlMpCitTUEVDMzJfRklMRVMgPSAkKERMTFMzMjouc3BlYz0uYykKIAogLlNVRkZJWEVTOiAuc3BlYwogCkBAIC00MiwxNiArNDMsMTYgQEAKIAogYWxsOiBjaGVja2J1aWxkICQoTU9EVUxFKS5vCiAKLSQoU0ZJTEVTKTogJChUT1BTUkMpL3Rvb2xzL2J1aWxkCiskKFNQRUMxNl9GSUxFUykgJChTUEVDMzJfRklMRVMpOiAkKFRPUFNSQykvdG9vbHMvYnVpbGQKIAogY2hlY2tidWlsZDoKIAljZCAkKFRPUFNSQykvdG9vbHM7ICQoTUFLRSkgJ0NDPSQoQ0MpJyAnQ0ZMQUdTPSQoQ0ZMQUdTKScgJ0xEPSQoTEQpJyAnTERDT01CSU5FRkxBR1M9JChMRENPTUJJTkVGTEFHUyknIGJ1aWxkCiAKLWNhbGwxNi5TOiAkKFRPUFNSQykvaW5jbHVkZS9jYWxsYmFjay5oCi0JJChUT1BTUkMpL3Rvb2xzL2J1aWxkIC1jYWxsMTYgYGNhdCAkKFRPUFNSQykvaW5jbHVkZS9jYWxsYmFjay5oIHwgZ3JlcCAiZXh0ZXJuLipDYWxsVG8xNl8iIHwgc2VkICdzLy4qQ2FsbFRvMTZfXCguKlwpKC4qL1wxLycgfCBzb3J0IHwgdW5pcWAgPiBjYWxsMTYuUworY2FsbDE2LlM6ICQoVE9QU1JDKS9pbmNsdWRlL2NhbGxiYWNrLmggJChCVUlMRCkKKwkkKEJVSUxEKSAtY2FsbDE2IGBjYXQgJChUT1BTUkMpL2luY2x1ZGUvY2FsbGJhY2suaCB8IGdyZXAgImV4dGVybi4qQ2FsbFRvMTZfIiB8IHNlZCAncy8uKkNhbGxUbzE2X1woLipcKSguKi9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDE2LlMKIAotY2FsbDMyLlM6ICQoU0ZJTEVTKQotCSQoQlVJTEQpIC1jYWxsMzIgYGNhdCAkKFNGSUxFUykgfCBncmVwIENhbGxUbzMyXyB8IHNlZCAncy8uKkNhbGxUbzMyX1woLipcKS9cMS8nIHwgc29ydCB8IHVuaXFgID4gY2FsbDMyLlMKK2NhbGwzMi5TOiAkKFNQRUMxNl9GSUxFUykKKwkkKEJVSUxEKSAtY2FsbDMyIGBjYXQgJChTUEVDMTZfRklMRVMpIHwgZ3JlcCBDYWxsVG8zMl8gfCBzZWQgJ3MvLipDYWxsVG8zMl9cKC4qXCkvXDEvJyB8IHNvcnQgfCB1bmlxYCA+IGNhbGwzMi5TCiAKICQoTU9EVUxFKS5vOiAkKE9CSlMpCiAJJChMRCkgJChMRENPTUJJTkVGTEFHUykgJChPQkpTKSAtbyAkKE1PRFVMRSkubwpAQCAtNjIsNyArNjMsNyBAQAogCW12IHRtcF9tYWtlIE1ha2VmaWxlCiAKIGNsZWFuOgotCXJtIC1mICoubyBcIypcIyAqfiB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQogCXJtIC1mICQoRExMUzE2Oi5zcGVjPS5TKSAkKERMTFMzMjouc3BlYz0uYykgY2FsbDMyLlMgY2FsbDE2LlMKIAogZGlzdGNsZWFuOiBjbGVhbgpkaWZmIC0tZ2l0IGEvaWYxNjMyL2dkaS5zcGVjIGIvaWYxNjMyL2dkaS5zcGVjCmluZGV4IDdiMzAyYWQuLjc4NGFkNjYgMTAwNjQ0Ci0tLSBhL2lmMTYzMi9nZGkuc3BlYworKysgYi9pZjE2MzIvZ2RpLnNwZWMKQEAgLTI0NSw3ICsyNDUsNyBAQAogMzgwIHN0dWIgRU5EUEFHRQogMzgxIHN0dWIgU0VUQUJPUlRQUk9DCiAzODIgc3R1YiBBQk9SVERPQwotNDAwIHN0dWIgRkFTVFdJTkRPV0ZSQU1FCis0MDAgcGFzY2FsMTYgRmFzdFdpbmRvd0ZyYW1lKHdvcmQgbG9uZyB3b3JkIHdvcmQgbG9uZykgRmFzdFdpbmRvd0ZyYW1lCiA0MDEgc3R1YiBHRElNT1ZFQklUTUFQCiA0MDMgc3R1YiBHRElJTklUMgogNDA1IHN0dWIgRklOQUxHRElJTklUCmRpZmYgLS1naXQgYS9pZjE2MzIva2VybmVsLnNwZWMgYi9pZjE2MzIva2VybmVsLnNwZWMKaW5kZXggYTA4MTMyYi4uNzg4MTViZiAxMDA2NDQKLS0tIGEvaWYxNjMyL2tlcm5lbC5zcGVjCisrKyBiL2lmMTYzMi9rZXJuZWwuc3BlYwpAQCAtMjMyLDcgKzIzMiw3IEBACiAjMzUxIEJVTk5ZXzM1MQogMzUzIHBhc2NhbCBsc3RyY3B5bihzZWdwdHIgc2VncHRyIHdvcmQpIGxzdHJjcHluCiAzNTQgc3R1YiBHZXRBcHBDb21wYXRGbGFncwotMzU1IHN0dWIgR2V0V2luRGVidWdJbmZvCi0zNTYgc3R1YiBTZXRXaW5EZWJ1Z0luZm8KKzM1NSBwYXNjYWwxNiBHZXRXaW5EZWJ1Z0luZm8ocHRyIHdvcmQpIEdldFdpbkRlYnVnSW5mbworMzU2IHBhc2NhbDE2IFNldFdpbkRlYnVnSW5mbyhwdHIpIFNldFdpbkRlYnVnSW5mbwogNDAzIHBhc2NhbDE2IEZhclNldE93bmVyKHdvcmQgd29yZCkgRmFyU2V0T3duZXIKIDQwNCBwYXNjYWwxNiBGYXJHZXRPd25lcih3b3JkKSBGYXJHZXRPd25lcgpkaWZmIC0tZ2l0IGEvaWYxNjMyL3BvcC5oIGIvaWYxNjMyL3BvcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjk0YjMzLi4wMDAwMDAwCi0tLSBhL2lmMTYzMi9wb3AuaAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLQlhZGQJJDgsJWVzcAotCXBvcHcJJWVzCi0JYWRkCSQyLCVlc3AKLQlwb3B3CSVkcwotCWFkZAkkMiwlZXNwCi0JcG9wbAklZWRpCi0JcG9wbAklZXNpCi0JcG9wbAklZWJwCi0JYWRkCSQ0LCVlc3AKLQlwb3BsCSVlYngKLQlwb3BsCSVlZHgKLQlwb3BsCSVlY3gKLQlwb3BsCSVlYXgKLQlhZGQJJDE2LCVlc3AKLQlwb3BsCSVnczpyZXR1cm5fdmFsdWUKLQlhZGQJJDIwLCVlc3AKLQlwdXNobAklZ3M6cmV0dXJuX3ZhbHVlCi0JcG9wZmwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXRvbS5oIGIvaW5jbHVkZS9hdG9tLmgKaW5kZXggNzA2YjcwOS4uNTk4OGE1YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hdG9tLmgKKysrIGIvaW5jbHVkZS9hdG9tLmgKQEAgLTI1LDEwICsyNSw0IEBACiAgICAgSEFORExFICAgICAgZW50cmllc1sxXTsKIH0gQVRPTVRBQkxFOwogCi0KLUFUT00gTG9jYWxBZGRBdG9tKCBTRUdQVFIgc3RyICk7Ci1BVE9NIExvY2FsRGVsZXRlQXRvbSggQVRPTSBhdG9tICk7Ci1BVE9NIExvY2FsRmluZEF0b20oIFNFR1BUUiBzdHIgKTsKLVdPUkQgTG9jYWxHZXRBdG9tTmFtZSggQVRPTSBhdG9tLCBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICk7Ci0KICNlbmRpZiAgLyogQVRPTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX2Nsb3NlXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29ibV9jbG9zZV85NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIxNzYwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29ibV9jbG9zZV85NQpAQCAtMCwwICsxLDIzIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2JtX2Nsb3NlXzk1W10gPSB7CisiMTYgMTQgNiAxIiwKKyIgCXMgYnV0dG9uX2hpZ2hsaWdodAljIHdoaXRlIiwKKyIrCXMgYnV0dG9uX2VkZ2UJYyBncmV5ODUiLAorIlgJcyBidXR0b25fZmFjZQljIGdyZXk3NSIsCisibwlzIGJ1dHRvbl9zaGFkb3cgYyBncmV5NTAiLAorIi4JcyBidXR0b25fdGV4dAljIGJsYWNrIiwKKyJPCXMgd2luZG93X2ZyYW1lCWMgYmxhY2siLAorIiAgICAgICAgICAgICAgIE8iLAorIiArKysrKysrKysrKysrb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFguLlhYWFguLlhYb08iLAorIiArWFhYLi5YWC4uWFhYb08iLAorIiArWFhYWC4uLi5YWFhYb08iLAorIiArWFhYWFguLlhYWFhYb08iLAorIiArWFhYWC4uLi5YWFhYb08iLAorIiArWFhYLi5YWC4uWFhYb08iLAorIiArWFguLlhYWFguLlhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiBvb29vb29vb29vb29vb08iLAorIk9PT09PT09PT09PT09PT08ifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fY2xvc2VkXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29ibV9jbG9zZWRfOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkwZTlkNwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fY2xvc2VkXzk1CkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fY2xvc2VkXzk1W10gPSB7CisiMTYgMTQgNiAxIiwKKyIgCXMgYnV0dG9uX2hpZ2hsaWdodAljIHdoaXRlIiwKKyIrCXMgYnV0dG9uX2VkZ2UJYyBncmV5ODUiLAorIlgJcyBidXR0b25fZmFjZQljIGdyZXk3NSIsCisibwlzIGJ1dHRvbl9zaGFkb3cgYyBncmV5NTAiLAorIi4JcyBidXR0b25fdGV4dAljIGJsYWNrIiwKKyJPCXMgd2luZG93X2ZyYW1lCWMgYmxhY2siLAorIk9PT09PT09PT09PT09PTyAiLAorIk9vb29vb29vb29vb29vKyAiLAorIk9vWFhYWFhYWFhYWFhYKyAiLAorIk9vWFhYWFhYWFhYWFhYKyAiLAorIk9vWFhYLi5YWFhYLi5YKyAiLAorIk9vWFhYWC4uWFguLlhYKyAiLAorIk9vWFhYWFguLi4uWFhYKyAiLAorIk9vWFhYWFhYLi5YWFhYKyAiLAorIk9vWFhYWFguLi4uWFhYKyAiLAorIk9vWFhYWC4uWFguLlhYKyAiLAorIk9vWFhYLi5YWFhYLi5YKyAiLAorIk9vWFhYWFhYWFhYWFhYKyAiLAorIk8rKysrKysrKysrKysrKyAiLAorIiAgICAgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVkdWNlXzk1IGIvaW5jbHVkZS9iaXRtYXBzL29ibV9yZWR1Y2VfOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyNTMxZAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVkdWNlXzk1CkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fcmVkdWNlXzk1W10gPSB7CisiMTYgMTQgNiAxIiwKKyIgCXMgYnV0dG9uX2hpZ2hsaWdodAljIHdoaXRlIiwKKyIrCXMgYnV0dG9uX2VkZ2UJYyBncmV5ODUiLAorIlgJcyBidXR0b25fZmFjZQljIGdyZXk3NSIsCisibwlzIGJ1dHRvbl9zaGFkb3cJYyBncmV5NTAiLAorIi4JcyBidXR0b25fdGV4dAljIGJsYWNrIiwKKyJPCXMgd2luZG93X2ZyYW1lCWMgYmxhY2siLAorIiAgICAgICAgICAgICAgIE8iLAorIiArKysrKysrKysrKysrb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiArWFguLi4uLi5YWFhYb08iLAorIiArWFguLi4uLi5YWFhYb08iLAorIiArWFhYWFhYWFhYWFhYb08iLAorIiBvb29vb29vb29vb29vb08iLAorIk9PT09PT09PT09PT09PT08ifTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVkdWNlZF85NSBiL2luY2x1ZGUvYml0bWFwcy9vYm1fcmVkdWNlZF85NQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTk5MjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iaXRtYXBzL29ibV9yZWR1Y2VkXzk1CkBAIC0wLDAgKzEsMjMgQEAKKy8qIFhQTSAqLworc3RhdGljIGNoYXIgKiBvYm1fcmVkdWNlZF85NVtdID0geworIjE2IDE0IDYgMSIsCisiTwlzIGJ1dHRvbl9oaWdobGlnaHQJYyB3aGl0ZSIsCisibwlzIGJ1dHRvbl9lZGdlCWMgZ3JleTg1IiwKKyJYCXMgYnV0dG9uX2ZhY2UJYyBncmV5NzUiLAorIisJcyBidXR0b25fc2hhZG93CWMgZ3JleTUwIiwKKyIuCXMgYnV0dG9uX3RleHQJYyBibGFjayIsCisiIAlzIHdpbmRvd19mcmFtZQljIGJsYWNrIiwKKyIgICAgICAgICAgICAgICAgIiwKKyIgKysrKysrKysrKysrK29PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYWC4uLi4uLlhYWG9PIiwKKyIgK1hYWC4uLi4uLlhYWG9PIiwKKyIgb29vb29vb29vb29vb29PIiwKKyJPT09PT09PT09PT09PT09PIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2JpdG1hcHMvb2JtX3pvb21fOTUgYi9pbmNsdWRlL2JpdG1hcHMvb2JtX3pvb21fOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjOTM3YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fem9vbV85NQpAQCAtMCwwICsxLDIzIEBACisvKiBYUE0gKi8KK3N0YXRpYyBjaGFyICogb2JtX3pvb21fOTVbXSA9IHsKKyIxNiAxNCA2IDEiLAorIiAJcyBidXR0b25faGlnaGxpZ2h0CWMgd2hpdGUiLAorIisJcyBidXR0b25fZWRnZQljIGdyZXk4NSIsCisiWAlzIGJ1dHRvbl9mYWNlCWMgZ3JleTc1IiwKKyJvCXMgYnV0dG9uX3NoYWRvdwljIGdyZXk1MCIsCisiLglzIGJ1dHRvbl90ZXh0CWMgYmxhY2siLAorIk8JcyB3aW5kb3dfZnJhbWUJYyBibGFjayIsCisiICAgICAgICAgICAgICAgTyIsCisiICsrKysrKysrKysrKytvTyIsCisiICtYLi4uLi4uLi4uWFhvTyIsCisiICtYLi4uLi4uLi4uWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLlhYWFhYWFguWFhvTyIsCisiICtYLi4uLi4uLi4uWFhvTyIsCisiICtYWFhYWFhYWFhYWFhvTyIsCisiIG9vb29vb29vb29vb29vTyIsCisiT09PT09PT09PT09PT09PTyJ9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9iaXRtYXBzL29ibV96b29tZF85NSBiL2luY2x1ZGUvYml0bWFwcy9vYm1fem9vbWRfOTUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmExNWE4YwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYml0bWFwcy9vYm1fem9vbWRfOTUKQEAgLTAsMCArMSwyMyBAQAorLyogWFBNICovCitzdGF0aWMgY2hhciAqIG9ibV96b29tZF85NVtdID0geworIjE2IDE0IDYgMSIsCisiTwlzIGJ1dHRvbl9oaWdobGlnaHQJYyB3aGl0ZSIsCisibwlzIGJ1dHRvbl9lZGdlCWMgZ3JleTg1IiwKKyJYCXMgYnV0dG9uX2ZhY2UJYyBncmV5NzUiLAorIisJcyBidXR0b25fc2hhZG93CWMgZ3JleTUwIiwKKyIuCXMgYnV0dG9uX3RleHQJYyBibGFjayIsCisiIAlzIHdpbmRvd19mcmFtZQljIGJsYWNrIiwKKyIgICAgICAgICAgICAgICAgIiwKKyIgKysrKysrKysrKysrK29PIiwKKyIgK1hYWFhYWFhYWFhYWG9PIiwKKyIgK1hYLi4uLi4uLi4uWG9PIiwKKyIgK1hYLi4uLi4uLi4uWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLlhYWFhYWFguWG9PIiwKKyIgK1hYLi4uLi4uLi4uWG9PIiwKKyIgb29vb29vb29vb29vb29PIiwKKyJPT09PT09PT09PT09PT09PIn07CmRpZmYgLS1naXQgYS9pbmNsdWRlL2RkZV9hdG9tLmggYi9pbmNsdWRlL2RkZV9hdG9tLmgKaW5kZXggNTZkZjZiNy4uNjJiNTBmZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZGVfYXRvbS5oCisrKyBiL2luY2x1ZGUvZGRlX2F0b20uaApAQCAtOSwxNSArOSwyMCBAQAogICovCiAjaWZuZGVmIF9fV0lORV9EREVfQVRPTV9ICiAjZGVmaW5lIF9fV0lORV9EREVfQVRPTV9ICisKKyNpZmRlZiBDT05GSUdfSVBDCisKICNpbmNsdWRlICJ3aW5kb3dzLmgiCiAKICNkZWZpbmUgRERFX0FUT01TIDE1NwkJICAgLyogYSBwcmltZSBudW1iZXIgZm9yIGhhc2hpbmcgKi8KIAogdm9pZCBBVE9NX0dsb2JhbEluaXQodm9pZCk7Ci0vKgotQVRPTSBHbG9iYWxBZGRBdG9tKCBMUENTVFIgc3RyICk7Ci1BVE9NIEdsb2JhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApOwotQVRPTSBHbG9iYWxGaW5kQXRvbSggTFBDU1RSIHN0ciApOwotV09SRCBHbG9iYWxHZXRBdG9tTmFtZSggQVRPTSBhdG9tLCBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICkKLSovCisKK0FUT00gRERFX0dsb2JhbEFkZEF0b20oIFNFR1BUUiBzdHIgKTsKK0FUT00gRERFX0dsb2JhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApOworQVRPTSBEREVfR2xvYmFsRmluZEF0b20oIFNFR1BUUiBzdHIgKTsKK1dPUkQgRERFX0dsb2JhbEdldEF0b21OYW1lKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgc2hvcnQgY291bnQgKQorCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KKwogI2VuZGlmIF9fV0lORV9EREVfQVRPTV9ICmRpZmYgLS1naXQgYS9pbmNsdWRlL2RkZV9tZW0uaCBiL2luY2x1ZGUvZGRlX21lbS5oCmluZGV4IDZhODMwZTEuLjNiYzhkZmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZGRlX21lbS5oCisrKyBiL2luY2x1ZGUvZGRlX21lbS5oCkBAIC05LDYgKzksOSBAQAogICovCiAjaWZuZGVmIF9fV0lORV9EREVfTUVNX0gKICNkZWZpbmUgX19XSU5FX0RERV9NRU1fSAorCisjaWZkZWYgQ09ORklHX0lQQworCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKICNpbmNsdWRlICJnbG9iYWwuaCIKICNpbmNsdWRlICJzaG1fYmxvY2suaCIKQEAgLTMxLDQgKzM0LDYgQEAKIEhBTkRMRSBEREVfR2xvYmFsSGFuZGxlKFdPUkQpOwogSEFORExFIERERV9HbG9iYWxGbGFncyhXT1JEKTsKIAorI2VuZGlmICAvKiBDT05GSUdfSVBDICovCisKICNlbmRpZiAvKiBfX1dJTkVfRERFX01FTV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2RkZV9wcm9jLmggYi9pbmNsdWRlL2RkZV9wcm9jLmgKaW5kZXggODVlNjgyYS4uMDExZDM4OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9kZGVfcHJvYy5oCisrKyBiL2luY2x1ZGUvZGRlX3Byb2MuaApAQCAtOSw2ICs5LDkgQEAKICAqLwogI2lmbmRlZiBfX1dJTkVfRERFX1BST0NfSAogI2RlZmluZSBfX1dJTkVfRERFX1BST0NfSAorCisjaWZkZWYgQ09ORklHX0lQQworCiAjaW5jbHVkZSA8c2V0am1wLmg+CiAjaW5jbHVkZSAid2ludHlwZXMuaCIKICNpbmNsdWRlICJ3aW5kb3dzLmgiCkBAIC01NCw0ICs1Nyw3IEBACiBpbnQgRERFX0dldFJlbW90ZU1lc3NhZ2UoKTsKIHZvaWQgRERFX0Rlc3Ryb3lXaW5kb3coSFdORCBod25kKTsgLyogZGVsZXRlIERERSBpbmZvIHJlZ2FyZGluZyBod25kICovCiB2b2lkIERERV9UZXN0RERFKEhXTkQgaHduZCk7CSAgIC8qIGRvIHdlIGhhdmUgZGRlIGhhbmRsaW5nIGluIHRoZSB3aW5kb3cgPyovCisKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLworCiAjZW5kaWYgLyogX19XSU5FX0RERV9QUk9DX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWlzY2VtdS5oIGIvaW5jbHVkZS9taXNjZW11LmgKaW5kZXggMjMwOTI3NC4uYmYyYjAwNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9taXNjZW11LmgKKysrIGIvaW5jbHVkZS9taXNjZW11LmgKQEAgLTEsMjAgKzEsMzkgQEAKKy8qCisgKiBNaXNjLiBlbXVsYXRpb24gZGVmaW5pdGlvbnMKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBBbGV4YW5kcmUgSnVsbGlhcmQKKyAqLworCiAjaWZuZGVmIF9fV0lORV9NSVNDRU1VX0gKICNkZWZpbmUgX19XSU5FX01JU0NFTVVfSAogCiAjaW5jbHVkZSAid2ludHlwZXMuaCIKICNpbmNsdWRlICJyZWdpc3RlcnMuaCIKIAorCisgIC8qIG1pc2NlbXUvZG9zbWVtLmMgKi8KK2V4dGVybiBCT09MIERPU01FTV9Jbml0KHZvaWQpOworZXh0ZXJuIHZvaWQgRE9TTUVNX0ZpbGxCaW9zU2VnbWVudCh2b2lkKTsKK2V4dGVybiBIQU5ETEUgRE9TTUVNX0Jpb3NTZWc7CisKKyAgLyogbWlzY2VtdS9pbnN0ci5jICovCiBleHRlcm4gQk9PTCBJTlNUUl9FbXVsYXRlSW5zdHJ1Y3Rpb24oIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCApOwogCi1leHRlcm4gRFdPUkQgaW5wb3J0KCBpbnQgcG9ydCwgaW50IGNvdW50ICk7Ci1leHRlcm4gdm9pZCBvdXRwb3J0KCBpbnQgcG9ydCwgaW50IGNvdW50LCBEV09SRCB2YWx1ZSApOwotCisgIC8qIG1pc2NlbXUvaW50ZXJydXB0cy5jICovCiBleHRlcm4gQk9PTCBJTlRfSW5pdCh2b2lkKTsKIGV4dGVybiBTRUdQVFIgSU5UX0dldEhhbmRsZXIoIEJZVEUgaW50bnVtICk7CiBleHRlcm4gdm9pZCBJTlRfU2V0SGFuZGxlciggQllURSBpbnRudW0sIFNFR1BUUiBoYW5kbGVyICk7CiAKKyAgLyogbWlzY2VtdS9pbnQxYS5jICovCitleHRlcm4gRFdPUkQgSU5UMUFfR2V0VGlja3NTaW5jZU1pZG5pZ2h0KHZvaWQpOworCisgIC8qIG1pc2NlbXUvaW50MjEuYyAqLwogZXh0ZXJuIHZvaWQgSU5UMjFfSW5pdCh2b2lkKTsKIAorICAvKiBtaXNjZW11L2lvcG9ydHMuYyAqLworZXh0ZXJuIERXT1JEIGlucG9ydCggaW50IHBvcnQsIGludCBjb3VudCApOworZXh0ZXJuIHZvaWQgb3V0cG9ydCggaW50IHBvcnQsIGludCBjb3VudCwgRFdPUkQgdmFsdWUgKTsKKwogCiAjZGVmaW5lIElOVF9CQVJGKGNvbnRleHQsbnVtKSBcCiAgICAgZnByaW50Ziggc3RkZXJyLCAiaW50JXg6IHVua25vd24vbm90IGltcGxlbWVudGVkIHBhcmFtZXRlcnM6XG4iIFwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2htX2Jsb2NrLmggYi9pbmNsdWRlL3NobV9ibG9jay5oCmluZGV4IGMxOWM4NGYuLmU4NjEyZDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2htX2Jsb2NrLmgKKysrIGIvaW5jbHVkZS9zaG1fYmxvY2suaApAQCAtOSw2ICs5LDkgQEAKICAqLwogI2lmbmRlZiBfX1dJTkVfU0hNX0JMT0NLX0gKICNkZWZpbmUgX19XSU5FX1NITV9CTE9DS19ICisKKyNpZmRlZiBDT05GSUdfSVBDCisKICNpbmNsdWRlIDxzeXMvc2htLmg+CiAjaW5jbHVkZSAid2ludHlwZXMuaCIKICNkZWZpbmUgU0VHU0laRSAgICAgICAgICAgICAgICAgMHgxMDAwMCAvKiA2NCAqLyAKQEAgLTgzLDQgKzg2LDUgQEAKIC8qIGRlbGV0ZSBjaGFpbiBvZiBzaG0gYmxvY2tzIChwb2ludGluZyB0byBlYWNoIG90aGVyICovCiB2b2lkIHNobV9kZWxldGVfY2hhaW4oaW50ICpzaG1pZCk7CiAKLSNlbmRpZiAvKiBfX1dJTkVfU0hNX0JMT0NLX0ggKi8KKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLworI2VuZGlmICAvKiBfX1dJTkVfU0hNX0JMT0NLX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvc2htX2ZyYWdtZW50LmggYi9pbmNsdWRlL3NobV9mcmFnbWVudC5oCmluZGV4IDgxYTRiNjYuLjg5M2FlZTcgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2htX2ZyYWdtZW50LmgKKysrIGIvaW5jbHVkZS9zaG1fZnJhZ21lbnQuaApAQCAtMTAsNiArMTAsOCBAQAogI2lmbmRlZiBfX1dJTkVfU0hNX0ZSQUdNRU5UX0gKICNkZWZpbmUgX19XSU5FX1NITV9GUkFHTUVOVF9ICiAKKyNpZmRlZiBDT05GSUdfSVBDCisKICNpbmNsdWRlICJzaG1fYmxvY2suaCIKIAogI2RlZmluZSBOSUwgKChpbnQpIDApCkBAIC00NCw0ICs0Niw2IEBACiAvKiBUaGlzIGlzIHVzZWQgZm9yIGRlYnVnZ2luZyBvbmx5ICovCiB2b2lkIHNobV9wcmludF9mcmVlX2xpc3Qoc3RydWN0IHNobV9ibG9jayAqYmxvY2spOwogCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KKwogI2VuZGlmIC8qIF9fV0lORV9TSE1fRlJBR01FTlRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zaG1fbWFpbl9ibGsuaCBiL2luY2x1ZGUvc2htX21haW5fYmxrLmgKaW5kZXggZTNmOWU1Yi4uNDA3NmJjZiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9zaG1fbWFpbl9ibGsuaAorKysgYi9pbmNsdWRlL3NobV9tYWluX2Jsay5oCkBAIC05LDYgKzksOSBAQAogICovCiAjaWZuZGVmIF9fV0lORV9TSE1fTUFJTl9CTEtfSAogI2RlZmluZSBfX1dJTkVfU0hNX01BSU5fQkxLX0gKKworI2lmZGVmIENPTkZJR19JUEMKKwogI2luY2x1ZGUgPHN5cy9zaG0uaD4KICNpbmNsdWRlICJzaG1fYmxvY2suaCIKICNpbmNsdWRlICJzaG1fc2VtYXBoLmgiCkBAIC01Miw0ICs1NSw2IEBACiBpbnQgRERFX25vX29mX2F0dGFjaGVkKCk7CiAjZGVmaW5lIERERV9JUENfaW5pdCgpICAoIChtYWluX2Jsb2NrPT1OVUxMKSA/ICAoRERFX21lbV9pbml0KCkpIDogMCApCiAKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLworCiAjZW5kaWYgLyogX19XSU5FX1NITV9NQUlOX0JMS19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NobV9zZW1hcGguaCBiL2luY2x1ZGUvc2htX3NlbWFwaC5oCmluZGV4IDU1NjI0NDYuLjYyODUyZjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc2htX3NlbWFwaC5oCisrKyBiL2luY2x1ZGUvc2htX3NlbWFwaC5oCkBAIC0xMiw2ICsxMiw4IEBACiAjZGVmaW5lIF9fV0lORV9TSE1fU0VNQVBIX0gKIC8qIElNUE9SVEFOVDogSWYgcG9zc2libGUsIHJlc3RyaWN0IHVzYWdlIG9mIHRoZXNlIGZ1bmN0aW9ucy4gKi8KIAorI2lmZGVmIENPTkZJR19JUEMKKwogdHlwZWRlZiBpbnQgc2htX3NlbTsKIAogdm9pZCBzaG1fcmVhZF93YWl0KHNobV9zZW0gc2VtaWQpOwpAQCAtMjEsNCArMjMsNiBAQAogdm9pZCBzaG1fc2VtX2luaXQoc2htX3NlbSAqc2VtcHRyKTsKIHZvaWQgc2htX3NlbV9kb25lKHNobV9zZW0gKnNlbXB0cik7CiAKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLworCiAjZW5kaWYgLyogX19XSU5FX1NITV9TRU1BUEhfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zeXNtZXRyaWNzLmggYi9pbmNsdWRlL3N5c21ldHJpY3MuaAppbmRleCBmOWU3M2U3Li4xMWUwOGI0IDEwMDY0NAotLS0gYS9pbmNsdWRlL3N5c21ldHJpY3MuaAorKysgYi9pbmNsdWRlL3N5c21ldHJpY3MuaApAQCAtMTEsMzAgKzExLDU2IEBACiAKIAogICAvKiBDb25zdGFudCBzeXN0ZW0gbWV0cmljcyAqLworI2lmZGVmIFdJTl85NV9MT09LCisjZGVmaW5lIFNZU01FVFJJQ1NfQ1hWU0NST0xMICAgICAgICAgMTQKKyNkZWZpbmUgU1lTTUVUUklDU19DWUhTQ1JPTEwgICAgICAgICAxNAorI2Vsc2UKICNkZWZpbmUgU1lTTUVUUklDU19DWFZTQ1JPTEwgICAgICAgICAxNgogI2RlZmluZSBTWVNNRVRSSUNTX0NZSFNDUk9MTCAgICAgICAgIDE2CisjZW5kaWYKICNkZWZpbmUgU1lTTUVUUklDU19DWUNBUFRJT04gICAgICAgICAyMAogI2RlZmluZSBTWVNNRVRSSUNTX0NYQk9SREVSICAgICAgICAgICAxCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1lCT1JERVIgICAgICAgICAgIDEKKyNpZmRlZiBXSU5fOTVfTE9PSworI2RlZmluZSBTWVNNRVRSSUNTX0NYRExHRlJBTUUgICAgICAgICAyCisjZGVmaW5lIFNZU01FVFJJQ1NfQ1lETEdGUkFNRSAgICAgICAgIDIKKyNkZWZpbmUgU1lTTUVUUklDU19DWVZUSFVNQiAgICAgICAgICAxMworI2RlZmluZSBTWVNNRVRSSUNTX0NYSFRIVU1CICAgICAgICAgIDEzCisjZWxzZQogI2RlZmluZSBTWVNNRVRSSUNTX0NYRExHRlJBTUUgICAgICAgICA0CiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1lETEdGUkFNRSAgICAgICAgIDQKICNkZWZpbmUgU1lTTUVUUklDU19DWVZUSFVNQiAgICAgICAgICAxNgogI2RlZmluZSBTWVNNRVRSSUNTX0NYSFRIVU1CICAgICAgICAgIDE2CisjZW5kaWYKICNkZWZpbmUgU1lTTUVUUklDU19DWElDT04gICAgICAgICAgICAzMgogI2RlZmluZSBTWVNNRVRSSUNTX0NZSUNPTiAgICAgICAgICAgIDMyCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1hDVVJTT1IgICAgICAgICAgMzIKICNkZWZpbmUgU1lTTUVUUklDU19DWUNVUlNPUiAgICAgICAgICAzMgogI2RlZmluZSBTWVNNRVRSSUNTX0NZTUVOVSAgICAgICAgICAgIDE4CisjaWZkZWYgV0lOXzk1X0xPT0sKKyNkZWZpbmUgU1lTTUVUUklDU19DWVZTQ1JPTEwgICAgICAgICAxNAorI2RlZmluZSBTWVNNRVRSSUNTX0NYSFNDUk9MTCAgICAgICAgIDE0CisjZGVmaW5lIFNZU01FVFJJQ1NfQ1hNSU4gICAgICAgICAgICAxMTIKKyNkZWZpbmUgU1lTTUVUUklDU19DWU1JTiAgICAgICAgICAgICAyNworI2Vsc2UKICNkZWZpbmUgU1lTTUVUUklDU19DWVZTQ1JPTEwgICAgICAgICAxNgogI2RlZmluZSBTWVNNRVRSSUNTX0NYSFNDUk9MTCAgICAgICAgIDE2CiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1hNSU4gICAgICAgICAgICAxMDAKICNkZWZpbmUgU1lTTUVUUklDU19DWU1JTiAgICAgICAgICAgICAyOAorI2VuZGlmCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1hTSVpFICAgICAgICAgICAgMTgKICNkZWZpbmUgU1lTTUVUUklDU19DWVNJWkUgICAgICAgICAgICAxOAorI2lmZGVmIFdJTl85NV9MT09LCisjZGVmaW5lIFNZU01FVFJJQ1NfQ1hNSU5UUkFDSyAgICAgICAxMTIKKyNkZWZpbmUgU1lTTUVUUklDU19DWU1JTlRSQUNLICAgICAgICAyNworI2RlZmluZSBTWVNNRVRSSUNTX0NYSUNPTlNQQUNJTkcgICAgIDc1CisjZGVmaW5lIFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyAgICAgNzUKKyNlbHNlCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1hNSU5UUkFDSyAgICAgICAxMDAKICNkZWZpbmUgU1lTTUVUUklDU19DWU1JTlRSQUNLICAgICAgICAyOAogI2RlZmluZSBTWVNNRVRSSUNTX0NYSUNPTlNQQUNJTkcgICAgIDIwCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1lJQ09OU1BBQ0lORyAgICAgMjAKKyNlbmRpZgogCiAgIC8qIFNvbWUgbm9uLWNvbnN0YW50IHN5c3RlbSBtZXRyaWNzICovCiAjZGVmaW5lIFNZU01FVFJJQ1NfQ1hTQ1JFRU4gICAgICAgICAgICBzeXNNZXRyaWNzW1NNX0NYU0NSRUVOXQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS93aW5kb3dzLmggYi9pbmNsdWRlL3dpbmRvd3MuaAppbmRleCA2MWE3NjE4Li4xMDUyMzdmIDEwMDY0NAotLS0gYS9pbmNsdWRlL3dpbmRvd3MuaAorKysgYi9pbmNsdWRlL3dpbmRvd3MuaApAQCAtMjMxOCw2ICsyMzE4LDU2IEBACiAjZGVmaW5lIE1FVEFfQ1JFQVRFQklUTUFQICAgICAgICAgICAgMHgwNkZFCiAjZGVmaW5lIE1FVEFfQ1JFQVRFUkVHSU9OICAgICAgICAgICAgMHgwNkZGCiAKKy8qIERlYnVnZ2luZyBzdXBwb3J0IChERUJVRyBTWVNURU0gT05MWSkgKi8KK3R5cGVkZWYgc3RydWN0IHRhZ1dJTkRFQlVHSU5GTworeworICAgIFVJTlQgICAgZmxhZ3M7CisgICAgRFdPUkQgICBkd09wdGlvbnM7CisgICAgRFdPUkQgICBkd0ZpbHRlcjsKKyAgICBjaGFyICAgIGFjaEFsbG9jTW9kdWxlWzhdOworICAgIERXT1JEICAgZHdBbGxvY0JyZWFrOworICAgIERXT1JEICAgZHdBbGxvY0NvdW50OworfSBXSU5ERUJVR0lORk87Cit0eXBlZGVmIFdJTkRFQlVHSU5GTyBGQVIqIExQV0lOREVCVUdJTkZPOworCisvKiBXSU5ERUJVR0lORk8gZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lIFdESV9PUFRJT05TICAgICAgICAgMHgwMDAxCisjZGVmaW5lIFdESV9GSUxURVIgICAgICAgICAgMHgwMDAyCisjZGVmaW5lIFdESV9BTExPQ0JSRUFLICAgICAgMHgwMDA0CisKKy8qIGR3T3B0aW9ucyB2YWx1ZXMgKi8KKyNkZWZpbmUgREJPX0NIRUNLSEVBUCAgICAgICAweDAwMDEKKyNkZWZpbmUgREJPX0JVRkZFUkZJTEwgICAgICAweDAwMDQKKyNkZWZpbmUgREJPX0RJU0FCTEVHUFRSQVBQSU5HIDB4MDAxMAorI2RlZmluZSBEQk9fQ0hFQ0tGUkVFICAgICAgIDB4MDAyMAorCisjZGVmaW5lIERCT19TSUxFTlQgICAgICAgICAgMHg4MDAwCisKKyNkZWZpbmUgREJPX1RSQUNFQlJFQUsgICAgICAweDIwMDAKKyNkZWZpbmUgREJPX1dBUk5JTkdCUkVBSyAgICAweDEwMDAKKyNkZWZpbmUgREJPX05PRVJST1JCUkVBSyAgICAweDA4MDAKKyNkZWZpbmUgREJPX05PRkFUQUxCUkVBSyAgICAweDA0MDAKKyNkZWZpbmUgREJPX0lOVDNCUkVBSyAgICAgICAweDAxMDAKKworLyogRGVidWdPdXRwdXQgZmxhZ3MgdmFsdWVzICovCisjZGVmaW5lIERCRl9UUkFDRSAgICAgICAgICAgMHgwMDAwCisjZGVmaW5lIERCRl9XQVJOSU5HICAgICAgICAgMHg0MDAwCisjZGVmaW5lIERCRl9FUlJPUiAgICAgICAgICAgMHg4MDAwCisjZGVmaW5lIERCRl9GQVRBTCAgICAgICAgICAgMHhjMDAwCisKKy8qIGR3RmlsdGVyIHZhbHVlcyAqLworI2RlZmluZSBEQkZfS0VSTkVMICAgICAgICAgIDB4MTAwMAorI2RlZmluZSBEQkZfS1JOX01FTU1BTiAgICAgIDB4MDAwMQorI2RlZmluZSBEQkZfS1JOX0xPQURNT0RVTEUgIDB4MDAwMgorI2RlZmluZSBEQkZfS1JOX1NFR01FTlRMT0FEIDB4MDAwNAorI2RlZmluZSBEQkZfVVNFUiAgICAgICAgICAgIDB4MDgwMAorI2RlZmluZSBEQkZfR0RJICAgICAgICAgICAgIDB4MDQwMAorI2RlZmluZSBEQkZfTU1TWVNURU0gICAgICAgIDB4MDA0MAorI2RlZmluZSBEQkZfUEVOV0lOICAgICAgICAgIDB4MDAyMAorI2RlZmluZSBEQkZfQVBQTElDQVRJT04gICAgIDB4MDAwOAorI2RlZmluZSBEQkZfRFJJVkVSICAgICAgICAgIDB4MDAxMAorCisKICNpZm5kZWYgV0lORUxJQgogI3ByYWdtYSBwYWNrKDQpCiAjZW5kaWYKQEAgLTI0MzksNiArMjQ4OSw3IEBACiBGYShCT09MLFNldERlc2tXYWxsUGFwZXIsTFBTVFIsYSkKIEZhKEJPT0wsU2V0RXJyb3JNb2RlLFdPUkQsYSkKIEZhKEJPT0wsU2V0TWVzc2FnZVF1ZXVlLGludCxhKQorRmEoQk9PTCxTZXRXaW5EZWJ1Z0luZm8sTFBXSU5ERUJVR0lORk8sYSkKIEZhKEJPT0wsU3dhcE1vdXNlQnV0dG9uLEJPT0wsYSkKIEZhKEJPT0wsVHJhbnNsYXRlTWVzc2FnZSxMUE1TRyxhKQogRmEoQk9PTCxVbmhvb2tXaW5kb3dzSG9va0V4LEhIT09LLGEpCkBAIC0yNjIzLDYgKzI2NzQsNyBAQAogRmIoQk9PTCxHZXRUZXh0TWV0cmljcyxIREMsYSxMUFRFWFRNRVRSSUMsYikKIEZiKEJPT0wsR2V0Vmlld3BvcnRFeHRFeCxIREMsYSxMUFBPSU5ULGIpCiBGYihCT09MLEdldFZpZXdwb3J0T3JnRXgsSERDLGEsTFBQT0lOVCxiKQorRmIoQk9PTCxHZXRXaW5EZWJ1Z0luZm8sTFBXSU5ERUJVR0lORk8sYSxVSU5ULGIpCiBGYihCT09MLEdldFdpbmRvd0V4dEV4LEhEQyxhLExQUE9JTlQsYikKIEZiKEJPT0wsR2V0V2luZG93T3JnRXgsSERDLGEsTFBQT0lOVCxiKQogRmIoQk9PTCxHZXRXaW5kb3dQbGFjZW1lbnQsSFdORCxhLExQV0lORE9XUExBQ0VNRU5ULGIpCmRpZmYgLS1naXQgYS9pbmNsdWRlL3dpbnNvY2suaCBiL2luY2x1ZGUvd2luc29jay5oCmluZGV4IGEwNDUwYzIuLjYzZTkyYmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvd2luc29jay5oCisrKyBiL2luY2x1ZGUvd2luc29jay5oCkBAIC0xNzQsNyArMTc0LDcgQEAKICAqIGNvbXBhdGliaWxpdHkgcHVycG9zZXMuCiAgKi8KIAotI2RlZmluZSBoX2Vycm5vICAgICAgICAgV1NBR2V0TGFzdEVycm9yKCkKKy8qICNkZWZpbmUgaF9lcnJubyAgICAgICAgIFdTQUdldExhc3RFcnJvcigpICovCiAKIC8qIEF1dGhvcml0YXRpdmUgQW5zd2VyOiBIb3N0IG5vdCBmb3VuZCAqLwogI2RlZmluZSBXU0FIT1NUX05PVF9GT1VORCAgICAgICAoV1NBQkFTRUVSUisxMDAxKQpkaWZmIC0tZ2l0IGEvaXBjL0ltYWtlZmlsZSBiL2lwYy9JbWFrZWZpbGUKaW5kZXggY2Y1ZDZkZi4uZTllODJhMSAxMDA2NDQKLS0tIGEvaXBjL0ltYWtlZmlsZQorKysgYi9pcGMvSW1ha2VmaWxlCkBAIC0yLDMyICsyLDM2IEBACiAKIE1PRFVMRSA9IGlwYwogCi1URVNUX1NSQ1MgPSAgXAotICAgICAgICAgIHNobV9mcmFnbWVudF90ZXN0LmMgXAotICAgICAgICAgIGJpdF9hcnJheV90ZXN0LmNcCi0gICAgICAgICAgZGRlX3Byb2NfdGVzdC5jIFwKLSAgICAgICAgICBkZGVfYXRvbV90ZXN0LmMgXAotICAgICAgICAgIHNobV9zZW1hcGhfdGVzdC5jIFwKLSAgICAgICAgICB3aW5lX3Rlc3Rfc3R1Yi5jIFwKLSAgICAgICAgICBoYXNoX3Rlc3QuYyBcCi0gICAgICAgICAgZGRlX21lbV90ZXN0LmMgCi0KIFNSQ1MgPSAgICBiaXRfYXJyYXkuYyBcCi0JICBkZGVfYXRvbS5jICBcCi0JICBkZGVfbWVtLmMgXAogICAgICAgICAgIGRkZV9wcm9jLmMgIFwKLSAgICAgICAgICBnZW5lcmljX2hhc2guYyBcCi0gICAgICAgICAgc2htX2Jsb2NrLmMgXAotICAgICAgICAgIHNobV9mcmFnbWVudC5jIFwKICAgICAgICAgICBzaG1fbWFpbl9ibGsuYyBcCi0gICAgICAgICAgc2htX3NlbWFwaC5jCisJICBkZGVfYXRvbS5jICBcCisgICAgICAgICAgc2htX3NlbWFwaC5jIFwKKwkgIGRkZV9tZW0uYyBcCisgICAgICAgICAgc2htX2Jsb2NrLmMgXAorICAgICAgICAgIHNobV9mcmFnbWVudC5jCiAKIE9CSlMgPSAkKFNSQ1M6LmM9Lm8pCi1URVNUX09CSlMgPSAkKFRFU1RfU1JDUzouYz0ubykKKworU0hNX09CSj1zaG1fYmxvY2subyBzaG1fc2VtYXBoLm8gc2htX21haW5fYmxrLm8gZGRlX3Byb2MubyBcCisgICAgICAgICAgICAgICAJICAgZGRlX21lbS5vIGJpdF9hcnJheS5vIHNobV9mcmFnbWVudC5vIHdpbmVfdGVzdF9zdHViLm8KKwogCiBXaW5lUmVsb2NhdGFibGVUYXJnZXQoJChNT0RVTEUpLCwkKE9CSlMpKQorCiBEZXBlbmRUYXJnZXQoKQogCit0ZXN0czo6IGRkZV9tZW1fdGVzdCBkZGVfcHJvY190ZXN0IGRkZV9hdG9tX3Rlc3Qgc2htX2ZyYWdtZW50X3Rlc3QgXAorICAgICAgICBzaG1fc2VtYXBoX3Rlc3QKKworTm9ybWFsUHJvZ3JhbVRhcmdldChiaXRfYXJyYXlfdGVzdCwgYml0X2FycmF5Lm8gYml0X2FycmF5X3Rlc3QubywsLCkKK05vcm1hbFByb2dyYW1UYXJnZXQoc2htX3NlbWFwaF90ZXN0LCBzaG1fc2VtYXBoX3Rlc3QubyBzaG1fc2VtYXBoLm8sLCwpCitOb3JtYWxQcm9ncmFtVGFyZ2V0KHNobV9mcmFnbWVudF90ZXN0LCBzaG1fZnJhZ21lbnRfdGVzdC5vIHNobV9mcmFnbWVudC5vLCwsKQorTm9ybWFsUHJvZ3JhbVRhcmdldChkZGVfYXRvbV90ZXN0LCBkZGVfYXRvbV90ZXN0Lm8gZGRlX2F0b20ubyAkKFNITV9PQkopLCwsKQorTm9ybWFsUHJvZ3JhbVRhcmdldChkZGVfbWVtX3Rlc3QsIGRkZV9tZW1fdGVzdC5vICQoU0hNX09CSiksLCwpCitOb3JtYWxQcm9ncmFtVGFyZ2V0KGRkZV9wcm9jX3Rlc3QsIGRkZV9wcm9jX3Rlc3QubyAkKFNITV9PQkopICwsLCkKKworCiBpbmNsdWRlczo6CiAKIGluc3RhbGw6OgpkaWZmIC0tZ2l0IGEvaXBjL01ha2VmaWxlLmluIGIvaXBjL01ha2VmaWxlLmluCmluZGV4IGZkMmRmYWUuLjgxMWYyYjQgMTAwNjQ0Ci0tLSBhL2lwYy9NYWtlZmlsZS5pbgorKysgYi9pcGMvTWFrZWZpbGUuaW4KQEAgLTM1LDcgKzM1LDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9pcGMvUkVBRE1FIGIvaXBjL1JFQURNRQppbmRleCA2OTAzZjUzLi5jMDA0ZGU4IDEwMDY0NAotLS0gYS9pcGMvUkVBRE1FCisrKyBiL2lwYy9SRUFETUUKQEAgLTEsOCArMSwzNCBAQAotVGhpcyBpcyBhIHByZS1hbHBoYSBjb2RlLCBpdCBkb2VzIG5vdCB3b3JrIGZvciAxMDAlLAotYnV0IGl0IGRvZXMgbm90IGJyZWFrIGFueXRoaW5nIChJIGhvcGUpLgotUHJvcGVyIGRvY3VtZW50YXRpb24gKExhVGVYKSB3aWxsIGJlIHJlYWR5IGZvciB0aGUgbmV4dCByZWxlYXNlLgorICAgICAgICAgICAgICAgVGVjaG5pb24tIElzcmFlbCBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neQorICAgICAgICAgICAgICAgICBFbGVjdHJpY2FsIEVuZ2luZWVyaW5nIHNvZnR3YXJlIGxhYi4KIAotWW91IGNhbiB1c2UgImlwY2wiIHBlcmwgc2NyaXB0IHRvIHJlbW92ZSBqdW5rIElQQyBzdHVmZi4KLVlvdSBjYW4gdXNlICJpcGNzIiBzeXN0ZW0gcHJvZ3JhbSB0byBmaW5kIGp1bmsgSVBDIHN0dWZmLgogCi1NaWNoYWVsCisJCSAKKwlBdXRob3IgOiBNaWNoYWVsIFZla3NsZXIgMTE2NzgyMjMKKwkKKwlUdXRvcjogICBBdm5lciBMb3R0ZW0KKworCQorRERFIHN1cHBvcnQgZm9yIFdpbmUKKz09PT09PT09PT09PT09PT09PT09CisKK1dpbmUgZW11bGF0b3IgaXMgYWJsZSB0byBydW4gTVMtV2luZG93cyAzLjEgYXBwbGljYXRpb25zIHVuZGVyIExpbnV4CisoTGludXggaXMgYSBVTklYIGNsb25lKSAuIFdpbmUgaXMgYWxzbyBhIHRvb2xraXQgYWxsb3dpbmcgTVMtV2luZG93cworYXBwbGljYXRpb25zIHRvIGNvbXBpbGUgdW5kZXIgTGludXguIFdpbmUgaXMgYSB3b3JsZC13aWRlIEludGVybmV0Citwcm9qZWN0IHdpdGggbW9yZSB0aGFuIDIwIGRldmVsb3BlcnMuIFdpbmUgaXMgc3RpbGwgdW5kZXIgZGV2ZWxvcG1lbnQKK3NvIG1hbnkgdml0YWwgTVMtV2luZG93cyBmZWF0dXJlcyBhcmUgc3RpbGwgbWlzc2luZy4KKworRERFIGlzIER5bmFtaWMgRGF0YSBFeGNoYW5nZSB1c2VkIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gTVMtV2luZG93cworYXBwbGljYXRpb25zLiBUaGlzIHByb2plY3QgYWRkcyBEREUgY2FwYWJpbGl0aWVzIGludG8gV2luZS4gVGhlIG5ldworaW1wcm92ZWQgV2luZSB3aWxsIGJlIGFibGUgdG8gc2VuZCBtZXNzYWdlcyBhbmQgc2hhcmUgbWVtb3J5IGJldHdlZW4KK3R3byBkaWZmZXJlbnQgV2luZSBwcm9jZXNzZXMuCisKK1RoaXMgcHJvamVjdCB1c2VzIFN5c3RlbS1WIElQQyBtZWNoYW5pc21zIHRvIGltcGxlbWVudCBEREUuCisKK0Jlc2lkZXMgc2hhcmluZyBtZW1vcnkgaGFuZGxlcyBhbmQgc2VuZGluZyBEREUgbWVzc2FnZXMsIFdpbmUgcHJvY2Vzc2VzIAorYXJlIHN5bmNocm9uaXplIHRvIGVtdWxhdGVzIE1TLVdpbmRvd3Mgbm9uLXByZWVtcHRpdmUgdGFzayBzd2l0Y2hpbmcuCisoTVMtV2luZG93cyBzd2l0Y2hlcyB0YXNrcyBvbmx5IG9uIGdpdmVuIGluc3RydWN0aW9ucykuIFRoaXMgaXMgZG9uZQord2l0aG91dCBodXJ0aW5nIHRoZSBwZXJmb3JtYW5jZSBvciBzdGFiaWxpdHkgb2YgYSBzaW5nbGUgV2luZSBwcm9jZXNzLgorCitUaGUgcHJvamVjdCBhZGRzIERERSB0byBXaW5lIGVtdWxhdG9yIGFuZCB0byB0aGUgdG9vbGtpdC4gVGhpcyBhbGxvd3MKK29sZCBNUy1XaW5kb3dzIGFwcGxpY2F0aW9ucyB0byBiZSBjb21waWxlZCBmb3IgVU5JWCwgYW5kIGhhdmUgRERFCit3b3JraW5nIGFtb25nIHRoZW0uIApkaWZmIC0tZ2l0IGEvaXBjL2JpdF9hcnJheS5jIGIvaXBjL2JpdF9hcnJheS5jCmluZGV4IDE0ZDcyZTkuLjY4NzNjODIgMTAwNjQ0Ci0tLSBhL2lwYy9iaXRfYXJyYXkuYworKysgYi9pcGMvYml0X2FycmF5LmMKQEAgLTE0LDEzICsxNCwxNSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCiAKKyNpZmRlZiBDT05GSUdfSVBDCisKIC8qCiAqKiB1bmNvbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgdG8gZGlzYWJsZSBhc3NlcnRpb25zLAogKiogdGhpcyBtYXkgYm9vc3QgcGVyZm9ybWFuY2UgYnkgdXAgdG8gNTAlCiAqLwogLyogI2RlZmluZSBOREVCVUcgKi8KIAotI2lmbmRlZiBOT19BU00KKyNpZiBkZWZpbmVkKGxpbnV4KSAmJiAhZGVmaW5lZChOT19BU00pCiAjZGVmaW5lIEhBU19CSVRPUFMKICNlbmRpZgogCkBAIC0yNzUsMyArMjc3LDUgQEAKIAogICByZXR1cm4gYml0X25yOwogfQorCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KZGlmZiAtLWdpdCBhL2lwYy9kZGUudGV4IGIvaXBjL2RkZS50ZXgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZTFmZgotLS0gL2Rldi9udWxsCisrKyBiL2lwYy9kZGUudGV4CkBAIC0wLDAgKzEsOTYyIEBACislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorJSUKKyUlIFdyaXR0ZW4gYnkgTWljaGFlbCBWZWtzbGVyLgorJSUgTWF5IGJlIGZyZWVseSByZWRpc3RyaWJ1dGVkIGFzIGxvbmcgYXMgdGhpcyBoZWFkZXIgaXMgdW5jaGFuZ2VkLgorJSUgVGhlIGZpbGUgYmUgbW9kaWZpZWQgYXMgbG9uZyBhcyB0aGVyZSB3aWxsIGJlIGFwcHJvcHJpYXRlIGNvbW1lbnQKKyUlIGNvbnRhaW5pbmcgdGhlIEF1dGhvciBhbmQgYSBkZXNjcmlwdGlvbi4KKyUlCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorCitcZG9jdW1lbnRzdHlsZXthcnRpY2xlfQorXHJlbmV3Y29tbWFuZHtcdGhlcGFnZX17fQorXG5ld2NvbW1hbmR7XFdpbmV9e1dpbmV9CitcbmV3Y29tbWFuZHtcV0lORX17e1xlbSBXSU5kb3dzIEVtdWxhdG9yfX0KK1xuZXdjb21tYW5ke1xEREV9e3tcZW0gRHluYW1pYyBEYXRhIEV4Y2hhbmdlfX0KK1xuZXdjb21tYW5ke1x3aW5kb3p9e01TLVdpblwtZG93c30KK1xuZXdjb21tYW5ke1xmbmFtZX1bMV17e1x0dCAjMX19CitcbmV3Y29tbWFuZHtcbGlid2luZX17XGZuYW1le2xpYndpbmUuYX19CitcdGl0bGV7RERFXGZvb3Rub3Rle0RERSBpcyBcRERFXCBtZWNoYW5pc20gcHJvdmlkZWQgYnkgXHdpbmRvei4KKyAgICAoQXBwZW5kaXh+XHByb3RlY3RccmVme3NlYzpEREV9KS4KKyAgICB9CisgIFwgY2FwYWJpbGl0eSBmb3IgXFdpbmVcZm9vdG5vdGV7XFdpbmVcIChcV0lORSkgUnVucyBcd2luZG96XAorICAgIHByb2dyYW1zIHVuZGVyIFVOSVhcQC4gKEFwcGVuZGl4flxwcm90ZWN0XHJlZntzZWM6V2luZX0pLgorICAgIH0KK30KK1xhdXRob3J7TWljaGFlbCBWZWtzbGVyIDExNjc4MjIzfQorJSVcZGF0ZXtBdWcgNiwgMTk5NX0KK1xiZWdpbntkb2N1bWVudH0KK1xtYWtldGl0bGUKK1x2ZmlsbAorXGFic3RyYWN0e1xXaW5le30gcHJvdmlkZXMgYW4gZW52aXJvbm1lbnQgZm9yIHJ1bm5pbmcgb3IgY29tcGlsaW5nCisgIFx3aW5kb3p7fSBhcHBsaWNhdGlvbnMgZm9yIFVOSVggY2xvbmVzIChzdWNoIGFzIExpbnV4KS4KKyAgXFdpbmV7fSBpcyBub3QgeWV0IGZpbmlzaGVkIGFuZCBsYWNrcyBtYW55IGJhc2ljIGltcG9ydGFudCBmZWF0dXJlcy4KKyAgT25lIG9mIHRoZSBtaXNzaW5nIGZlYXR1cmVzIGlzIERERVxALiBEREUgaW1wbGVtZW50YXRpb24KKyAgKGVzcGVjaWFsbHkgZm9yIFxsaWJ3aW5lKSByZXF1aXJlcworICBVTklYIElQQ1xmb290bm90ZXtJUEMgLSBJbnRlci1Qcm9jZXNzIENvbW11bmljYXRpb259LiBUaGlzIFByb2plY3QKKyAgaW50cm9kdWNlcyB0aGUgSVBDIG1lY2hhbmlzbSBpbnRvIFxXaW5le30sIHRodXMgYWxsb3dpbmcgRERFIHRvIHdvcmsKKyAgYmV0d2VlbiBkaWZmZXJlbnQgXFdpbmV7fSBwcm9jZXNzZXMufQorCisKK1x2ZmlsbAore1xMQVJHRQorICBcYmVnaW57aXRlbWl6ZX0KKyAgICBcaXRlbVtJbnN0cnVjdG9yOl0gQXZuZXIgTG90dGVtCisgICAgXGl0ZW1bRG9uZSBmb3I6XSBUZWNobmlvbi0gSXNyYWVsIEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LFxcCisgICAgICBFbGVjdHJpY2FsIEVuZ2luZWVyaW5nIHNvZnR3YXJlIGxhYiRee1xtYm94e1xzbWFsbFxjb3B5cmlnaHR9fSQuCisgIFxlbmR7aXRlbWl6ZX0KKyAgfQorXHZmaWxsCisKK1xuZXdwYWdlCitccmVuZXdjb21tYW5ke1x0aGVwYWdlfXtccm9tYW57cGFnZX19Citcc2V0Y291bnRlcntwYWdlfXsxfQorXGJlZ2lue2NlbnRlcn0KKyAgICB7XExBUkdFIFRhYmxlIE9mIENvbnRlbnRzfQorXGVuZHtjZW50ZXJ9CitcdGFibGVvZmNvbnRlbnRzCisKK1xuZXdwYWdlCitccmVuZXdjb21tYW5ke1x0aGVwYWdlfXtcYXJhYmlje3BhZ2V9fQorXHNldGNvdW50ZXJ7cGFnZX17MX0KKworJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUKKyUlCislJSBlbmQgb2YgdGl0bGUKKyUlCislJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJQorXHNlY3Rpb257SW50cm9kdWN0aW9ufQorCitcc3Vic2VjdGlvbntUaGUgcHJvamVjdH0KK1RoZSBwdXJwb3NlIG9mIHRoZSBwcm9qZWN0IGlzIHRvIGFkZCBEREUgY2FwYWJpbGl0aWVzIGludG8gXFdpbmUuCitUaGUgcHJvamVjdCBlbmFibGVzIFxXaW5le30gRERFIGNsaWVudC1zZXJ2ZXIgYXBwbGljYXRpb25zIGNvbW11bmljYXRpb24uCitUaGlzIGludm9sdmVkIG1lc3NpbmcgYXJvdW5kIHdpdGg6CitcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0gXHdpbmRvelwgbWVzc2FnZSBtZWNoYW5pc20uCisgIFxpdGVtIFx3aW5kb3pcIG1lbW9yeSBtYW5hZ2VtZW50LgorICBcaXRlbSBcd2luZG96XCB0YXNrIG1hbmFnZW1lbnQuCisgIFxpdGVtIFVOSVggbWVzc2FnZXMgYW1vbmcgIFxXaW5lXCBwcm9jZXNzZXMuCisgIFxpdGVtIEV4Y2hhbmdpbmcgKHNoYXJpbmcpIFVOSVggbWVtb3J5LgorXGVuZHtpdGVtaXplfQorCitcc3Vic2VjdGlvbntQcm9ibGVtIGRlc2NyaXB0aW9ufQorRERFIGlzIGVzc2VudGlhbGx5IGEgY29tbXVuaWNhdGlvbiBwcm90b2NvbCBiZXR3ZWVuIFx3aW5kb3pcCit0YXNrcy4gSW1wbGVtZW50aW5nIHRoaXMgcHJvdG9jb2wgcmVxdWlyZXMgY29tbXVuaWNhdGlvbiBhbW9uZworXFdpbmV7fSBwcm9jZXNzZXMgYW5kIGFtb25nIHRhc2tzIGluIG9uZSBwcm9jZXNzIChlYWNoIFxXaW5le30gcHJvY2VzcworY2FuIGNvbnRhaW4gc2V2ZXJhbCB0YXNrcykuIFNpbmNlIFxXaW5lXCBhbHJlYWR5IHByb3ZpZGVzCitjb21tdW5pY2F0aW9uIGFtb25nIGludGVybmFsIHRhc2tzLCB0aGlzIHByb2plY3QgcHJvdmlkZXMgY29tbXVuaWNhdGlvbgorYmV0d2VlbiBcV2luZVwgcHJvY2Vzc2VzLiAKKworRGlmZmVyZW50IFxXaW5lXCBwcm9jZXNzZXMgc2hvdWxkIGJlIGFibGUgdG8gc2VuZCBcd2luZG96XCBtZXNzYWdlcworYW5kIHRvIHBhc3MgXHdpbmRvelwgbWVtb3J5IGhhbmRsZXMuIFRoZXJlIGFsc28gaGFzIHRvIGJlIGEKK3N5bmNocm9uaXphdGlvbiBtZWNoYW5pc20gYmV0d2VlbiB0aGUgcHJvY2Vzc2VzIChcd2luZG96XCBhcHBsaWNhdGlvbnMKK21ha2UgYXNzdW1wdGlvbnMgYWJvdXQgdGFzayBzd2l0Y2hpbmcgLSBhbmQgZG9uJ3QgdXNlIHNlbWFwaG9yZXMsIG9yCithbnkgXHdpbmRvelwgZXF1aXZhbGVudCkuCisKK1Bhc3NpbmcgbWVzc2FnZXMgaXMgYSBiaXQgdHJpY2t5LiBcd2luZG96XCBnaXZlcyBhIGZlZWRiYWNrIGFib3V0IHRoZQorc3VjY2VzcyBvZiBhIG1lc3NhZ2UgKGZhaWxzIGlmIHRoZSB3aW5kb3cgZG9lcyBub3QgZXhpc3QpLgorSW4gY2FzZSBvZiBTZW5kTWVzc2FnZSAoc2VlIEFwcGVuZGl4flxyZWZ7c2VjOldpbmRvek1zZ30pLCB0aGUgcHJvY2Vzcword2lsbCBoYXZlIHRvIGhhbHQgdW50aWwgdGhlIG1lc3NhZ2UgaGFzIGJlZW4gcHJvY2Vzc2VkLgorSW4gY2FzZSBvZiBQb3N0TWVzc2FnZSwgdGhpbmdzIGFyZSBzaW1wbGVyIC0gb25seSB0aGUgZXhpc3RlbmNlIG9mIHRoZQorcmVjaXBpZW50IGhhcyB0byBiZSBjaGVja2VkLgorCitcd2luZG96XCBzd2l0Y2hlcyB0YXNrcyBvbmx5IHdoZW4gY2VydGFpbiBzeXN0ZW0gY2FsbHMgYXJlIHVzZWQgKHN1Y2gKK2FzIGRlbGl2ZXJpbmcgb3IgcG9sbGluZyBtZXNzYWdlcykuIFx3aW5kb3pcIGFwcGxpY2F0aW9ucyByZWx5IG9uIHRoaXMKK2JlaGF2aW9yLiBUaGUgcHJvYmxlbSBhcmlzZXMgd2hlbiB0d28gYXBwbGljYXRpb25zIHJ1biBvbiBkaWZmZXJlbnQKK1xXaW5lXCBwcm9jZXNzZXMuIFNpbmNlIFVOSVggcHJlZW1wdHMgcHJvY2Vzc2VzIHRoZXJlIGlzIG5vIGd1YXJhbnR5Cit0aGF0IHRoZSBVTklYIHRhc2sgd2lsbCBvY2N1ciBhdCB0aGUgY29ycmVjdCBwbGFjZSAoaW4gcmVzcGVjdCBvZiB0aGUKK2FwcGxpY2F0aW9uKS4KK09uZSBvbmUgaGFuZCBpcyB0aGUgbmVlZCBmb3IgY29tcGF0aWJpbGl0eSAobm8gVU5JWCBgYGN1cnJlbnQnJworZXhlY3V0aW9uKSwgYW5kIG9uIHRoZSBvdGhlciBoYW5kIGlzIHBlcmZvcm1hbmNlIGFuZCBzdGFiaWxpdHkuCisKK0Fub3RoZXIgcHJvYmxlbSBpcyBwYXNzaW5nIGhhbmRsZXMgYmV0d2VlbiBcV2luZVwgcHJvY2Vzc2VzLiBcd2luZG96XAorYXBwbGljYXRpb25zIHBhc3MgYXRvbXNcZm9vdG5vdGV7U2VlIGFwcGVuZGl4flxyZWZ7c2VjOldoYXRBcmVBdG9tc319LAorbWVtb3J5IGhhbmRsZXMgYW5kIHdpbmRvdyBoYW5kbGVzLiBUaGVzZSBoYW5kbGVzIGhhdmUgdG8gYmUgYWxsb2NhdGVkCitnbG9iYWxseSAoaW4gc2hhcmVkIG1lbW9yeSkgb3IgdHJhbnNsYXRlZCBvbiB0aGUgZmx5LgorCisKK0lmIGEgcHJvY2VzcyBkaWVzIGZyb20gYGB1bm5hdHVyYWwgY2F1c2VzJycgKGUuZy5cIGtpbGwgJC05JCkuIEl0IHdpbGwKK2xlYXZlIGdhcmJhZ2UgaW4gbWVtb3J5IGFuZCBvdGhlciBJUEMgaGFuZGxlcyB3aWxsIHN0YXJ0IGZsb2F0aW5nCithcm91bmQuIFRoZXJlIHNob3VsZCBiZSBzb21lIHdheSB0byBjb2xsZWN0IHRoaXMgZ2FyYmFnZS4KKworXHN1YnNlY3Rpb257U29sdXRpb25zfQorXGxhYmVse3NlYzpQcm9qU29sdXRpb25zfQorXFdpbmVcIHVzZXMgU3lzLVYgSVBDIG1lY2hhbmlzbSAoU2VlCitBcHBlbmRpeH5ccmVme3NlYzpTeXNWLUlQQ30pLiBUaGlzIGFsbG93cyBzaGFyaW5nIGRhdGEgYW5kIHBhc3NpbmcKK2RhdGEgYmV0d2VlbiBwcm9jZXNzZXMgKFRoZSBhbHRlcm5hdGl2ZXMgYXJlIG5vdCB0aGF0IGdvb2QgaW4gdGhhdAorcmVzcGVjdCAtIHNlZSBBcHBlbmRpeH5ccmVme0RERS1BbHRlcm5hdGl2ZXN9KS4KK1RoZSBzaGFyZWQgZGF0YSBjb250YWlucyBvbmx5IGVzc2VudGlhbCBpbmZvcm1hdGlvbiAocGVyZm9ybWFuY2Ugb3IKK2NvbXBhdGliaWxpdHkpLiBUaGUgbWluaW11bSBpcyBrZXB0IG9uIHNoYXJlZCBtZW1vcnkgaW4gb3JkZXIgdG8gZ2V0CittYXhpbXVtIHN0YWJpbGl0eSAoXHdpbmRvelwgaXMga25vd24gYXMgYW4gdW5zdGFibGUgc3lzdGVtLCBcV2luZVwKK3Nob3VsZCBub3QgaW1pdGF0ZSBcd2luZG96XCBpbiB0aGlzIHJlc3BlY3QpLgorCitDb21tdW5pY2F0aW9ucyBhcmUgZG9uZSBieSBTeXMtViBtZXNzYWdlcyBhbmQgVU5JWCBzaWduYWxzIChhIHNpZ25hbAord2FrZXMgXFdpbmVcIHVwIGFuZCB0aGUgbWVzc2FnZSBwYXNzZXMgdGhlIGRhdGEpLiBTeXMtViBtZXNzYWdlcyBhcmUKK3VzZWQgZm9yIGNhcnJ5aW5nIFx3aW5kb3pcIG1lc3NhZ2VzLCBhcyB3ZWxsIGFzIHN5bmNocm9uaXphdGlvbgoraW5mb3JtYXRpb24uIFRoZXJlIGFyZSAzIHR5cGVzIG9mIG1lc3NhZ2VzOiBzZW50LCBwb3N0ZWQgYW5kIGFjay4KK0FjayBtZXNzYWdlIGlzIHVzZWQgZm9yIHN5bmNocm9uaXphdGlvbiBhcyB3ZWxsIGFzIGZvciByZXR1cm5pbmcgZXJyb3IKK2NvZGVzIChJbiBjYXNlIHNlbmRpbmcvcG9zdGluZyBtZXNzYWdlcyBmYWlsKS4gV2hlbiBhIG1lc3NhZ2UgaXMgc2VudCwKK3RoZSBzZW5kaW5nIHByb2Nlc3Mgd2lsbCBibG9jayB1bnRpbCBcV2luZSdzIHtcZW0gYWNrfXt9IG1lc3NhZ2UgaXMKK3JlY2VpdmVkLgorCitTeW5jaHJvbml6YXRpb24gYmV0d2VlbiBcV2luZVwgcHJvY2Vzc2VzIGlzIGRpdmlkZWQgaW50byAyIGNhdGVnb3JpZXMsCitpbiBib3RoIGNhc2VzIHRoZSBzZW5kZXIgb2YgYSBtZXNzYWdlIHdhaXRzIGZvciBhbiBhY2sgbWVzc2FnZToKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIFNlbnQgbWVzc2FnZXMgLSBXYWl0IHVudGlsIHRoZSByZWNpcGllbnQgZGVsaXZlcnMgYWNrIG1lc3NhZ2UuCisgICAgKFdoZW4gdGhlIHJlY2lwaWVudCBmaW5pc2hlZCBtZXNzYWdlIHByb2Nlc3NpbmcpIAorICBcaXRlbSBQb3N0ZWQgbWVzc2FnZSAtIFRoZSByZWNpcGllbnQgd2lsbCBzZW5kIGFjayBvbmx5IGR1cmluZworICAgIHRhc2sgc3dpdGNoaW5nIGluc3RydWN0aW9ucyAobGlrZSBQb3N0TWVzc2FnZSwgR2V0TWVzc2FnZSwgWWllbGQsCisgICAgZXRjLikuIFRoaXMgd2F5IG5vdGhpbmcgd2lsbCBiZSBkb25lIGFmdGVyIFBvc3RNZXNzYWdlIHVudGlsIGl0IGlzCisgICAgc2FmZS4gCitcZW5ke2VudW1lcmF0ZX0KKworVGhlcmUgaXMgbm8gcmVhbCBcV2luZVwgc2VydmVyLiBFdmVyeSBcV2luZVwgcHJvY2VzcyBoYXMgdG8gaGFuZGxlCitpdCdzIGVuZC4gVGhpcyBhcHByb2FjaCBzb21laG93IHJlc2VtYmxlcyBhIGRpc3RyaWJ1dGVkIE9TXEAuIFRoaXMKK2ludHJvZHVjZXMgc29tZSBwcm9ibGVtcyAoUmVzb3VyY2VzIG1pZ2h0IG5vdCBiZSBmcmVlZCBpbiBjYXNlIG9mIGEKK2NyYXNoKS4gT24gdGhlIG90aGVyIGhhbmQgdGhpcyBgYGRpc3RyaWJ1dGVkIE9TJycgYXBwcm9hY2ggc2ltcGxpZmllcworaW5zdGFsbGF0aW9uIGFuZCB1c2UsIGFuZCBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKworQXRvbXMgYXJlIHN0b3JlZCBvbiBzaGFyZWQgbWVtb3J5LCBzbyBldmVyeSB0d28gXFdpbmVcIHByb2Nlc3NlcyB3aWxsCitiZSBpbiBzeW5jIGluIHRoaXMgcmVzcGVjdCAoYXRvbSA1IHdpbGwgbWVhbiB0aGUgc2FtZSBvbiBib3RoCitwcm9jZXNzZXMpLiBTaGFyZWQgbWVtb3J5IGhhbmRsZXMgYXJlIHN0b3JlZCBvbiBzaGFyZWQgbWVtb3J5IGFzCit3ZWxsLiBTaGFyZWQgbWVtb3J5IGhhbmRsZXMgYXJlIG5vdCBmcm9tIHRoZSBzYW1lIHJhbmdlIGFzIGxvY2FsCittZW1vcnkgaGFuZGxlcyAoXHdpbmRvelwgcmVxdWlyZXMgYW4gcGxpY2F0aW9uIHRvIGRlY2xhcmUgYWJvdXQgaXQncworc2hhcmVkIG1lbW9yeSkuIFNpbmNlIGxvY2FsIG1lbW9yeSBoYW5kbGVzIGhhdmUgZGlmZmVyZW50IHJhbmdlIHRoZXkKK2NhbiBiZSBhbGxvY2F0ZWQgbG9jYWxseSAod2l0aG91dCBhbnkgc3luYyByZXF1aXJlbWVudHMgLSBoYW5kbGUgeCBtYXkKK2FwcGVhciBvbiAxMCBkaWZmZXJlbnQgXFdpbmVcIHByb2Nlc3NlcyBhbmQgYWRkcmVzcyBkaWZmZXJlbnQgZGF0YSkuCisKK1dpbmRvdyBoYW5kbGVzIGFyZSBhbGxvY2F0ZWQgbG9jYWxseS4gVGhpcyBhcHByb2FjaCBnaXZlcyBzdGFiaWxpdHksCitidXQgd2luZG93IGhhbmRsZXMgYXJlIG5vIGxvbmdlciB1bmlxdWUgKHNhbWUgaGFuZGxlIG1heSBhcHBlYXIKK29uIGRpZmZlcmVudCBwcm9jZXNzZXMpLiBUaGlzIHJlcXVpcmVzIG9uIHRoZSBmbHkgd2luZG93IGhhbmRsZQordHJhbnNsYXRpb24uIFdoZW4gYW4gXHdpbmRvelwgbWVzc2FnZSBpcyB0cmFuc2ZlcmVkLCBcV2luZVwgd2lsbAordHJhbnNsYXRlIGFueSBjb250YWluZWQgd2luZG93IGhhbmRsZS4gVGhlIHNlbmRlciB0cmFuc2xhdGVzIHRoZQoraGFuZGxlIHRvIGEgZ2xvYmFsICh1bmlxdWUpIGhhbmRsZSwgdGhlIHJlY2VpdmVyIHRyYW5zbGF0ZXMgdGhlIGdsb2JhbAoraGFuZGxlIHRvIHRoZSBsb2NhbCB3aW5kb3cgaGFuZGxlLgorCitDb2xsZWN0aW5nIHRoZSBnYXJiYWdlIG9mIGRlYWQgcHJvY2Vzc2VzIGlzIGRvbmUgaW4gdHdvIGNhc2VzOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gV2hlbiBzZXR0aW5nIHVwIGEgbmV3IFxXaW5lXCBwcm9jZXNzOiBJZiBubyBcV2luZVwgcHJvY2VzcyBpcworICAgIHJ1bm5pbmcgYW5kIHNoYXJlZCBtZW1vcnkgaXMgZmxvYXRpbmcgYXJvdW5kIGFsbCB0aGUgSVBDIHN0dWZmIGlzCisgICAgZGVsZXRlZC4gCisgIFxpdGVtIFdoZW4gc2VuZGluZyBhIG1lc3NhZ2U6IElmIHRoZSByZWNpcGllbnQgaXMgZGVhZCBpdCdzIElQQworICAgIGhhbmRsZXMgYXJlIGRlbGV0ZWQuCitcZW5ke2VudW1lcmF0ZX0KKworCisKK1xzZWN0aW9ue1RoZSBzb2Z0d2FyZX0KKworXHN1YnNlY3Rpb257RERFIHByb2plY3Qgc3RydWN0dXJlfQorT2xkIFxXaW5lXCBmdW5jdGlvbnMgY2FsbCB0aGUgbmV3IERERSBmdW5jdGlvbnMgd2hlbmV2ZXIgbmVlZGVkLgorKGUuZy5cIHdoZW4gc2VuZGluZyBhIERERSBtZXNzYWdlLCB0aGUgb3JpZ2luYWwgU2VuZE1lc3NhZ2UgZnVuY3Rpb24gY2FsbHMKK0RERVxfU2VuZE1lc3NhZ2UpLiBUaGlzIGFwcHJvYWNoIG1pbmltaXplcyBjaGFuZ2VzIHRvIG9yaWdpbmFsIFxXaW5le30KK2NvZGUuIFRoZSBuZXcgY29kZSB3YXMgd3JpdHRlbiBpbiBDLiBUaGUgbmV3IGNhcGFiaWxpdGllcyB3aGVyZSB3cml0dGVuCithcyBtdWNoIGFzIHBvc3NpYmxlIGluIE9PUFxmb290bm90ZXtPT1Agc3RhbmRzIGZvciBPYmplY3QgT3JpZW50ZWQKK1Byb2dyYW1taW5nfXt9IHN0eWxlLgorCitDdXJyZW50bHkgRERFIHVzZXMgU3lzLVYgSVBDIG1lY2hhbmlzbSwgZm9yIGl0J3Mgb3BlcmF0aW9uLgorCisKK1xwYXJhZ3JhcGh7TWFqb3IgT09QIG9iamVjdHMgYW5kIGZpbGVzOn0KKworXGJlZ2lue3RhYmxlfVtoXQorICAgIFxiZWdpbntjZW50ZXJ9CisgICAgICAgIFxsZWF2ZXZtb2RlCisgICAgICAgIFxiZWdpbnt0YWJ1bGFyfXt8bHxwezIwZW19fH0gXGhsaW5lCisgICAgICAgICAgICBPYmplY3QgICAgICAgICAgICYgRGVzY3JpcHRpb24gXFwgXGhsaW5lCisgICAgICAgICAgICBzaG1cX2Jsb2NrICAgICAgICYgc2hhcmVkIG1lbW9yeSBibG9jayBvcGVyYXRpb25zLiBcXAorICAgICAgICAgICAgc2htXF9tYWluXF9ibG9jayAmIChkZXJpdmVkIGZyb20gc2htXF9ibG9jay4pIFRoaW5ncyBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEREUgYXBwbGljYXRpb25zIG5lZWQgYWNjZXNzIHRvLiBcXAorICAgICAgICAgICAgc2htXF9mcmFnbWVudCAgICAmIEFsbG9jYXRpb24gb2YgaW4tYmxvY2sgZnJhZ21lbnRzLiBcXAorICAgICAgICAgICAgc2htXF9zZW1hcGggICAgICAmIFNlbWFwaG9yZSBvcGVyYXRpb25zLiBcXAorICAgICAgICAgICAgZGRlXF9wcm9jICAgICAgICAmIFByb2Nlc3MgYW5kIERERSBtZXNzYWdlIGhhbmRsaW5nLiBcXAorICAgICAgICAgICAgZGRlXF9tZW0gICAgICAgICAmIEZyb250IGVuZCBvZiBEREUgbWVtb3J5IGhhbmRsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEludGVyZmFjZSBvZiBEREUgdG8gb3V0ZXIgd29ybGQpLiBcXAorICAgICAgICAgICAgZGRlXF9hdG9tICAgICAgICAmIEhhbmRsaW5nIGdsb2JhbCBhdG9tcy4gXFwgCisgICAgICAgICAgICBiaXRcX2FycmF5ICAgICAgICYgQXJyYXkgb2YgYml0cy4gSXQgaGFzIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbnMsIHNvIGJpdHMgY2FuIGJlIHVzZWQgaW5zdGVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHNlbWFwaG9yZXMuIFxcIFxobGluZQorICAgICAgICBcZW5ke3RhYnVsYXJ9CisgICAgICAgIFxjYXB0aW9ue09iamVjdHMgY29uc3RydWN0aW5nIHRoZSBEREUgZXh0ZW5zaW9uLn0KKyAgICAgICAgXGxhYmVse3RhYjpPYmpMaXN0fQorICAgIFxlbmR7Y2VudGVyfQorXGVuZHt0YWJsZX0KKworVGFibGV+XHJlZnt0YWI6T2JqTGlzdH17fSBsaXN0cyB0aGUgb2JqZWN0cyB1c2VkIGluIHRoZSBEREUgY29kZS4KK1RoZSBmb2xsb3dpbmcgcnVsZXMgYXBwbHkgdG8gb2JqZWN0czoKKworXGJlZ2lue2l0ZW1pemV9IAorICBcaXRlbSBPYmplY3QgbmFtZXMgdGhhdCBiZWdpbiB3aXRoIHtcZW0gZGRlXF8kXGNkb3RzJH17fSBhcmUgdGhlIGZyb250CisgICAgZW5kLiBUaGVzZSBvYmplY3RzIGFyZSB3b3JraW5nIGRpcmVjdGx5IHdpdGggdGhlIHJlc3Qgb2YKKyAgICBcV2luZS4gT2JqZWN0cyB0aGF0IHN0YXJ0IHdpdGgge1xlbSBzaG1cXyRcY2RvdHMkfXt9IGFyZSB0aGUgYmFjaworICAgIGVuZC4gVGhlc2Ugb2JqZWN0cyBwcm92aWRlIHNlcnZpY2VzIGZvciB0aGUgcmVzdCBvZiB0aGUKKyAgICBpbXBsZW1lbnRhdGlvbi4gCisgIFxpdGVtIFRoZSBvYmplY3RzIGFyZSBzdG9yZWQgaW4gZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9iamVjdC4KKyAgICAoZS5nLlwgZGRlXF9tZW0gaXMgc3RvcmVkIGluIGRkZVxfbWVtLmMgYW5kIGRkZVxfbWVtLmgpLgorICBcaXRlbSBGb3IgZWFjaCBvYmplY3QgdGhlcmUgaXMgYSB0ZXN0IGZpbGUgKHRoYXQgcGFydGlhbGx5IHRlc3RzIGl0KS4KKyAgICBUaGUgbmFtZSBvZiB0aGlzIGZpbGUgaXMgb2JqZWN0J3MgbmFtZSB3aXRoIHRoZSB3b3JkIGBgdGVzdCcnCisgICAgKGUuZy5cIGRkZVxfbWVtIG9iamVjdCBoYXMgZGRlXF9tZW1cX3Rlc3QuYykuCisgIFxpdGVtIGRkZS5oIGZpbGUgaGFzIGRlY2xhcmF0aW9ucyB1c2VkIGJ5IGRkZVxfcHJvYyBhbmQgZXh0ZXJuYWwgRERFCisgICAgdXNlcnMuCitcZW5ke2l0ZW1pemV9CisgICAgCisKK1xzdWJzZWN0aW9ue01ham9yIGFsZ29yaXRobXN9CisKK1xwYXJhZ3JhcGh7RGVsaXZlcmluZyBtZXNzYWdlczp9CitcbGFiZWx7c2VjOkRlbGl2ZXJpbmdNZXNzYWdlc30KK1x3aW5kb3pcIG1lc3NhZ2VzIGFyZSBwYXNzZWQgdXNpbmcgU3lzLVYgSVBDIG1lc3NhZ2VzLiBQcm9jZXNzaW5nCitzdGFydHMgd2l0aCBTZW5kTWVzc2FnZSgpIG9yIFBvc3RNZXNzYWdlKCkgXHdpbmRvelwgc3lzdGVtCitmdW5jdGlvbnM6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBTZW5kTWVzc2FnZSBhbmQgUG9zdE1lc3NhZ2UgY2FsbCB0aGUgRERFIGZ1bmN0aW9ucyAoc2FtZSBuYW1lcworICAgIHByZWZpeGVkIHdpdGggRERFXF8pLiBJZiB0aGUgRERFIGZ1bmN0aW9ucyBwYXNzLCBkb24ndCBnbyBhbnkKKyAgICBmdXJ0aGVyLiBJZiBpdCBmYWlscyB0cnkgdG8gcHJvY2VzcyB0aGUgbWVzc2FnZSBpbiB0aGUKKyAgICBjb252ZW50aW9uYWwgd2F5LiAKKyAgXGl0ZW0gVGhlIERERSBtZXNzYWdlIGZ1bmN0aW9ucyBjYWxsIERERVxfRG9NZXNzYWdlLCB3aGljaCBpcworICAgIHRoZSBtYWluIERERSBtZXNzYWdlIHByb2Nlc3NpbmcgZnVuY3Rpb24uIEZyb20gbm93IG9uIHRoZXJlIGlzIG5vCisgICAgZGlmZmVyZW5jZSBiZXR3ZWVuIHNlbmRpbmcgYW5kIHBvc3RpbmcgbWVzc2FnZXMgKGZyb20gaW5pdGlhdG9yJ3MKKyAgICBwb2ludCBvZiB2aWV3KS4KKyAgXGl0ZW0gSWYgdGhlIG1lc3NhZ2UgaXMgbm90IGEgRERFIG1lc3NhZ2Ugb3IgdGhlIHJlY2lwaWVudCBpcyBub3QKKyAgICByZW1vdGUsIGZhaWwgYW5kIHJldHVybiB0byBvcmlnaW5hbCBtZXNzYWdlIGZ1bmN0aW9ucy4KKyAgXGl0ZW0gQnJpbmcgdGhlIG1lc3NhZ2UgdG8gYSBmb3JtYXQgc3VpdGFibGUgZm9yIElQQyBkZWxpdmVyeS4gVGhlCisgICAgZm9ybWF0IGluY2x1ZGVzOgorICAgIFxiZWdpbntpdGVtaXplfQorICAgICAgXGl0ZW0gbWVzc2FnZSB0eXBlIChzZW50IG9yIHBvc3RlZCkuCisgICAgICBcaXRlbSBTZW5kZXIgd2luZG93IGhhbmRsZSAodHJhbnNsYXRlZCB0byBnbG9iYWwgd2luZG93IGlkLikKKyAgICAgIFxpdGVtIE90aGVyIG1lc3NhZ2UgaW5ncmVkaWVudHMgKG1zZywgbFBhcmFtKS4KKyAgICBcZW5ke2l0ZW1pemV9CisgIFxpdGVtIERlbGl2ZXIgdGhlIG1lc3NhZ2UgdG8gZXZlcnkgcmVjaXBpZW50cyB1c2luZworICAgIERERVxfRG9PbmVNZXNzYWdlLiBUaGVyZSBtaWdodCBiZSBtYW55IHJlY2lwaWVudHMgaW4gY2FzZSBvZiBhCisgICAgYnJvYWRjYXN0ICh3aGVuIHRoZSBgYHJlY2lwaWVudCcnIHdpbmRvdyBpcyAtMSkuIAorICBcaXRlbSBEREVcX0RvT25lTWVzc2FnZSBkZWxpdmVycyB0aGUgbWVzc2FnZSBhbmQgd2FpdHMgZm9yIHJlc3BvbnNlLgorICAgIEZhaWwgaWYgdGltZW91dCBpcyByZWFjaGVkLgorXGVuZHtlbnVtZXJhdGV9CisKKworXHBhcmFncmFwaHtSZWNlaXZpbmcgbWVzc2FnZXM6fQorTWVzc2FnZXMgZnJvbSBvdGhlciBcV2luZVwgcHJvY2Vzc2VzIGFyZSByZWNlaXZlZC4gUHJvY2Vzc2luZyBzdGFydAorZnJvbSBEREVcX0dldFJlbW90ZU1lc3NhZ2UoKToKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIERERVxfR2V0UmVtb3RlTWVzc2FnZSBpcyBjYWxsZWQgd2hlbmV2ZXIgd2luZSBpcyBnb2luZyB0byB3YWl0CisgICAgb3IgcmVjZWl2ZSBYLXdpbmRvd3MgbWVzc2FnZS4gSWYgd2luZSBpcyBzbGVlcGluZyAod2FpdGluZyBmb3IgWCksCisgICAgaXQgd2lsbCB3YWtlbiBieSBhIFNJR1VTUjIgc2lnbmFsLiBJbiB0aGlzIGNhc2UgdGhlIGhhbmRsZXIgd2lsbAorICAgIHNpZ2xvbmdqbXAoKSBvdXQgb2YgdGhlIHNlbGVjdCgpIGZ1bmN0aW9uLgorICBcaXRlbSBJZiBubyByZW1vdGUgbWVzc2FnZSBpcyBwZW5kaW5nIGluIHRoZSBtZXNzYWdlIHF1ZXVlIC0gZXhpdC4KKyAgICAoU3lzLVYgbWVzc2FnZSBxdWV1ZSBob2xkcyB0aGUgcmVtb3RlIG1lc3NhZ2VzIHVudGlsIHRoZXkgYXJlCisgICAgcmVhZCkuCisgIFxpdGVtIElmIHRoZSBtZXNzYWdlIGlzIGJyb2FkY2FzdGVkLCBnb3RvIHN0YWdlflxyZWZ7QnJvYWRjYXN0QWxnb30uCisgIFxpdGVtIFRyYW5zbGF0ZSB0aGUgZ2xvYmFsIHdpbmRvdyBoYW5kbGUgb2YgdGhlIHJlY2lwaWVudCB0byBsb2NhbAorICAgIGhhbmRsZS4gCisgIFxpdGVtIERvIHRoaXMgaWYgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQuIFNlbmQgdGhlIG1lc3NhZ2UgdG8gdGhlCisgICAgcmVjaXBpZW50IHdpbmRvdy4gUmVwbHkgd2l0aCBhY2sgdG8gdGhlIHNlbmRlci4gKFJlcGx5IHdpdGggdGhlCisgICAgcmV0dXJuIGNvZGUgb2YgdGhlIFNlbmRNZXNzYWdlIGZ1bmN0aW9uKS4ge1xlbSBcYmYgUmV0dXJufVwgd2l0aAorICAgIHBvc2l0aXZlIHJldHVybiB2YWx1ZS4KKyAgXGl0ZW0gUG9zdCB0aGUgbWVzc2FnZS4KKyAgXGl0ZW0gSWYgUG9zdE1lc3NhZ2UgZmFpbHMgLSBzZW5kIGZhaWxpbmcgYWNrIG1lc3NhZ2UuIAorICBcaXRlbSBJZiBQb3N0TWVzc2FnZSBwYXNzZXMsIGFkZCB0aGUgbWVzc2FnZSBkYXRhIGludG8gYSBGSUZPXEAuIFRoaXMKKyAgICBGSUZPIGNvbnRhaW5zIGFsbCBtZXNzYWdlcyB0aGF0IGhhdmUgdG8gYmUgYWNrbm93bGVkZ2VkICh3aG8ncworICAgIHNlbmRlciBpcyB3YWl0aW5nIGZvciBhY2spLiBXaGVuZXZlciBpbnRlcm5hbCB0YXNrIHN3aXRjaCBvY2N1cnMsCisgICAgYSBpdGVtIGZyb20gdGhpcyBGSUZPIGlzIHBvcHBlZCBvdXQgYW5kIGFuIGFjayBtZXNzYWdlIGlzIHNlbnQuICAKKyAgXGl0ZW0gXGxhYmVse0Jyb2FkY2FzdEFsZ299IEl0ZXJhdGUgdGhyb3VnaCB0aGUgbG9jYWwgd2luZG93cyBhbmQKKyAgICBkZWxpdmVyIHRoZSBtZXNzYWdlIHRvIGV2ZXJ5IG9uZSBvZiB0aGVtLgorICBcaXRlbSBTZW5kIGEgcG9zaXRpdmUgYWNrIG1lc3NhZ2UuCitcZW5ke2VudW1lcmF0ZX0KKworXHBhcmFncmFwaHtBbGxvY2F0aW5nIG1lbW9yeTp9CitTaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24gaXMgZGl2aWRlZCBpbnRvIHR3byBjYXRlZ29yaWVzOiBpbnRlcm5hbCB3aW5lCithbmQgXHdpbmRvelwgYXBwbGljYXRpb24uIFRoZSBtZW1vcnkgdXNlZCBieSBcd2luZG96XCBhcHBsaWNhdGlvbnMgaXMKK2FsbG9jYXRlZCBpbiB0d28gcGhhc2VzIC0gYWxsb2NhdGUgaW50ZXJuYWwgd2luZSwgYW5kIHRoZW4gcHJlcGFyZSBhbGwKK3RoZSBzdHVmZiBuZWVkZWQgYnkgXHdpbmRvei4KKworVGhlIGludGVybmFsIGFsbG9jYXRpb24gKERERVxfbWFsbG9jKToKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIFRyeSB0byBhbGxvY2F0ZSBiaWcgZW5vdWdoIG1lbW9yeSBmcmFnbWVudCBpbiBhbGxvY2F0ZWQgc2hhcmVkCisgICAgbWVtb3J5LiAKKyAgXGl0ZW0gSWYgZnJhZ21lbnQgY291bGQgbm90IGJlIGFsbG9jYXRlZCwgYWxsb2NhdGUgYSBuZXcgc2hhcmVkCisgICAgbWVtb3J5IGJsb2NrLiBBbGxvY2F0ZSB0aGUgbWVtb3J5IGZyYWdtZW50LgorICBcaXRlbSBBbGxvY2F0ZSBhIHNoYXJlZCBtZW1vcnkgaGFuZGxlIChjYWxsIHRoZSBkZGVcX2FsbG9jXF9oYW5kbGUoKSAKKyAgICBmdW5jdGlvbikuIFRoZSBhbGxvY2F0ZWQgaGFuZGxlIGlzIGZyb20gYSByYW5nZSB1c2VkIG9ubHkgYnkKKyAgICBzaGFyZWQgbWVtb3J5IGhhbmRsZXMuIFRoaXMgYWxsb2NhdGlvbiBmdW5jdGlvbiBpcyB1c2VkIG9ubHkgZm9yCisgICAgc2hhcmVkIERERSBtZW1vcnkuCisgIFxpdGVtIFdyaXRlIHRoZSBoYW5kbGUgaW4gdGhlIGRhdGEgc3RydWN0dXJlLiBBbHNvIHdyaXRlIHRoZQorICAgIHJlbGF0aXZlIGxvY2F0aW9uIG9mIHRoaXMgaGFuZGxlIChQb2ludGVyIGxvY2F0aW9uIGlzIHVzZWxlc3Mgc2luY2UKKyAgICBpdCBkaWZmZXJzIGZyb20gb25lIFxXaW5lXCBwcm9jZXNzIHRvIGFub3RoZXIpLgorICAgIFRoaXMgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBpbiB0aGUgbWFpbiBzaGFyZWQgbWVtb3J5IGJsb2NrLiAgICAKK1xlbmR7ZW51bWVyYXRlfQorV2hlbiBhIGZyYWdtZW50IGlzIGFsbG9jYXRlZCwgaXQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIGZyZWUKK21lbW9yeS4KKworQWxsb2NhdGlvbiBmb3IgXHdpbmRvelwgYXBwbGljYXRpb25zICh0aGlzIGlzIGRvbmUgaW4gR2xvYmFsQWxsb2MpOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gRG8gdGhlIGludGVybmFsIGFsbG9jYXRpb24gKGluc3RlYWQgb2YgbWFsbG9jIGluIHRoZSBsb2NhbAorICAgIGFsbG9jYXRpb24pLiAKKyAgXGl0ZW0gRXZlcnl0aGluZyBlbHNlIGlzIHRoZSBzYW1lIGFzIHdpdGggbG9jYWwgbWVtb3J5LiBBIHNlZ21lbnQgaXMKKyAgICBhbGxvY2F0ZWQgZm9yIHRoZSBuZXcgbWVtb3J5LCBhbmQgaXQncyBkYXRhIGlzIGtlcHQgaW4gdGhlIGRhdGEKKyAgICBzdHJ1Y3R1cmUuIAorXGVuZHtlbnVtZXJhdGV9CisKKworXHBhcmFncmFwaHtBdG9tczp9CitBdG9tcyBoYXZlIHByZXR0eSBzaW1wbGUgYWxnb3JpdGhtcyBvcGVyYXRpbmcgb24gdGhlbS4gU2luY2UgYXRvbXMgYXJlCitzdXBwb3NlZCB0byBnaXZlIGEgdW5pcXVlIG51bWJlciBmb3IgZWFjaCBzdHJpbmcgLSBhdG9tcyBhcmUKK2ltcGxlbWVudGVkIGFzIGhhc2ggdGFibGVzLiBUaGUgaWQgb2YgdGhlIGF0b20gaXMgdGhlIGVudHJ5IGluIHRoZQoraGFzaCB0YWJsZS4gVGhlIGRpc2FkdmFudGFnZSBvZiB0aGlzIGFwcHJvYWNoIGlzIHRoYXQgdGhlcmUgaXMgYSBsaW1pdAorb24gdGhlIG51bWJlciBvZiBhdG9tcywgdGhlIGJpZyBhZHZhbnRhZ2VzIGFyZSBzaW1wbGljaXR5IGFuZAorc3BlZWQuCisKK1NpbmNlIGltcGxlbWVudGluZyBhIGhhc2ggdGFibGVzIGlzIHN0cmFpdCBmb3J3YXJkLCBJIHdpbGwgbm90CitkaXNjdXNzIGl0IGluIGRlcHRoLiBUaGlzIGhhc2ggdGFibGUgaGFzIHR3byBoYXNoIGZ1bmN0aW9ucyAtIHByaW1hcnkKK2FuZCBzZWNvbmRhcnkuIFdoZW4gc2VhcmNoaW5nIGZvciBhbiBpdGVtIChmb3IgZGVsZXRpb24sIGFkZGl0aW9uLCBvcgorYSBzZWVrKSB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSB0YWtlbjoKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIFRoZSBwcmltYXJ5IGhhc2ggZnVuY3Rpb24gcmV0dXJucyB0aGUgZmlyc3QgZW50cnkuCisgIFxpdGVtIFxsYWJlbHtBdG9tSGFzaExvb3B9CisgICAgSWYgdGhlIGVudHJ5IGlzIGVtcHR5IG9yIG5vIHVuY2hlY2tlZCBlbnRyaWVzIHtcYmYgXGVtIGZhaWx9LgorICBcaXRlbSBJZiB0aGUgZW50cnkgaXMgY29ycmVjdCwge1xiZiBcZW0gc3VjY2VzcyEhIX0uCisgIFxpdGVtIEFkZCB0aGUgcmVzdWx0IG9mIHNlY29uZGFyeSBoYXNoIGZ1bmN0aW9uIHRvIHRoZSBpdGVtIGluZGV4LgorICBcaXRlbSBHb3RvIHN0ZXB+XHJlZntBdG9tSGFzaExvb3B9LgorXGVuZHtlbnVtZXJhdGV9CisKKworXHN1YnNlY3Rpb257TWFqb3IgZGF0YSBzdHJ1Y3R1cmVzfQorVGhlcmUgYXJlIHR3byBraW5kcyBvZiBkYXRhIHN0cnVjdHVyZSwgbG9jYWwgYW5kIHNoYXJlZC4gVGhlIGxvY2FsCitkYXRhIHN0cnVjdHVyZXMgYXJlIHN0cmFpdCBmb3J3YXJkIGFuZCB3aWxsIG5vdCBiZSBkaXNjdXNzZWQgaW4KK2RldGFpbC4KKworVGhlIHNoYXJlZCBkYXRhIHN0cnVjdHVyZXMgaGF2ZSBmb3VyIGxldmVsIGhpZXJhcmNoeS4gRWFjaCBsZXZlbAorZGVwZW5kIG9uIHRoZSBvdGhlciBhbmQgY2FuIG5vdCBleGlzdCB3aXRob3V0IGl0LiBNb3N0IHN0cnVjdHVyZXMgaGF2ZQorbXVjaCBsZXNzIHRoYW4gZm91ciBsZXZlbHMuCisKK1xwYXJhZ3JhcGh7TGV2ZWwgb25lIGRhdGEgc3RydWN0dXJlIC0gdGhlIG1haW4gYmxvY2s6fQorVGhpcyBkYXRhIHN0cnVjdHVyZSBpcyBwYXJ0IG9mIHRoZSBzaG1cX21haW5cX2Jsb2NrIG9iamVjdC4gSXQKK2NvbnRhaW5zIGVzc2VudGlhbCBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgYWxsIFxXaW5lXCBwcm9jZXNzZXMuIDogCitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBTZW1hcGhvcmUgaWRlbnRpZmllciB1c2VkIGZvciBsb2NraW5nIHRoZSBkYXRhIHN0cnVjdHVyZS4KKyAgXGl0ZW0gQSB0YWJsZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IFxXaW5lXCBwcm9jZXNzZXMuCisgIFxpdGVtIFJlbGF0aXZlIHBvaW50ZXJzIHRvIGF0b21zLgorICBcaXRlbSBBIHRhYmxlIGNvbnRhaW5pbmcgd2luZG93IGluZm9ybWF0aW9uLgorICBcaXRlbSBUYWJsZXMgd2l0aCBnbG9iYWwgbWVtb3J5IGhhbmRsZXMuCitcZW5ke2VudW1lcmF0ZX0KKworVGhlIGZpcnN0IGxldmVsIGlzIGFsbG9jYXRlZCBhbmQgaW5pdGlhbGl6ZWQgd2hlbiBcV2luZVwgY2FsbHMgYSBEREUKK2Z1bmN0aW9uIHRoZSBmaXJzdCB0aW1lLiBEREUgZnVuY3Rpb25zIGFyZTogZ2xvYmFsIG1lbW9yeSBhbGxvY2F0aW9uLAorZ2xvYmFsIGF0b21zIG9yIERERSBtZXNzYWdlcy4gCisKK1RoZSBmaXJzdCBsZXZlbCBkYXRhIHN0cnVjdHVyZSBjb250YWlucyB0aGUgc2Vjb25kIGxldmVsIGRhdGEKK3N0cnVjdHVyZS4gCisKKworXHBhcmFncmFwaHtBdG9tIGVsZW1lbnQgKGxldmVsIHR3byk6fQorRWFjaCBlbGVtZW50IGlzIGFsbG9jYXRlZCBkeW5hbWljYWxseSAodGhlIHNpemUgb2YgdGhlIHN0cmluZyBpcwordW5rbm93bikuIFRoZSBhbGxvY2F0aW9uIGlzIGdhaW5lZCBmcm9tIHRoZSBzaG1cX2ZyYWdtZW50IG9iamVjdCAoZWFjaAorYXRvbSBpcyBhbiBpbnN0YW5jZSBvZiB0aGF0IG9iamVjdCkuIEVhY2ggYXRvbSBjb250YWluczoKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIENvdW50IG9mIGxpbmtzLiBFYWNoIGFsbG9jYXRpb24gb2YgdGhlIGF0b20gZXN0YWJsaXNoZXMgYSBuZXcKKyAgICBsaW5rIGFuZCBlYWNoIGRlYWxsb2NhdGlvbiBkZWxldGVzIG9uZSBsaW5rICh1bnRpbCBhbGwgbGlua3MgYXJlCisgICAgcmVtb3ZlZCkuIAorICBcaXRlbSBUaGUgc3RyaW5nIG9mIHRoZSBhdG9tLiBUaGUgc3RyaW5nIGVuZHMgd2l0aCBhIG51bGwgY2hhcmFjdGVyLgorXGVuZHtlbnVtZXJhdGV9CisKK1xwYXJhZ3JhcGh7V2luZSBwcm9jZXNzZXMgZGF0YSAobGV2ZWwgdHdvKTp9CisocGFydCBvZiB0aGUgZGRlXF9wcm9jIG9iamVjdCkgOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gcGlkIChcV2luZVwgcHJvY2VzcyBpZCkuCisgIFxpdGVtIE1lc3NhZ2UgcXVldWUgaWQuCisgIFxpdGVtIFNlbWFwaG9yZSB1c2VkIGZvciBsb2NraW5nIHByb2Nlc3MncyBkYXRhIHN0cnVjdHVyZS4KKyAgXGl0ZW0gU3lzLVYgc2hhcmVkIG1lbW9yeSBpZCBvZiB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIGNoYWluIG9mCisgICAgcHJvY2VzcydzIGJsb2Nrcy4KK1xlbmR7ZW51bWVyYXRlfQorCisKK1xwYXJhZ3JhcGh7V2luZG93IGluZm9ybWF0aW9uIChsZXZlbCB0d28pOn0KK1RoaXMgaXMgcGFydCBvZiB0aGUgZGRlXF9wcm9jIG9iamVjdC4gVGhlIGluZGV4IG9mIGFycmF5IGVudHJ5CitzcGVjaWZpZXMgdGhlIHdpbmRvdyBoYW5kbGUuIEVhY2ggZW50cnkgY29udGFpbnM6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBUaGUgcHJvY2VzcyBpbmRleCBvZiB0aGUgXFdpbmVcIHByb2Nlc3MgcnVubmluZyB0aGlzIHdpbmRvdy4KKyAgXGl0ZW0gVGhlIGxvY2FsIHdpbmRvdyBoYW5kbGUgb2YgdGhpcyB3aW5kb3cgKHJlbWVtYmVyIHRoYXQgZWFjaCBEREUKKyAgICB3aW5kb3cgaGFzIGRpZmZlcmVudCBnbG9iYWwgYW5kIGxvY2FsIGhhbmRsZXMpLgorXGVuZHtlbnVtZXJhdGV9CisKKworXHBhcmFncmFwaHtHbG9iYWwgbWVtb3J5IGhhbmRsZXMgKExldmVsIHR3byk6fQorKHBhcnQgb2YgYml0XF9hcnJheSBhbmQgZGRlXF9tZW0gb2JqZWN0cyk6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBBIGJpdCBhcnJheSBjb250YWlucyAnMScgaW4gZXZlcnkgZW50cnkgdGhhdCByZWZlcnMgdG8KKyAgICB1c2VkIGdsb2JhbCBtZW1vcnkgaGFuZGxlLgorICBcaXRlbSBBcnJheSBvZiBoYW5kbGVzIGNvbnRhaW5zIGhhbmRsZSBkYXRhLiBFYWNoIGVudHJ5IHJlZmVycworICAgIHRvIGEgZ2xvYmFsIG1lbW9yeSBoYW5kbGUgKFRoZSBpbmRleCBpcyBhIGZ1bmN0aW9uIG9mIHRoZQorICAgIGhhbmRsZSkuICBUaGUgZGF0YSBpbmNsdWRlczogMSkgU3lzLVYgc2hhcmVkIG1lbW9yeSBoYW5kbGVzIDIpCisgICAgb2Zmc2V0IGludG8gdGhlIG1lbW9yeSBibG9jay4gCitcZW5ke2VudW1lcmF0ZX0KKworXHBhcmFncmFwaHtCbG9jayBhbGxvY2F0aW9uIGRhdGEgc3RydWN0dXJlIChMZXZlbCB0aHJlZSk6fQorVGhpcyBkYXRhIHN0cnVjdHVyZSBhIHBhcnQgb2YgdGhlIHNobVxfYmxvY2sgb2JqZWN0LiBJdCBpcyBsb2NhbCB0bworZWFjaCBzaGFyZWQgbWVtb3J5IGJsb2NrLCBzbyBldmVyeSBtZW1vcnkgYmxvY2sgaGFzIGl0J3Mgb3duIGRhdGEKK3N0cnVjdHVyZS4gVGhlIHNoYXJlZCBtZW1vcnkgYmxvY2tzIGFyZSBvcmdhbml6ZWQgaW4gY2hhaW5zIGdyb3VwZWQgYnkKK3Byb2Nlc3NlcyAoZWFjaCBEREUgcHJvY2VzcyBoYXMgb25lIGFuZCBvbmx5IG9uZSBjaGFpbik6IAorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gVGhlIGlkIG9mIHRoZSBuZXh0IHNoYXJlZCBtZW1vcnkgYmxvY2sgaW4gdGhlIGNoYWluLgorICBcaXRlbSBUaGUgc2l6ZSBvZiB0aGUgYmxvY2suCisgIFxpdGVtIE51bWJlciBvZiBmcmVlIGJ5dGVzIGluIHRoZSBibG9jay4KKyAgXGl0ZW0gVGhlIGluZGV4IG9mIHRoZSBvd25lciBwcm9jZXNzLgorICBcaXRlbSBUaGUgZmlyc3QgaXRlbSBpbiB0aGUgZnJlZSBsaXN0IChhIGxpbmtlZCBsaXN0IG9mIGZyZWUgaXRlbXMpLgorXGVuZHtlbnVtZXJhdGV9CisKKworXHBhcmFncmFwaHtGcmFnbWVudCBhbGxvY2F0aW9uIChMZXZlbCBmb3VyKTp9CitUaGlzIGRhdGEgaXMgYSBwYXJ0IG9mIHRoZSBzaG1cX2ZyYWdtZW50IG9iamVjdC4gSXQgaXMgYSBwYXJ0IG9mIHRoZSBzaGFyZWQKK21lbW9yeSBhbGxvY2F0aW9uIG1lY2hhbmlzbS4gRXZlcnkgZnJhZ21lbnQgaXMgYSBwYXJ0IG9mIHNoYXJlZCBtZW1vcnkKK2Jsb2NrLiBFYWNoIGZyYWdtZW50cyBjb250YWluOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gVGhlIHNpemUgb2YgdGhlIGZyYWdtZW50IChmb3IgYWxsb2NhdGluZyBhbmQgZnJlZWluZyB0aGlzCisgICAgZnJhZ21lbnQpLiAKKyAgXGl0ZW0gQSB1bmlvbiB0aGF0IGNvbnRhaW5zIG9uZSBvZjoKKyAgICBcYmVnaW57aXRlbWl6ZX0KKyAgICAgIFxpdGVtIGRhdGEgLSBpZiBpdCBpcyBhbGxvY2F0ZWQuCisgICAgICBcaXRlbSBvZmZzZXQgb2YgdGhlIG5leHQgZnJlZSBmcmFnbWVudCAoaWYgaXQgaXMgYSBtZW1iZXIgb2YgdGhlCisgICAgICAgIGZyZWUgbGlzdCkuCisgICAgXGVuZHtpdGVtaXplfQorXGVuZHtlbnVtZXJhdGV9CisKKworXHBhcmFncmFwaHtMb2NhbCByZWZlcmVuY2UgdG8gZ2xvYmFsIG1lbW9yeTp9CitHbG9iYWwgbWVtb3J5IGJsb2NrcyBhcmUgcmVmZXJlbmNlZCBmcm9tIGxvY2FsIG1lbW9yeS4gVGhpcyBpcyB1c2VkCitmb3Igc3RvcmluZyBwb2ludGVycyB0aGF0IHJlZmVyIHRvIHRoZSBtZW1vcnkgYmxvY2suIEl0IGNvbnRhaW5zOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gbmV4dCBpdGVtIGluIHRoZSBsaXN0LgorICBcaXRlbSBzaGFyZWQgbWVtb3J5IGJsb2NrIGlkLgorICBcaXRlbSBPd25lciBwcm9jZXNzLgorICBcaXRlbSBQb2ludGVyIHRvIHRoZSBkYXRhLgorXGVuZHtlbnVtZXJhdGV9CisKK1xwYXJhZ3JhcGh7TG9jYWwgbWlycm9yaW5nIG9mIGdsb2JhbCBoYW5kbGVzOn0KK0dsb2JhbCBoYW5kbGVzIHJlcXVpcmUgbG9jYWwgc2VnbWVudHMgaGFuZGxlcyAod2hlbiB0aGV5IGFyZSBsb2NrZWQpLgorVGhlc2Ugc2VnbWVudHMgaGF2ZSB0byBiZSBkZWxldGVkIHdoZW4gdGhlIGhhbmRsZSBpcyBmcmVlZC4KK1RoZXJlIGlzIGEgbWluaW1hbCBtaXJyb3Jpbmcgb2YgaGFuZGxlcyBpbiB0aGUgb3JpZ2luYWwgdGFibGVzIG9mCit3aW5lLCB0aGlzIGluZm9ybWF0aW9uIGlzIHN0b3JlZCB0aGUgd2F5IGxvY2FsIGhhbmRsZXMgaGF2ZSBhbHdheXMKK2JlZW4gc3RvcmVkLgorCitcc3Vic2VjdGlvbntJbnRlcmZhY2UgYW5kIElPfQorVGhlIERERSBzZWN0aW9uIG9mIHdpbmUgaGFzIHNldmVyYWwgaW50ZXJmYWNlcyB0byBkaWZmZXJlbnQgZW50aXRpZXM6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBVc2VyIGRlYnVnIGluZm9ybWF0aW9uLgorICBcaXRlbSBJbnRlcmZhY2UgYmV0d2VlbiBzZXZlcmFsIFxXaW5lXCBwcm9jZXNzZXMuCisgIFxpdGVtIEludGVyZmFjZSB0byB0aGUgYG9sZCcgY29kZSBvZiBcV2luZS4KK1xlbmR7ZW51bWVyYXRlfQorCisKK1xwYXJhZ3JhcGh7VXNlciBkZWJ1ZyBpbmZvcm1hdGlvbjp9CitUaGUgZGVidWcgaW5mb3JtYXRpb24gaXMgd3JpdHRlbiBhY2NvcmRpbmcgdG8gXFdpbmUncworY29udmVudGlvbnMuIFRoaXMgbWVhbnMgdGhhdCBkcHJpbnRmXF8kXGNkb3RzJCBtYWNyb3MgYXJlIHVzZWQgdG8KK3ByaW50IHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbi4gKFRoZXNlIG1hY3JvcyBhbGxvdyBydW50aW1lIG9yIGNvbXBpbGUgdGltZQorZGlzYWJsaW5nIG9mIGEgYW55IHNvcnQgb2YgZGVidWcgaW5mb3JtYXRpb24pLgorCitJbiBzb21lIGNhc2VzIHRoZSBkcHJpbnRmXF8kXGNkb3RzJCBtYWNyb3MgYXJlIG5vdCBwb3dlcmZ1bCBlbm91Z2guIEluCit0aG9zZSBjYXNlcyB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdCBpcyB1c2VkIGluc3RlYWQ6CitcYmVnaW57dmVyYmF0aW19CisgICAgaWYgKGRlYnVnZ2luZ19kZGUpIHsKKyAgICAgIC8qIHByaW50IHdoYXRldmVyIGlzIG5lZWRlZCBmb3IgZGRlIGRlYnVnZ2luZyAqLworICAgIH0KK1xlbmR7dmVyYmF0aW19CisKKworXHBhcmFncmFwaHtJbnRlcmZhY2UgYmV0d2VlbiBcV2luZVwgcHJvY2Vzc2VzOn0KK1RoZSBpbnRlcmZhY2UgYmV0d2VlbiBwcm9jZXNzZXMgaW5jbHVkZXM6CitcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0gTWVzc2FnZSBkZWxpdmVyeSAoc2VlIFNlY3Rpb25+XHJlZntzZWM6RGVsaXZlcmluZ01lc3NhZ2VzfSkuCisgIFxpdGVtIFNoYXJpbmcgXHdpbmRvelwgY29uc3RydWN0cyAoYXRvbXMsIG1lbW9yeSwgd2luZG93CisgICAgaGFuZGxlcykuCisgIFxpdGVtIFN5bmNocm9uaXphdGlvbiBhbW9uZyBkaWZmZXJlbnQgXFdpbmVcIHByb2Nlc3NlcyBzbyBpdCB3aWxsCisgICAgYXBwZWFyIHRvIGEgXHdpbmRvelwgYXMgaWYgdGhlcmUgaXMgb25seSBvbmUgcHJvY2Vzcy4KK1xlbmR7aXRlbWl6ZX0KKworXHBhcmFncmFwaHtJbnRlcmZhY2UgdG8gdGhlIHJlc3Qgb2YgXFdpbmU6fQorTW9zdCBvZiB0aGUgaW50ZXJmYWNlIGhhcyBiZWVuIG1pbmltaXplZCB0byBhbiBhZGRpdGlvbmFsIGZldyBsaW5lcyBpbgordGhlIG9yaWdpbmFsIGZ1bmN0aW9ucy4gVGhlIGhvb2sgZm9yIERERSBhcmUgaW4gdGhlIGZvbGxvd2luZworbG9jYXRpb25zOgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIEdsb2JhbCBhdG9tcyBmdW5jdGlvbnMgLSB0aGVzZSBhcmUgY2FsbGVkIGRpcmVjdGx5IGZyb20KKyAgICBcd2luZG96XCBhcHBsaWNhdGlvbnMuIAorICBcaXRlbSBNZXNzYWdlIGRlbGl2ZXJ5IC0gYSBob29rIGNhbGxzIHRoZSBEREUgZnVuY3Rpb25zIGZyb20gdGhlCisgICAgb3JpZ2luYWwgbWVzc2FnZSBkZWxpdmVyeSBmdW5jdGlvbnMuCisgIFxpdGVtIEluaXRpYWxpemF0aW9uIC0gRXZlcnkgUGVla01lc3NhZ2UoKSBjYWxsIGEgRERFIGZ1bmN0aW9uIHRvCisgICAgY2hlY2sgaWYgdGhlIGN1cnJlbnQgd2luZG93IGhhcyBEREUgbWFuYWdlbWVudCAoYnkgc2VuZGluZworICAgIGEgZHVtbXkgV01cX0RERVxfSU5JVElBVEUgbWVzc2FnZSkuCisgIFxpdGVtIFdhaXRpbmcgb24gbWVzc2FnZXMgLSBUaGUgb3JpZ2luYWwgY29kZSBmb3Igd2FpdGluZyBvbiBYCisgICAgbWVzc2FnZXMgd2FzIGVuaGFuY2VkIHRvIHdhaXQgb24gRERFIG1lc3NhZ2VzIGFzIHdlbGwuIFRoaXMKKyAgICBpbmNsdWRlcyBhYm9ydGluZyBzbGVlcHMgd2hlbiBTSUdVU1IyIHNpZ25hbCBpcyBzZW50LiBUaGUgYWN0dWFsCisgICAgdGVzdCBmb3IgRERFIG1lc3NhZ2VzIGlzIGRvbmUgaW4gdGhlIERERSBjb2RlLgorXGVuZHtpdGVtaXplfQorCitcc3Vic2VjdGlvbntNYWpvciBmdW5jdGlvbnMgYW5kIHRoZWlyIHJvbGV9CitccGFyYWdyYXBoe01lc3NhZ2UgZGVsaXZlcnkgZnVuY3Rpb25zOn0KK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBEREVcX1NlbmRNZXNzYWdlIGFuZCBEREVcX1Bvc3RNZXNzYWdlIC0gaG9va3MgdXNlZCBieSBvcmlnaW5hbAorICAgIFxXaW5lJ3MgU2VuZE1lc3NhZ2UgYW5kIFBvc3RNZXNzYWdlLiBUaGV5IHJldHVybiB0cnVlIGlmIHRoZQorICAgIG1lc3NhZ2UgY291bGQgYmUgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gYSByZW1vdGUgXFdpbmVcIHByb2Nlc3MuCisgICAgT25seSBpbiB0aGlzIGNhc2UgU2VuZE1lc3NhZ2UgYW5kIFBvc3RNZXNzYWdlIHN0b3AgZnVydGhlcgorICAgIHByb2Nlc3NpbmcuCisgIFxpdGVtIERERVxfRG9NZXNzYWdlIC0gVHJ5IHRvIHBvc3Qgb3Igc2VuZCBhIG1lc3NhZ2UgdG8gYW5vdGhlcgorICAgIFxXaW5lXCBwcm9jZXNzLiBUaGlzIGZ1bmN0aW9uIGNhbiBkbyBicm9hZGNhc3RpbmcgYXMgd2VsbCBhcworICAgIHNlbmRpbmcuIChBIG1lc3NhZ2UgaXMgYGJyb2FkY2FzdGVkJyBpZiBpdCBpcyBkZWxpdmVyZWQgdG8gZXZlcnkKKyAgICB3aW5kb3cgb24gdGhlIHN5c3RlbSkuCisgIFxpdGVtIERERVxfRG9PbmVNZXNzYWdlIC0gRGVsaXZlciBhIG1lc3NhZ2UgdG8gYSBnaXZlbiB3aW5lCisgICAge1xiZiBwcm9jZXNzfS4KKyAgXGl0ZW0gZGRlXF9wcm9jXF9zZW5kXF9hY2sgLSBTZW5kIGFjayBtZXNzYWdlIHRvIFxXaW5lXAorICAgIHByb2Nlc3MuIFRoZSBpbnB1dCB3aW5kb3cgaGFuZGxlIGlzIHVzZWQgZm9yIGRldGVjdGluZyB0aGUKKyAgICBwcm9jZXNzLgorICBcaXRlbSBnZXRcX2FjayAtIHdhaXQgZm9yIGFjayBvciB0aW1lb3V0LgorXGVuZHtpdGVtaXplfQorCitccGFyYWdyYXBoe01lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uczp9CitcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0gRERFXF9tYWxsb2MgLSBBbGxvY2F0ZSBhIHNoYXJlZCBtZW1vcnkgZnJhZ21lbnQuIFRoaXMgZnVuY3Rpb24KKyAgICBhbHNvIGFsbG9jYXRlcyBnbG9iYWwgbWVtb3J5IGhhbmRsZS4KKyAgXGl0ZW0gRERFXF9HbG9iYWxGcmVlIC0gRnJlZSBhIHNoYXJlZCBtZW1vcnkgZnJhZ21lbnQgYWNjb3JkaW5nIHRvCisgICAgaXQncyBoYW5kbGUuIEFuZCBmcmVlIHRoZSBoYW5kbGUuCisgIFxpdGVtIERERVxfU3luY0hhbmRsZSAtIHN5bmNocm9uaXplIHRoZSBnbG9iYWwgaGFuZGxlcyBtaXJyb3JlZAorICAgIGxvY2FsbHkuIERlbGV0ZSBhbnkgb3V0ZGF0ZWQgaGFuZGxlcywgb3IgcmVtYXAgcmVhbGxvY2F0ZWQKKyAgICBoYW5kbGVzLiAKKyAgXGl0ZW0gRERFXF9tZW1cX2luaXQgLSBpbml0aWFsaXplIG9yIGF0dGFjaCB0aGUgbWFpbiBzaGFyZWQgbWVtb3J5CisgICAgYmxvY2ssIGFuZCByZWxldmFudCBsb2NhbCBkYXRhIHN0cnVjdHVyZXMuCisgIFxpdGVtIHNobVxfZGVsZXRlXF9hbGwgLSBkZWxldGUgYWxsIElQQyBzdHVmZiByZWxhdGVkIHRvIHRoaXMKKyAgICBwcm9jZXNzLiBLaWxsIHRoZSBtYWluIG1lbW9yeSBibG9jayBpZiBhcHByb3ByaWF0ZS4KK1xlbmR7aXRlbWl6ZX0KKworCitcc2VjdGlvbntTb2Z0d2FyZSB0ZXN0aW5nfQorVGhlIHRlc3Rpbmcgb2YgdGhpcyBtb2R1bGUgd2FzIGEgc3Vic3RhbnRpYWwgcGFydCBvZiB0aGUKK2RldmVsb3BtZW50LiBUZXN0aW5nIHJldmVhbGVkIGJ1Z3MganVzdCBhcyB0aGV5IHdoZXJlIGNyZWF0ZWQuCisKK1xzdWJzZWN0aW9ue1Rlc3RpbmcgbWV0aG9kcyB1dGlsaXplZH0KK1xsYWJlbHtzZWM6VGVzdE1ldGhvZH0KK1R3byBtYWpvciB0ZXN0aW5nIG1ldGhvZHMgd2hlcmUgdXNlZDoKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIFJ1bm5pbmcgRERFIFx3aW5kb3pcIGFwcGxpY2F0aW9ucy4gVGhlIGFwcGxpY2F0aW9ucyB1c2VkIGFyZQorICAgIERERSBkZW1vbnN0cmF0aW9uIGFwcGxpY2F0aW9ucy4gVGhpcyBhcHBsaWNhdGlvbnMgc2VlbSB0byBzaG93IAorICAgIHByZWNpc2VseSB3aGF0IERERSBpcyBhbGwgYWJvdXQuIFRoZSBhcHBsaWNhdGlvbnMgdXNlZCB3aGVyZToKKyAgICBkZGVwb3AxLmV4ZSAoc2VydmVyKSwgc2hvd3BvcDEuZXhlIChjbGllbnQpLiBUaGVzZQorICAgIGFwcGxpY2F0aW9ucyBjb21lIHdpdGggXHdpbmRvelwgcHJvZ3JhbW1pbmcgbWFudWFsIGJ5IENoYXJsZXMKKyAgICBQZXR6b2xkIFxjaXRle2JpYjpXaW5NYW51YWx9LiAKKyAgXGl0ZW0gUnVubmluZyBzdGFuZGFsb25lIERERSBvYmplY3RzIGxpbmtlZCB3aXRoIGEgdGVzdAorICAgIG9iamVjdC4gRXZlcnkgb2JqZWN0IHdhcyB0ZXN0ZWQgdGhpcyB3YXkuIFNvbWUgb2JqZWN0cyBoYWQgdG8gYmUKKyAgICBsaW5rZWQgd2l0aCBhIHN0dWIgdGhhdCBlbXVsYXRlZCBcV2luZSdzIGZ1bmN0aW9ucy4gVGhlIHN0dWIgaXMKKyAgICBwcmV0dHkgcG9vciB3aXRoIGRkZVxfbWVtIG9iamVjdCBzaW5jZSB0aGlzIG9iamVjdCByZXF1aXJlcyBoYXJkCisgICAgdG8gZW11bGF0ZSBmdW5jdGlvbmFsaXRpZXMgKHRoaW5ncyBsaWtlIGFsbG9jYXRpbmcgYSBzZWdtZW50KS4KKworICAgIEZvciBzb21lIG9iamVjdHMgdGhlIGNvdmVyYWdlIHNlZW1zIHRvIGJlIHBlcmZlY3QgKDEwMFwlKS4gRm9yCisgICAgc29tZSBvYmplY3QgdGhlIGNvdmVyYWdlIGlzIHBvb3IuIFRoZSBvYmplY3RzIHdpdGggbWFzc2l2ZSBzdHViCisgICAgdXNhZ2Ugc3VmZmVyIGZyb20gdGhpcyAoZXNwZWNpYWxseSBkZGVcX21lbSkuCitcZW5ke2VudW1lcmF0ZX0KKworXHN1YnNlY3Rpb257aW5wdXQgZm9yIHRlc3Rpbmd9CitNb3N0IG9mIHRoZSB0ZXN0aW5nIGRlc2NyaWJlZCBpbiBzZWN0aW9uflxyZWZ7c2VjOlRlc3RNZXRob2R9IGhhcyBubworaW5wdXQuIE1vc3Qgb2YgdGhlIHRlc3Rpbmcga25vd2xlZGdlIGlzIGluIHRoZSB0ZXN0IG9iamVjdHMKK3RoZW1zZWx2ZXMuIFRoZXJlIGFyZSB0d28gZXhjZXB0aW9ucyB0byB0aGlzIHJ1bGU6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBUaGUgXHdpbmRvelwgYXBwbGljYXRpb25zIGRlc2NyaWJlZCBpbgorICAgIHNlY3Rpb25+XHJlZntzZWM6VGVzdE1ldGhvZH0gLSB3aGljaCBhcmUgZXNzZW50aWFsbHkgYW4gaW5wdXQgdG8KKyAgICB0aGUgc29mdHdhcmUuIFRoZXNlIGFwcGxpY2F0aW9ucyBjYW4ndCBiZSBkaXN0cmlidXRlZCBzaW5jZSBpdAorICAgIHdpbGwgYmUgYSBcY29weXJpZ2h0e30gdmlvbGF0aW9uLgorICBcaXRlbSBBIHRyYWNlIGZpbGUgd2hpY2ggaXMgdXNlZCBmb3IgY29tcGFyaW5nIHRlc3QncyBvdXRwdXQgd2l0aAorICAgIHRoZSBleHBlY3RlZCB0cmFjZSByZXN1bHQuIFRoaXMgdHJhY2UgZmlsZSBpcyB1c2VkIGZvcgorICAgIHNobVxfZnJhZ21lbnQgdmFsaWRhdGlvbi4gVGhpcyBmaWxlIGlzIGltcGxlbWVudGF0aW9uIERlcGVuZGFudHMKKyAgICBhbmQgc2hvdWxkIGJlIHVwZGF0ZWQgd2hlbmV2ZXIgdGhlIG9iamVjdCBpcyByZXdyaXR0ZW4uIFdoZW4KKyAgICB1cGRhdGluZyB0aGUgdHJhY2UsIGl0IHNob3VsZCBiZSBpbnNwZWN0ZWQgbWFudWFsbHkgYmVmb3JlIGl0IGlzCisgICAgcmVsZWFzZWQuIAorXGVuZHtlbnVtZXJhdGV9CisKK1xzdWJzZWN0aW9ue3VzYWdlIGluc3RydWN0aW9uc30KKworXHBhcmFncmFwaHtSdW5uaW5nIHRoZSBEREUgYXBwbGljYXRpb25zOn0KK1RvIHRlc3QgdGhlIERERSBhcHBsaWNhdGlvbnMgb25lIG11c3QgcnVuOgorXGJlZ2lue3ZlcmJhdGltfQorICAgcHJvbXB0PiB3aW5lIC9mdWxsLXBhdGgvZGRlcG9wMS5leGUgPiAvZGV2L251bGwgJgorXGVuZHt2ZXJiYXRpbX0KK1dhaXQgZm9yIHRoZSBzZXJ2ZXIgd2luZG93IHRvIHBvcCB1cCAoQSB0aW55IHdpbmRvdyBzaG91bGQgYXBwZWFyIGF0Cit0aGUgbG93ZXIgbGVmdCBjb3JuZXIgb2YgeW91ciBzY3JlZW4pLiBUaGVuIGFjdGl2YXRlIHRoZSBjbGllbnQgYnkKK3R5cGluZzogCitcYmVnaW57dmVyYmF0aW19CisgICBwcm9tcHQ+IHdpbmUgL2Z1bGwtcGF0aC9zaG93cG9wMS5leGUgPiAvZGV2L251bGwgCitcZW5ke3ZlcmJhdGltfQorVGhlIHNlcnZlciB1cGRhdGVzIGBgVVNBIHBvcHVsYXRpb24nJyBkYXRhIGV2ZXJ5IDUgc2Vjb25kcy4gVGhlIGNsaWVudAorYXNrcyBmb3IgYSBob3QgbGluayAoaS5lLlwgaXQgc2VuZHMgYSBXTVxfRERFXF9BRFZJU0Ugb24gZXZlcnkKK2l0ZW0pLiBGcm9tIHRoYXQgcG9pbnQgb24gdGhlIHNlcnZlciB1cGRhdGVzIHRoZSBjbGllbnQgb2YgYW55Citwb3B1bGF0aW9uIGNoYW5nZS4KKworCitccGFyYWdyYXBoe1J1bm5pbmcgdGhlIG9iamVjdCB0ZXN0czp9CitUaGUge1xlbSBydW5cX3Rlc3RzfXt9IHNjcmlwdCBpcyBwcm92aWRlZCB0byBhdXRvbWF0ZSB0aGUgb2JqZWN0Cit0ZXN0cy4gRXZlcnkgb2JqZWN0IHRlc3QgaXMgcnVuIGFuZCB0aGUgc2NyaXB0IGNoZWNrcyBmb3IgcmVzdWx0cy4gQXQKK3RoZSBlbmQgdGhlIHNjcmlwdCBwcmludHMgYSBuaWNlIHN1bW1hcnkgdGFibGUuCisKK0ludm9raW5nIHRlc3RzIG91dHNpZGUgdGhlIHtcZW0gcnVuXF90ZXN0c317fSBzY3JpcHQgaXMgbm90IGFzIHNpbXBsZQorYXMgaXQgbWF5IGxvb2suIEV2ZXJ5IHRlc3QgaGFzIGRpZmZlcmVudGx5IGxvb2tpbmcgb3V0cHV0LgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIGRkZVxfYXRvbVxfdGVzdCAtIFRoZSBleGVjdXRhYmxlIGlzIHJ1bi4gSXQgcGFzc2VzIGlmIG5vCisgICAgZXJyb3JzIGFyZSBwcmludGVkIGF0IHRoZSBib3R0b20uIAorICBcaXRlbSBkZGVcX21lbVxfdGVzdCAtIFRoZSBzYW1lIGFzIGZvciBkZGVcX2F0b21cX3Rlc3QuCisgIFxpdGVtIHNobVxfc2VtYXBoXF90ZXN0IC0gVGhlIHNhbWUgYXMgZm9yIGRkZVxfYXRvbVxfdGVzdC4KKyAgXGl0ZW0gYml0XF9hcnJheVxfdGVzdCAtICBUaGUgc2FtZSBhcyBmb3IgZGRlXF9hdG9tXF90ZXN0LgorICBcaXRlbSBzaG1cX2ZyYWdtZW50XF90ZXN0IC0gQWZ0ZXIgdGhlIGV4ZWN1dGFibGUgaXMgcnVuLCAgdGhlIG91dHB1dAorICAgIGhhcyB0byBiZSBjb21wYXJlZCB3aXRoIFRFU1RcX0ZSQUdNRU5ULnN0ZCAKKyAgXGl0ZW0gZGRlXF9wcm9jXF90ZXN0IC0gVGhpcyBhY3R1YWxseSBydW5zIGFzIGEgY2xpZW50IGFuZCBhcyBhCisgICAgc2VydmVyLiBUbyBhY3RpdmF0ZSB0aGUgc2VydmVyIG9uZSBzaG91bGQgd3JpdGU6CitcYmVnaW57dmVyYmF0aW19CisgIHByb21wdD4gZGRlX3Byb2NfdGVzdCAxID4gc2VydmVyLmxvZworXGVuZHt2ZXJiYXRpbX0KKyAgICBUaGVuIHRoZSBjbGllbnQgaGFzIHRvIGJlIGFjdGl2YXRlZCB3aXRoaW4gZml2ZSBzZWNvbmRzIGJ5CisgICAgd3JpdGluZzoKK1xiZWdpbnt2ZXJiYXRpbX0KKyAgcHJvbXB0PiBkZGVfcHJvY190ZXN0ID4gY2xpZW50LmxvZworXGVuZHt2ZXJiYXRpbX0KKyAgICBUaGUgbG9nIGZpbGVzIHNob3VsZCBjb250YWluOgorICAgIFxiZWdpbntkZXNjcmlwdGlvbn0KKyAgICAgIFxpdGVtW3NlcnZlci5sb2c6XSBTaG91bGQgY29udGFpbiB0cmFjZXMgb2YgcmVjZWl2ZWQKKyAgICAgICAgV01cX0RERVxfSU5JVElBVEUgbWVzc2FnZSwgYW5kIGFjayBzZW50IGZvciBpdC4gKFByZXR0eSBtdWNoCisgICAgICAgIHRoZSBzYW1lIHdoYXQgIHtcZW0gcnVuXF90ZXN0c317fSBkb2VzKS4gIAorICAgICAgXGl0ZW1bY2xpZW50LmxvZzpdIFNob3VsZCBjb250YWluIHRyYWNlcyBvZiBzZW5kaW5nCisgICAgICAgIFdNXF9EREVcX0lOSVRJQVRFIGFuZCB0aGVuIHJlY2VpdmluZyBhbiBhY2sgbWVzc2FnZS4KKyAgICBcZW5ke2Rlc2NyaXB0aW9ufQorICAgIE5vIGB0aW1lb3V0JyB0cmFjZXMgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhlIGxvZyBmaWxlcy4KKworXGVuZHtpdGVtaXplfQorCisKK1xzZWN0aW9ue1N1bW1hcnl9Citcc3Vic2VjdGlvbntTb2Z0d2FyZSBsaW1pdGF0aW9uc30KK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBPbmx5IG1vc3QgZnVuZGFtZW50YWwgbWVtb3J5IG1hbmFnZW1lbnQgZnVuY3Rpb25zIHdoZXJlCisgICAgd3JpdHRlbi4gVGhpcyBtZWFucyB0aGF0IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIHdpbGwgbm90IHdvcms6CisgICAgXGJlZ2lue2l0ZW1pemV9CisgICAgICBcaXRlbSBHbG9iYWxSZUFsbG9jCisgICAgICBcaXRlbSBHbG9iYWxTaXplIC0gdHdvIGxpbmUgZml4LgorICAgICAgXGl0ZW0gR2xvYmFsRmxhZ3MgLSB0d28gbGluZSBmaXguCisgICAgICBcaXRlbSBMb2NrU2VnbWVudCAtIHR3byBsaW5lIGZpeC4KKyAgICAgIFxpdGVtIFVubG9ja1NlZ21lbnQgLSB0d28gbGluZSBmaXguCisgICAgICBcaXRlbSBHbG9iYWxGcmVlQWxsIC0gd2lsbCBub3QgZnJlZSBEREUgbWVtb3J5LgorICAgICAgXGl0ZW0gR2xvYmFsUGFnZUxvY2sgLSB0d28gbGluZSBmaXguCisgICAgICBcaXRlbSBHbG9iYWxQYWdlVW5sb2NrIC0gdHdvIGxpbmUgZml4LgorICAgICAgXGl0ZW0gR2xvYmFsRml4IC0gdHdvIGxpbmUgZml4LgorICAgICAgXGl0ZW0gR2xvYmFsVW5maXggLSB0d28gbGluZSBmaXguCisgICAgXGVuZHtpdGVtaXplfQorICBcaXRlbSBOb24gRERFIG1lc3NhZ2VzIHRvIHJlbW90ZSB3aW5kb3dzIHdpbGwgbm90IHdvcmsuIFRoaXMgaXMKKyAgICBjdXJyZW50bHkgb25seSBhIHNhbml0eSBjaGVjaywgaXQgbWF5IGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgXGl0ZW0gTWVzc2FnZSBzZW5kaW5nIGhhcyBhIHRpbWVvdXQgbGltaXQuIFRoaXMgaXMgaW5jb21wYXRpYmxlIHdpdGgKKyAgICBcd2luZG96LiBUaGlzIGxpbWl0IGluY3JlYXNlcyBzdGFiaWxpdHkgb2YgYSBzaW5nZSBcV2luZVwgcHJvY2Vzcy4KKyAgXGl0ZW0gU3luY2hyb25pemF0aW9uIG1lY2hhbmlzbSBiZXR3ZWVuIHdpbmUgcHJvY2Vzc2VzIGlzIG5vdAorICAgIHBlcmZlY3QuIEl0IHdhcyBub3QgcHJvdmVkIHRoZW9yZXRpY2FsbHkuIEkgbmV2ZXIgc2F3IGl0IGZhaWwuCitcZW5ke2l0ZW1pemV9CisKK1xzdWJzZWN0aW9ue0NvbmNsdWRpbmcgUmVtYXJrc30KK1RoaXMgZXh0ZW5zaW9uIHRvIFxXaW5le30gZW5hYmxlcyBmdXJ0aGVyIGRldmVsb3BtZW50IG9mIFx3aW5kb3pcIElQQworc3VwcG9ydC4gVGhpbmdzIGxpa2UgT0xFIGNhbiBiZSBleHRlbmRlZCB1c2luZyB0aGVzZSBmZWF0dXJlcyAtCithbHRob3VnaCBzb21lIG1vZGlmaWNhdGlvbnMgbWlnaHQgYmUgaW5ldml0YWJsZS4KKworVGhlIG1vc3QgaW1wb3J0YW50IGNvbnRyaWJ1dGlvbiBvZiB0aGlzIHByb2plY3QgaXMgdGhlIHN1cHBvcnQgZm9yCitcbGlid2luZXt9LiBBbnkgXHdpbmRvelwgYXBwbGljYXRpb24gY29tcGlsZWQgdW5kZXIgVU5JWCBhbmQgbGlua2VkIHRvCitcbGlid2luZXt9IHdpbGwgbmVlZCB0aGUgSVBDIG1lY2hhbmlzbSBwcm92aWRlZCBieSB0aGlzIHByb2plY3QuCisKK0R1cmluZyB0aGUgcHJvZ3Jlc3Mgb2YgdGhlIHByb2plY3QgaXQgZ290IGEgYml0IG91dGRhdGVkLiBEdXJpbmcgdGhhdAordGltZSBcV2luZXt9IHN0YXJ0ZWQgdG8gaGFuZGxlIHRhc2tzIGludGVybmFsbHksIHNvIHRoZSBleHRlcm5hbCBJUEMKK3dhcyBubyBsb25nZXIgbmVlZGVkIGZvciB0aGUgZW11bGF0b3IgY29uZmlndXJhdGlvbiBvZgord2luZS4gTmV2ZXJ0aGVsZXNzIHRoZSBzdXBwb3J0IG9mIElQQyBmb3IgXGxpYndpbmUgd2lsbCBuZXZlcgorYmUgb2Jzb2xldGUuCisKKworCisKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCislJQorJSUgQXBwZW5kaXhlcworJSUKKyUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlJSUlCitcY2xlYXJwYWdlCitcYXBwZW5kaXgKKworXHNlY3Rpb257XFdpbmV9CitcbGFiZWx7c2VjOldpbmV9CitcV2luZVwgc3RhbmQgZm9yIHtcZW0gV0lOZG93cyBFbXVsYXRvcn0uIEl0IGlzIGFuIFgtd2luZG93cyAtIFVOSVggCithcHBsaWNhdGlvbiAoTGludXggYW5kIEZyZWVCU0QpLiBcV2luZVwgZW11bGF0ZXMgXHdpbmRvelwgIGVudmlyb25tZW50Citmb3IgdGhlIFx3aW5kb3pcICBhcHBsaWNhdGlvbnMuIEl0IGhhcyB0d28gdXNlczoKK1xiZWdpbntlbnVtZXJhdGV9CisgIFxpdGVtIFJ1biBcd2luZG96XCAgYmluYXJ5IGNvZGUgKGNvbXBpbGVkIHVuZGVyIFx3aW5kb3opLgorICBcaXRlbSBUbyBiZSB1c2VkIGFzIGEgdG9vbGtpdCBmb3IgY29tcGlsaW5nIFx3aW5kb3pcIGFwcGxpY2F0aW9ucworICAgIHVuZGVyIFVOSVguIChUaGUgXGxpYndpbmVcIGxpYnJhcnkgaXMgcHJvdmlkZWQpCitcZW5ke2VudW1lcmF0ZX0KK0ZvciBlbXVsYXRpb24sIG9ubHkgIEludGVsLUFyY2hpdGVjdHVyZSBDUFUgKDM4NiwgNDg2LCBQZW50aXVtKSBhcmUKK3N1cHBvcnRlZC4gXGxpYndpbmVcIFRvb2xraXQgc2hvdWxkIHJ1biBvbiBhbnkgcGxhdGZvcm1zLCBidXQgaXQgd2FzIG5vdAordGVzdGVkLiBcV2luZVwgaXMgc3RpbGwgaW4gYWxwaGEgc3RhdGUsIGFuZCBkb2VzIG5vdCBzdXBwb3J0IGFsbCBcd2luZG96XAorY2FwYWJpbGl0aWVzIHlldC4KKworCitcc2VjdGlvbntNZXNzYWdlcyB1bmRlciBcd2luZG96fQorXGxhYmVse3NlYzpXaW5kb3pNc2d9CitNZXNzYWdlcyBhcmUgdGhlIG1lYW5zIG9mIGNvbW11bmljYXRpb24gdG8gYSB1c2VyIHdpbmRvdyAoZnJvbSBhbm90aGVyCit3aW5kb3cgb3IgZnJvbSBcd2luZG96XCBpdHNlbGYpLgorTWVzc2FnZXMgY2FuIGJlIGRlbGl2ZXJlZCBpbiB0d28gd2F5czoKK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBNZXNzYWdlcyBjYW4gYmUgc2VudC4gVGhlIHNlbnQgbWVzc2FnZSBlbnRlcnMgdGhlIHdpbmRvdyBoYW5kbGVyCisgICAgYXN5bmNocm9ub3VzbHkgKFRoZSBoYW5kbGVyIG1heSBiZSByZWVudGVyZWQgbWFueSB0aW1lcykuCisgICAgQSB3aW5kb3cgc2VuZGluZyB0aGUgbWVzc2FnZSB3YWl0cyBmb3IgdGhlIHJlY2lwaWVudCB0byBwcm9jZXNzCisgICAgdGhlIG1lc3NhZ2UgYW5kIHJldHVybiBhbiBleGl0IGNvZGUuCisgIFxpdGVtIE1lc3NhZ2VzIGNhbiBiZSBwb3N0ZWQuIFRoZSBwb3N0ZWQgbWVzc2FnZSBlbnRlcnMgYSBxdWV1ZSwgYW5kCisgICAgaXQncyB1cCB0byB0aGUgcmVjaXBpZW50IHRvIHByb2Nlc3MgaXQuIElmIHRoZSByZWNpcGllbnQgaWdub3JlcworICAgIGl0LCB0aGUgbWVzc2FnZSBtaWdodCBiZSBldmVudHVhbGx5IHNlbnQgdG8gdGhlIHJlY2lwaWVudCBmcm9tCisgICAgV2luTWFpbiBoYW5kbGVyLgorXGVuZHtpdGVtaXplfQorCitcc2VjdGlvbntEREV9CitcbGFiZWx7c2VjOkRERX0KK0RERSBzdGFuZHMgZm9yIFxEREVcQC4gRERFIGlzIGFuIFx3aW5kb3pcIAorcHJvdG9jb2wgdXNlZCBmb3IgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIGFwcGxpY2F0aW9ucy4KK0l0IGhhcyBzeW5jaHJvbm91cyBhbmQgYXN5bmNocm9ub3VzIG9wZXJhdGlvbiBtb2Rlcy4KK0RERSBtZWNoYW5pc20gaXMgYmFzZWQgb24gbWVzc2FnZXMsIGF0b21zCisoU2VjdGlvbn5ccmVme3NlYzpXaGF0QXJlQXRvbXN9KSBhbmQgc2hhcmVkIG1lbW9yeS4KKworRERFIGFwcGxpY2F0aW9ucyBhcmUgZGl2aWRlZCByb3VnaGx5IGludG8gdHdvIGNsYXNzZXM6IHNlcnZlcnMgQU5ECitjbGllbnRzLiBDbGllbnRzIGhhdmUgdGhlIGluaXRpYXRpdmUsIHRoZXkgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlCitzZXJ2ZXIuIFNlcnZlcnMgb25seSBtYWludGFpbiBhbiBleGlzdGluZyBEREUgbGluay4KKworCitcc3Vic2VjdGlvbntEREUgTWVzc2FnZXN9CitccGFyYWdyYXBoe0RERSBtZXNzYWdlIGZvcm1hdH06CisKK1xsYWJlbHtzZWM6RERFTWVzc2FnZUZvcm1hdH0KKworRERFIG1lc3NhZ2VzIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHMuCitcYmVnaW57ZGVzY3JpcHRpb259CisgIFxpdGVtW3duZF0gVGhlIHJlY2lwaWVudCBvZiB0aGlzIG1lc3NhZ2UgKCQtMSQgaWYgZXZlcnkgd2luZG93CisgICAgc2hvdWxkIHJlY2VpdmUpLgorICBcaXRlbVttc2ddICAgIFRoZSBJRCBvZiB0aGUgbWVzc2FnZS4KKyAgXGl0ZW1bd1BhcmFtXSBXaG8gc2VudCB0aGlzIG1lc3NhZ2UuCisgIFxpdGVtW2xQYXJhbV0gMzIgYml0IHBhcmFtZXRlciwgZGl2aWRlZCBpbnRvIHR3byAxNiBiaXQgd29yZHMuCisgICAgVXN1YWxseSwgdGhlIGxvd2VyIDE2IGJpdHMgY29udGFpbiBhIG1lbW9yeSBoYW5kbGUuIFRoZSBoYW5kbGUKKyAgICBwb2ludHMgdG8gc29tZSBleHRyYSBEQVRBIGFib3V0IHRoaXMgbWVzc2FnZS4KKyAgICAKK1xlbmR7ZGVzY3JpcHRpb259CisKK1xwYXJhZ3JhcGh7QXZhaWxhYmxlIG1lc3NhZ2VzOn0KK1xiZWdpbntkZXNjcmlwdGlvbn0KKyAgXGl0ZW1bV01cX0RERVxfSU5JVElBVEVdCisgICAgVGhpcyBtZXNzYWdlIGlzIHNlbnQgYnkgdGhlIGNsaWVudCB0byB0aGUgd2hvbGUgYGB3b3JsZCcnLgorICAgIHtcZW0gbFBhcmFtfXt9IGNvbnRhaW5zIHRoZSB0d28gYXRvbXMgdXNlZCBmb3IgcGFzc2luZyB0aGUgdG9waWMgYW5kCisgICAgYXBwbGljYXRpb24gaW5mb3JtYXRpb24uCisKKyAgICBFdmVyeSBzZXJ2ZXIgYXBwbGljYXRpb24gY2hlY2tzIGlmIHRoaXMgbWVzc2FnZSByZWZlcnMgdG8gaXQKKyAgICAoQWNjb3JkaW5nIHRvIHRoZSBBcHBsaWNhdGlvbiBhbmQgdGhlIFRvcGljIGF0b21zKS4KKworCisgIFxpdGVtW1dNXF9EREVcX0FDS10KKyAgICBUaGlzIGlzIGEgZ2VuZXJpYyByZXNwb25zZSB0byB2YXJpb3VzIGV2ZW50cworICAgIChvbmUgb2YgdGhlbSBpcyBXTVxfRERFXF9JTklUSUFURSkuCisgICAgVGhlIGxvdyBwYXJ0IG9mIHtcZW0gbFBhcmFtfXt9IHBhc3NlcyBleHRyYSBpbmZvcm1hdGlvbiwgc3VjaCBhcworICAgIHN1Y2Nlc3MvZmFpbHVyZS4KKworICBcaXRlbVtXTVxfRERFXF9URVJNSU5BVEVdCisgICAgS2lsbCB0aGUgRERFIGxpbmsuCisKKworICBcaXRlbVtXTVxfRERFXF9BRFZJU0VdCisgICAgVGVsbCB0aGUgc2VydmVyIHRvIGluZm9ybSB0aGUgY2xpZW50IG9mIGFueSB1cGRhdGVzLgorCisKKyAgXGl0ZW1bV01cX0RERVxfVU5BRFZJU0VdCisgICAgU3RvcCB0aGUgV01cX0RERVxfVU5BRFZJU0UgbW9kZS4KKworCisgIFxpdGVtW1dNXF9EREVcX0RBVEFdCisgICAgVHJhbnNmZXIgZGF0YSBoYW5kbGUgKG5vdGUgdGhhdCB0aGUgZGF0YSBoYW5kbGUgbXVzdCBiZSBnbG9iYWxseSBhbGxvY2F0ZWQKKyAgICB3aXRoIHRoZSBHTUVNXF9EREVTSEFSRSBmbGFnKS4KKworICBcaXRlbVtXTVxfRERFXF9SRVFVRVNUXQorICAgIFJlcXVlc3QgYSBkYXRhIGl0ZW0gZnJvbSB0aGUgc2VydmVyLiBUaGlzIG1lc3NhZ2UgaXMgdXNlZCBpbiBhCisgICAgY29sZCBsaW5rLiB7XGVtIGxQYXJhbX17fSBjb250YWlucyBhbiBhdG9tIGRlc2NyaWJpbmcgdGhlIGRlc2lyZWQKKyAgICBpdGVtLCBhbmQgYSBXT1JEIGRlc2NyaWJpbmcgdGhlIHdhbnRlZCBkYXRhIGZvcm1hdC4KKyAgXGl0ZW1bV01cX0RERVxfUE9LRV0KKyAgICBUaGUgY2xpZW50IGdpdmVzIHRoZSBzZXJ2ZXIgbmV3IGRhdGEuCisgIFxpdGVtW1dNXF9EREVcX0VYRUNVVEVdCisgICAgVGhlIGNsaWVudCBhc2tzIHRoZSBzZXJ2ZXIgdG8gZXhlY3V0ZSBhIHByb2NlZHVyZSAoYWNjb3JkaW5nIHRvIGEKKyAgICBjb21tYW5kIHN0cmluZykuCisKK1xlbmR7ZGVzY3JpcHRpb259CisKK1xzdWJzZWN0aW9ue0F0b21zfQorXGxhYmVse3NlYzpXaGF0QXJlQXRvbXN9CitBdG9tcyBhcmUgcmVwcmVzZW50ZWQgYnkgbnVtYmVycy4gRXZlcnkgYXRvbSBtYXBzIHVuaXF1ZWx5IHRvIGEgc3RyaW5nCisoaS5lLlwgdHdvIGF0b21zIGNhbid0IG1hcCB0byB0aGUgc2FtZSBzdHJpbmcpLgorVGhlcmUgYXJlIHR3byB0eXBlcyBvZiBhdG9tcyAtIGxvY2FsIGFuZCBnbG9iYWwuIFRoZSBsb2NhbCBhcmUgdmlzaWJsZQorb25seSB0byB0aGUgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVkIHRoZW0uIEdsb2JhbCBhdG9tcyBhcmUgc2VlbiBieSBhbGwKK1x3aW5kb3pcICBhcHBsaWNhdGlvbnMuCisKK0Z1bmN0aW9uczoKK1xiZWdpbntkZXNjcmlwdGlvbn0KKyAgXGl0ZW1bQWRkQXRvbShzdHIpXSAgIGNyZWF0ZSBhIGxvY2FsIGF0b20gdGhhdCBtYXBzIHRvIGBgc3RyJycuCisgICAgSWYgaXQgZXhpc3RzLCBpbmNyZW1lbnQgdGhlIGFsbG9jYXRpb24tY291bnRlciwKKyAgICBhbmQgcmV0dXJuIHRoZSBhdG9tLgorICBcaXRlbVtEZWxldGVBdG9tKGF0b20pXSBkZWNyZW1lbnQgdGhlIGFsbG9jYXRpb24tY291bnRlci4gIFdoZW4gaXQKKyAgICByZWFjaGVzIHplcm8gdGhlIGF0b20sIHdpbGwgYmUgZGVsZXRlZC4KKyAgXGl0ZW1bRmluZEF0b20oc3RyKV0gIEZpbmQgdGhlIGF0b20gdGhhdCBtYXBzIHRvIHRoaXMgc3RyaW5nIChpZiBleGlzdCkuCisgICAgCisgIFxpdGVtW0dldEF0b21OYW1lKFxsZG90cyldIEZpbmQgdGhlIHN0cmluZyB0aGF0IHRoaXMgYXRvbSBwb2ludHMgdG8uCitcZW5ke2Rlc2NyaXB0aW9ufQorCitOT1RFOgorXGJlZ2lue2Rlc2NyaXB0aW9ufQorICBcaXRlbVtHbG9iYWwgYXRvbXNdIEFkZCBgYEdsb2JhbCcnIGJlZm9yZSB0aGUgbGlzdGVkIG5hbWVzIHRvIGdldCBHbG9iYWwKKyAgICBhdG9tIGZ1bmN0aW9ucy4KKyAgXGl0ZW1bQ2FzZSBzZW5zaXRpdml0eV0gQWxsIGF0b20gb3BlcmF0aW9ucyBpZ25vcmUgY2FzZS4KK1xlbmR7ZGVzY3JpcHRpb259CisKKworXHNlY3Rpb257RERFIHVuZGVyIFxXaW5lXCAtIEFsdGVybmF0aXZlc30KK1xsYWJlbHtEREUtQWx0ZXJuYXRpdmVzfQorVGhlcmUgd2hlcmUgdGhyZWUgcG9zc2libGUgYXBwcm9hY2hlcyBmb3IgdGhpcyBwcm9qZWN0LiBJIGhhdmUgY2hvc2VuCitTeXN0ZW0tViBJUEMsIGJ1dCBpdCBjYW4gYmUgZWFzaWx5IGNoYW5nZWQuCisKK1xzdWJzZWN0aW9ue0lQQyAtIEludGVyLVByb2Nlc3MgQ29tbXVuaWNhdGlvbn0KK1xsYWJlbHtzZWM6U3lzVi1JUEN9CisKK1RoZSBJUEMgbWVjaGFuaXNtIHdhcyBvcmlnaW5hdGVkIGZyb20gU3lzdGVtLVYgVU5JWFxALiBUaGlzIG1lY2hhbmlzbQorYWxsb3dzIGNvbXBsaWNhdGUgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHR3byBwcm9jZXNzIChvbiB0aGUgc2FtZSBtYWNoaW5lKS4gCitJUEMgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBjYXBhYmlsaXRpZXM6CitcYmVnaW57ZW51bWVyYXRlfQorICBcaXRlbSBTaGFyZWQgTWVtb3J5IChzaG0pIC0gY2FuIGJlIHNoYXJlZCBhbW9uZyBmZXcgcHJvY2Vzc2VzIGFuZCB1c2Vycy4KKyAgXGl0ZW0gU2VtYXBob3JlcyAoVGhlc2Ugc2VtYXBob3JlcyBhbGxvdyBncm91cGVkIG9wZXJhdGlvbnMgLSBpLmUuXCAKKyAgICBvcGVyYXRpb25zIGdhdGhlcmVkIGFzIGFuIGF0b21pYyBvcGVyYXRpb24pLgorICBcaXRlbSBNZXNzYWdlIFF1ZXVlcyAoYWxsb3cgZmV3IG1lc3NhZ2VzIGF0IGEgdGltZSkuCitcZW5ke2VudW1lcmF0ZX0KKworVGhlIGFkdmFudGFnZXMgb2YgSVBDIG92ZXIgdGhlIG90aGVyIHZhcmlhbnRzIGFyZToKK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBNZW1vcnkgYWNjZXNzIHNwZWVkIGlzIGdvb2QuIChhZnRlciB0aGUgbWVtb3J5IHdhcyBhdHRhY2hlZCkuCisgIFxpdGVtIEVhc3kgdG8gYmxvY2sgY3JpdGljYWwgY29kZSAoZG9uJ3QgZW50ZXIgY3JpdGljYWwgY29kZSBmcm9tIHR3bworICAgIHByb2Nlc3NlcyBhdCB0aGUgc2FtZSB0aW1lKQorXGVuZHtpdGVtaXplfQorRGlzYWR2YW50YWdlcyBvZiBJUEM6CitcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0gSW1wb3NzaWJsZSB0byBjb21tdW5pY2F0ZSB0byBvdGhlciBtYWNoaW5lLgorICBcaXRlbSBSZXF1aXJlcyBjb21wbGV4IG1lY2hhbmlzbSB0byB3YWl0IGJvdGggZm9yIFggYW5kIElQQyBtZXNzYWdlcy4KK1xlbmR7aXRlbWl6ZX0KKworXHN1YnNlY3Rpb257WC1XaW5kb3dzIENvbW11bmljYXRpb24gbWVjaGFuaXNtc30KK1RoZSBhZHZhbnRhZ2VzIG9mIFgtV2luZG93cyBDb21tdW5pY2F0aW9uIG92ZXIgdGhlIG90aGVyIHZhcmlhbnRzIGFyZToKK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBQb3NzaWJsZSB0byBjb21tdW5pY2F0ZSB0byBvdGhlciBtYWNoaW5lcy4KKyAgXGl0ZW0gTm8gbmVlZCBmb3IgYWRkaXRpb25hbCBtZWNoYW5pc20gdGhhdCB3aWxsIHdhaXQgYm90aCBmb3IgWCBhbmQgRERFXEAuCisgIFxpdGVtIE1hbnkgb2YgdGhlIHJlcXVpcmVkIGNhcGFiaWxpdGllcyBhcmUgYWxyZWFkeSB0aGVyZS4KK1xlbmR7aXRlbWl6ZX0KK0Rpc2FkdmFudGFnZXMgb2YgWC13aW5kb3dzIGNvbW11bmljYXRpb246CitcYmVnaW57aXRlbWl6ZX0KKyAgXGl0ZW0ge1xlbSBTbG93fVwgYW5kIGNvbXBsZXggbWVtb3J5IGFjY2Vzcy4KKyAgXGl0ZW0gTWF5IGJlIGhhcmQgdG8gYXZvaWQgdHdvIGFwcGxpY2F0aW9ucyBmcm9tIGVudGVyaW5nIGNyaXRpY2FsCisgICAgY29kZSBhdCB0aGUgc2FtZSB0aW1lLgorXGVuZHtpdGVtaXplfQorCitcc3Vic2VjdGlvbntCU0QgU29ja2V0c30KK1RoZSBhZHZhbnRhZ2VzIG9mIFNvY2tldHMgYXJlOgorXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIFBvc3NpYmxlIHRvIGNvbW11bmljYXRlIHRvIG90aGVyIG1hY2hpbmVzLgorICBcaXRlbSBObyBuZWVkIGZvciBjb21wbGV4IG1lY2hhbmlzbSB0aGF0IHdpbGwgd2FpdCBib3RoIGZvciBYIGFuZAorICAgIERERVxALiAoY2FuIHVzZSBvbmUgYGBzZWxlY3QnJyBvbiBYLXdpbmRvd3Mgc29ja2V0IGluIGNvbmNlcnQgd2l0aAorICAgIHRoZSBEREUgc29ja2V0KS4KK1xlbmR7aXRlbWl6ZX0KK0Rpc2FkdmFudGFnZXMgb2Ygc29ja2V0IGFyZToKK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSB7XGVtIFNsb3d9e30gYW5kIGNvbXBsZXggbWVtb3J5IGFjY2Vzcy4gKG5vdGUgdGhhdCBtbWFwIG9uIGEKKyAgICBkZXNjcmlwdG9yIGRvZXMgbm90IHdvcmsgZm9yIExpbnV4IDAuOTkpLgorICBcaXRlbSBNYXkgYmUgaGFyZCB0byBhdm9pZCB0d28gYXBwbGljYXRpb25zIGZyb20gZW50ZXJpbmcgY3JpdGljYWwKKyAgICBjb2RlIGF0IHRoZSBzYW1lIHRpbWUuCitcZW5ke2l0ZW1pemV9CisKK1xzdWJzZWN0aW9ue1doeSB3YXMgaXQgd3JpdHRlbiBpbiBDPyBQcm9zIGFuZCBjb25zLn0KK0FkdmFudGFnZXMgb2YgQzoKKworXGJlZ2lue2l0ZW1pemV9CisgIFxpdGVtIEhpc3RvcnktIFxXaW5le30gaXMgYWxyZWFkeSB3cml0dGVuIGluIEMuCisgIFxpdGVtIFBvcnRhYmlsaXR5LSBub3QgYWxsIHN5c3RlbXMgaGF2ZSBDKysuCisgIFxpdGVtIFNwZWVkLSBDKysgc29tZXRpbWVzIG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0IHRvIHdyaXRlIGZhc3QgY29kZS4KKyAgXGl0ZW0gTWFpbnRlbmFuY2UtIE1vcmUgcHJvZ3JhbW1lcnMga25vdyBDIHRoYW4gQysrLiAKK1xlbmR7aXRlbWl6ZX0KKworQWR2YW50YWdlcyBvZiBDKys6CisKK1xiZWdpbntpdGVtaXplfQorICBcaXRlbSBzbWFsbGVyIGNvZGUgLSBUZW1wbGF0ZXMgYWxsb3cgU21hbGxlciBhbmQgbW9yZSByZWFkYWJsZSBjb2RlLgorICBcaXRlbSBNYWludGVuYW5jZSAtIEl0IGlzIGVhc2llciB0byBhZGQgYW5kIG1vZGlmeSBjb2RlIGluIEMrKyAodGhhbiBpbiBDKS4KKyAgXGl0ZW0gVmVyaWZpY2F0aW9uIC0gRnVuY3Rpb25hbGl0eSBjYW4gYmUgdmVyaWZpZWQgYW5kIGRlYnVnZ2VkIGZvcgorICAgIGluZGl2aWR1YWwgb2JqZWN0cy4KK1xlbmR7aXRlbWl6ZX0KKworSSBoYXZlIGRlY2lkZWQgdG8gdXNlIEMuIE1vc3Qgb2YgQysrIGFkdmFudGFnZXMgY2FuIGJlIGFjcXVpcmVkCitieSB1c2luZyBPT1AgbWV0aG9kb2xvZ2llcy4gT09QIG1ldGhvZHMgdGhhdCByZXF1aXJlIGlubGluZSBmdW5jdGlvbnMKK2Nhbid0IGJlIHVzZWQgKHdpdGhvdXQgcGVyZm9ybWFuY2UgaW1wYWN0KS4gR0NDIHN1cHBvcnRzIGlubGluZSBmdW5jdGlvbnMsCitidXQgdGhpcyBzb2x1dGlvbiBpcyBub3QgY29tcGF0aWJsZS4KKworCisKK1xzZWN0aW9ue1xXaW5lXCBiYXNpY3N9Citcc3Vic2VjdGlvbntIb3cgaXQgcnVuc30KK1xXaW5lXCB3b3JrcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgorXGJlZ2lue2VudW1lcmF0ZX0KKyAgXGl0ZW0gXFdpbmVcIGxvYWRzIHRoZSBcd2luZG96XCAgYXBwbGljYXRpb24gaW50byBpdCdzIG1lbW9yeS4KKyAgICAoaW4gdGhlIHByb2Nlc3MgaXQsIGxpbmtzCisgICAgRExMJ3NcZm9vdG5vdGV7RExMIChEeW5hbWljYWxseSBMaW5rZWQgTGlicmFyeSkgaXMgbGlua2VkIG9uIGxvYWQtdGltZS59CisgICAgY3JlYXRlcyAxNi1iaXQgc2VnbWVudHMpLgorICBcaXRlbSBcd2luZG96XCAgY29kZSBpcyBleGVjdXRlZC4KK1xlbmR7ZW51bWVyYXRlfQorCitcc2VjdGlvbntiaWJsaW9ncmFwaHl9CitcYmVnaW57dGhlYmlibGlvZ3JhcGh5fXs5OX0KKyAgXGJpYml0ZW17YmliOldpbk1hbnVhbH0gQ2hhcmxlcyBQZXR6b2xkIHtcZW0gIFByb2dyYW1taW5nCisgICAgICBXaW5kb3dzfjMuMX17fSAtIDE5OTIuIFxcIAorICAgIE9uIGNvdmVyOiB7XGVtIHRoZSBNaWNyb3NvZnQgZ3VpZGUgdG8gd3JpdGluZyBhcHBsaWNhdGlvbnMgZm9yCisgICAgICB3aW5kb3dzfjMuMX0uIFxcCisgICAgUHVibGlzaGVkIGJ5IHtcZW0gTWljcm9zb2Z0IHByZXNzfS4gCitcZW5ke3RoZWJpYmxpb2dyYXBoeX0KKworCitcbmV3cGFnZQorCisKK1xlbmR7ZG9jdW1lbnR9CmRpZmYgLS1naXQgYS9pcGMvZGRlX2F0b20uYyBiL2lwYy9kZGVfYXRvbS5jCmluZGV4IGUwNzY5MGMuLjVjYTliNDIgMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfYXRvbS5jCisrKyBiL2lwYy9kZGVfYXRvbS5jCkBAIC02LDYgKzYsNyBAQAogICogRmlsZTogICAgICBkZGVfYXRvbS5jCiAgKiBQdXJwb3NlIDogIGF0b20gZnVuY3Rpb25hbGl0eSBmb3IgRERFCiAgKi8KKyNpZmRlZiBDT05GSUdfSVBDCiAKICNpbmNsdWRlIDxjdHlwZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtMTA2LDExICsxMDcsMTEgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2xvYmFsQWRkQXRvbSAgIChVU0VSLjI2OCkKKyAqICAgICAgICAgICBEREVfR2xvYmFsQWRkQXRvbQogICovCiAKIC8qIGltcG9ydGFudCEgZG9uJ3QgZm9yZ2V0IHRvIHVubG9jayBzZW1hcGhvcmVzIGJlZm9yZSByZXR1cm4gKi8KLUFUT00gR2xvYmFsQWRkQXRvbSggU0VHUFRSIG5hbWUgKQorQVRPTSBEREVfR2xvYmFsQWRkQXRvbSggU0VHUFRSIG5hbWUgKQogewogICBpbnQgYXRvbV9pZHg7CiAgIGludCBhdG9tX29mczsKQEAgLTE2NCwxMCArMTY1LDEwIEBACiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdsb2JhbERlbGV0ZUF0b20gICAoVVNFUi4yNjkpCisgKiAgICAgICAgICAgRERFX0dsb2JhbERlbGV0ZUF0b20KICAqLwogCi1BVE9NIEdsb2JhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApCitBVE9NIERERV9HbG9iYWxEZWxldGVBdG9tKCBBVE9NIGF0b20gKQogewogICBpbnQgYXRvbV9pZHg7CiAgIGludCBhdG9tX29mczsKQEAgLTIwMyw5ICsyMDQsOSBAQAogfQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBHbG9iYWxGaW5kQXRvbSAgIChVU0VSLjI3MCkKKyAqICAgICAgICAgICBEREVfR2xvYmFsRmluZEF0b20KICAqLwotQVRPTSBHbG9iYWxGaW5kQXRvbSggU0VHUFRSIG5hbWUgKQorQVRPTSBEREVfR2xvYmFsRmluZEF0b20oIFNFR1BUUiBuYW1lICkKIHsKICAgaW50IGF0b21faWR4OwogICBpbnQgYXRvbV9vZnM7CkBAIC0yNDIsOSArMjQzLDkgQEAKIH0KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgICAgICAgICAgR2xvYmFsR2V0QXRvbU5hbWUgICAoVVNFUi4yNzEpCisgKiAgICAgICAgICAgRERFX0dsb2JhbEdldEF0b21OYW1lCiAgKi8KLVdPUkQgR2xvYmFsR2V0QXRvbU5hbWUoIEFUT00gYXRvbSwgTFBTVFIgYnVmZmVyLCBzaG9ydCBjb3VudCApCitXT1JEIERERV9HbG9iYWxHZXRBdG9tTmFtZSggQVRPTSBhdG9tLCBMUFNUUiBidWZmZXIsIHNob3J0IGNvdW50ICkKIHsKICAgaW50IGF0b21faWR4LCBhdG9tX29mczsKICAgaW50IHNpemU7CkBAIC0yODMsMyArMjg0LDQgQEAKICAgcmV0dXJuIHNpemU7CiB9CiAKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwpkaWZmIC0tZ2l0IGEvaXBjL2RkZV9tZW0uYyBiL2lwYy9kZGVfbWVtLmMKaW5kZXggZjE5YjAxMy4uNWU5YzAzZCAxMDA2NDQKLS0tIGEvaXBjL2RkZV9tZW0uYworKysgYi9pcGMvZGRlX21lbS5jCkBAIC03LDYgKzcsOCBAQAogICogUHVycG9zZSA6ICBzaGFyZWQgRERFIG1lbW9yeSBmdW5jdGlvbmFsaXR5IGZvciBEREUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLworI2lmZGVmIENPTkZJR19JUEMKKwogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3RkZGVidWcuaD4KICNpbmNsdWRlIDxkZWJ1Zy5oPgpAQCAtMjgwLDMgKzI4Miw1IEBACiAgIG5yX29mX2JpdHM9IEJJVFNfUEVSX0JZVEUgKiBzaXplb2YobWFpbl9ibG9jay0+ZnJlZV9oYW5kbGVzKTsKICAgQXNzZW1ibGVBcnJheSggJmZyZWVfaGFuZGxlcywgbWFpbl9ibG9jay0+ZnJlZV9oYW5kbGVzLCBucl9vZl9iaXRzKTsKIH0KKworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCmRpZmYgLS1naXQgYS9pcGMvZGRlX3Byb2MuYyBiL2lwYy9kZGVfcHJvYy5jCmluZGV4IDlmNWY1OWUuLmRmNmU2YTggMTAwNjQ0Ci0tLSBhL2lwYy9kZGVfcHJvYy5jCisrKyBiL2lwYy9kZGVfcHJvYy5jCkBAIC03LDYgKzcsMTIgQEAKICAqIFB1cnBvc2UgOiAgRERFIHNpZ25hbHMgYW5kIHByb2Nlc3NlcyBmdW5jdGlvbmFsaXR5IGZvciBEREUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLworI2lmZGVmIENPTkZJR19JUEMKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykKKyNkZWZpbmUgbXNnYnVmIG15bXNnCisjZW5kaWYKKwogI2luY2x1ZGUgPHN5cy90aW1lLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC03MTYsMyArNzIyLDQgQEAKICAgfQogfQogCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KZGlmZiAtLWdpdCBhL2lwYy9nZW5lcmljX2hhc2guYyBiL2lwYy9nZW5lcmljX2hhc2guYwppbmRleCBmNWUwZjQ0Li5kZjA0NDliIDEwMDY0NAotLS0gYS9pcGMvZ2VuZXJpY19oYXNoLmMKKysrIGIvaXBjL2dlbmVyaWNfaGFzaC5jCkBAIC01LDYgKzUsOCBAQAogICogUHVycG9zZSA6ICBkeW5hbWljYWxseSBncm93aW5nIGhhc2gsIG1heSB1c2Ugc2hhcmVkIG9yIGxvY2FsIG1lbW9yeS4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLworI2lmZGVmIENPTkZJR19JUEMKKwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGFzc2VydC5oPgpAQCAtNjc3LDMgKzY3OSw1IEBACiB7CiAgICByZXR1cm4gcHRyLnB0cjsKIH0KKworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCmRpZmYgLS1naXQgYS9pcGMvc2htX2Jsb2NrLmMgYi9pcGMvc2htX2Jsb2NrLmMKaW5kZXggNzdmZjc2Ni4uMjU5Mzc4ZiAxMDA2NDQKLS0tIGEvaXBjL3NobV9ibG9jay5jCisrKyBiL2lwYy9zaG1fYmxvY2suYwpAQCAtNyw2ICs3LDcgQEAKICAqIFB1cnBvc2U6ICAgVHJlYXQgYSBzaGFyZWQgbWVtb3J5IGJsb2NrLgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICovCisjaWZkZWYgQ09ORklHX0lQQwogCiAjZGVmaW5lIGlubGluZSBfX2lubGluZV9fCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC03Niw3ICs3Nyw3IEBACiAgIHNobWN0bChzaG1faWQsIElQQ19TVEFULCAmZHMgKTsKIAogICBibG9jaz0oc3RydWN0IHNobV9ibG9jayopc2htYXQoc2htX2lkLCBOVUxMLCAwKTsKLSAgaWYgKGJsb2NrPT1OVUxMKSByZXR1cm4gTlVMTDsKKyAgaWYgKGJsb2NrPT1OVUxMIHx8IGJsb2NrID09IChzdHJ1Y3Qgc2htX2Jsb2NrKikgLTEpIHJldHVybiBOVUxMOwogCiAgIHRoaXM9KHN0cnVjdCBsb2NhbF9zaG1fbWFwICopbWFsbG9jKHNpemVvZigqdGhpcykpOwogICB0aGlzLT5uZXh0PSBzaG1fbWFwOwpAQCAtMTkwLDMgKzE5MSw1IEBACiAgICpzaG1pZD0tMTsKICAgc2htZHQoKGNoYXIgKilibG9jayk7CiB9CisKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwpkaWZmIC0tZ2l0IGEvaXBjL3NobV9mcmFnbWVudC5jIGIvaXBjL3NobV9mcmFnbWVudC5jCmluZGV4IDA5OGQ2Y2MuLjE1YzUxZmUgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fZnJhZ21lbnQuYworKysgYi9pcGMvc2htX2ZyYWdtZW50LmMKQEAgLTcsNiArNyw4IEBACiAgKiBQdXJwb3NlOiAgIERhdGEgZnJhZ21lbnRzIGFuZCBmcmVlIGxpc3QgaXRlbXMuIEFsbG9jYXRlIGFuZCBmcmVlIGJsb2Nrcy4KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLworI2lmZGVmIENPTkZJR19JUEMKKwogI2luY2x1ZGUgPHN0ZGlvLmg+CQkgICAvKiBmb3IgZGVidWdnaW5nIG9ubHkgKi8KICNpbmNsdWRlIDxzdGRkZWJ1Zy5oPgogI2luY2x1ZGUgPGRlYnVnLmg+CQkgICAvKiBmb3IgInN0ZGRlYiIgKi8KQEAgLTE3NiwzICsxNzgsNSBAQAogICBmcHJpbnRmKHN0ZGRlYiwiIFt0b3RhbCBmcmVlPSUwNHhdXG4iLGJsb2NrLT5mcmVlKTsKICAgZmZsdXNoKHN0ZGRlYik7CiB9CisKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwpkaWZmIC0tZ2l0IGEvaXBjL3NobV9tYWluX2Jsay5jIGIvaXBjL3NobV9tYWluX2Jsay5jCmluZGV4IDk2YjQ2ODEuLmZkYzIzMDcgMTAwNjQ0Ci0tLSBhL2lwYy9zaG1fbWFpbl9ibGsuYworKysgYi9pcGMvc2htX21haW5fYmxrLmMKQEAgLTcsNiArNyw4IEBACiAgKiBQdXJwb3NlOiAgIE1haW4gV2luZSdzIHNoYXJlZCBtZW1vcnkgYmxvY2sKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqLworI2lmZGVmIENPTkZJR19JUEMKKwogI2RlZmluZSBpbmxpbmUgX19pbmxpbmVfXwogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zZW0uaD4KQEAgLTI2NSwzICsyNjcsNSBAQAogICBmb3IgKHByb2NfaWR4PSAwIDsgcHJvY19pZHggPCBEREVfUFJPQ1MgOyBwcm9jX2lkeCsrKQogICAgICBkZGVfcHJvY19yZWZyZXNoKCAmbWFpbl9ibG9jay0+cHJvY1twcm9jX2lkeF0gKTsKIH0KKworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCmRpZmYgLS1naXQgYS9pcGMvc2htX3NlbWFwaC5jIGIvaXBjL3NobV9zZW1hcGguYwppbmRleCBjMjI2ODA4Li5mNzMwMTU0IDEwMDY0NAotLS0gYS9pcGMvc2htX3NlbWFwaC5jCisrKyBiL2lwYy9zaG1fc2VtYXBoLmMKQEAgLTcsNiArNyw4IEBACiAgKiBQdXJwb3NlOiAgIEhhbmRsZSBzZW1hcGhvcmVzIGZvciBzaGFyZWQgbWVtb3J5IG9wZXJhdGlvbnMuCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKi8KKyNpZmRlZiBDT05GSUdfSVBDCisKICNkZWZpbmUgaW5saW5lIF9faW5saW5lX18KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTEzNCwzICsxMzYsNSBAQAogCiAgICpzZW1wdHI9IC0xOwogfQorCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KZGlmZiAtLWdpdCBhL2lwYy93aW5lX3Rlc3Rfc3R1Yi5jIGIvaXBjL3dpbmVfdGVzdF9zdHViLmMKaW5kZXggZmIxNzQ3ZS4uZGQ5NDk5YyAxMDA2NDQKLS0tIGEvaXBjL3dpbmVfdGVzdF9zdHViLmMKKysrIGIvaXBjL3dpbmVfdGVzdF9zdHViLmMKQEAgLTIzLDcgKzIzLDcgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50IExEVF9TZXRFbnRyeSggaW50IGVudHJ5LCBsZHRfZW50cnkgKmNvbnRlbnQgKQoraW50IExEVF9TZXRFbnRyeSggaW50IGVudHJ5LCBsZHRfZW50cnkgY29uc3QgKmNvbnRlbnQgKQogewogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbG9hZGVyL01ha2VmaWxlLmluIGIvbG9hZGVyL01ha2VmaWxlLmluCmluZGV4IGYyNTAxMjAuLmJmM2U0Y2YgMTAwNjQ0Ci0tLSBhL2xvYWRlci9NYWtlZmlsZS5pbgorKysgYi9sb2FkZXIvTWFrZWZpbGUuaW4KQEAgLTI4LDcgKzI4LDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9sb2FkZXIvbWFpbi5jIGIvbG9hZGVyL21haW4uYwppbmRleCAzODRlM2YzLi45YmIwMTg1IDEwMDY0NAotLS0gYS9sb2FkZXIvbWFpbi5jCisrKyBiL2xvYWRlci9tYWluLmMKQEAgLTY2LDYgKzY2LDkgQEAKICAgICAgIC8qIEluaXRpYWxpemUgaW50ZXJydXB0IHZlY3RvcnMgKi8KICAgICBpZiAoIUlOVF9Jbml0KCkpIHJldHVybiAwOwogCisgICAgICAvKiBJbml0aWFsaXplIERPUyBtZW1vcnkgKi8KKyAgICBpZiAoIURPU01FTV9Jbml0KCkpIHJldHVybiAwOworCiAgICAgICAvKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZyAqLwogICAgIGluaXRfd2luZV9zaWduYWxzKCk7CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9tb2R1bGUuYyBiL2xvYWRlci9tb2R1bGUuYwppbmRleCA0NTg5MWIzLi5mNTE4ZTZjIDEwMDY0NAotLS0gYS9sb2FkZXIvbW9kdWxlLmMKKysrIGIvbG9hZGVyL21vZHVsZS5jCkBAIC0zOSw3ICszOSw2IEBACiAgICAgTkVfTU9EVUxFICpwTW9kdWxlOwogICAgIFNFR1RBQkxFRU5UUlkgKnBTZWdUYWJsZTsKICAgICBzdHJ1Y3QgZGxsX3RhYmxlX3MgKnRhYmxlOwotICAgIGNoYXIgKmRvc21lbTsKICAgICBpbnQgaTsKIAogICAgICAgLyogQ3JlYXRlIHRoZSBidWlsdC1pbiBtb2R1bGVzICovCkBAIC04Miw0NyArODEsMTAgQEAKICAgICAgICAgaEZpcnN0TW9kdWxlID0gaE1vZHVsZTsKICAgICB9CiAKLSAgICAgIC8qIEluaXRpYWxpemUgc29tZSBLRVJORUwgZXhwb3J0ZWQgdmFsdWVzICovCisgICAgLyogSW5pdGlhbGl6ZSBLRVJORUwuMTc4IChfX1dJTkZMQUdTKSB3aXRoIHRoZSBjb3JyZWN0IGZsYWdzIHZhbHVlICovCiAKLSAgICBpZiAoIShoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAiS0VSTkVMIiApKSkgcmV0dXJuIFRSVUU7CisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIEdldE1vZHVsZUhhbmRsZSggIktFUk5FTCIgKSwgMTc4LCBHZXRXaW5GbGFncygpICk7CiAKLSAgICAgIC8qIEtFUk5FTC4xNzg6IF9fV0lORkxBR1MgKi8KLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTc4LCBHZXRXaW5GbGFncygpICk7Ci0KLSAgICAvKiBBbGxvY2F0ZSA3IDY0ayBzZWdtZW50cyBmb3IgMDAwMCwgQTAwMCwgQjAwMCwgQzAwMCwgRDAwMCwgRTAwMCwgRjAwMC4gKi8KLQotICAgIGRvc21lbSA9IG1hbGxvYyggMHg3MDAwMCApOwotCi0gICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE4MywgIC8qIEtFUk5FTC4xODM6IF9fMDAwMEggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7Ci0gICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE5MywgIC8qIEtFUk5FTC4xOTM6IF9fMDA0MEggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDQwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTc0LCAgLyogS0VSTkVMLjE3NDogX19BMDAwSCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4MTAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7Ci0gICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE4MSwgIC8qIEtFUk5FTC4xODE6IF9fQjAwMEggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDIwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpOwotICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxODIsICAvKiBLRVJORUwuMTgyOiBfX0I4MDBIICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHgyODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTk1LCAgLyogS0VSTkVMLjE5NTogX19DMDAwSCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4MzAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7Ci0gICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE3OSwgIC8qIEtFUk5FTC4xNzk6IF9fRDAwMEggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDQwMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpOwotICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTAsICAvKiBLRVJORUwuMTkwOiBfX0UwMDBIICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg1MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTczLCAgLyogS0VSTkVMLjE3MzogX19ST01CSU9TICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg2MDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKLSAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTk0LCAgLyogS0VSTkVMLjE5NDogX19GMDAwSCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4NjAwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7CiAgICAgcmV0dXJuIFRSVUU7CiB9CiAKZGlmZiAtLWdpdCBhL2xvYWRlci9uZV9pbWFnZS5jIGIvbG9hZGVyL25lX2ltYWdlLmMKaW5kZXggMmE0ZTllYS4uMTQ1MGMwYSAxMDA2NDQKLS0tIGEvbG9hZGVyL25lX2ltYWdlLmMKKysrIGIvbG9hZGVyL25lX2ltYWdlLmMKQEAgLTM5LDYgKzM5LDggQEAKICAgICBpbnQgZmQ7CiAgICAgc3RydWN0IHJlbG9jYXRpb25fZW50cnlfcyAqcmVwLCAqcmVsb2NfZW50cmllczsKICAgICBCWVRFICpmdW5jX25hbWU7CisgICAgaW50IHNpemU7CisgICAgY2hhciogbWVtOwogCiAgICAgY2hhciBidWZmZXJbMTAwXTsKICAgICBpbnQgb3JkaW5hbCwgYWRkaXRpdmU7CkBAIC01MSwyMyArNTMsMzcgQEAKIAogICAgIGlmICghcFNlZy0+ZmlsZXBvcykgcmV0dXJuIFRSVUU7ICAvKiBObyBmaWxlIGltYWdlLCBqdXN0IHJldHVybiAqLwogCQotCWlmIChwU2VnLT5mbGFncyAmIE5FX1NFR0ZMQUdTX0lURVJBVEVEKQotCXsKLQkJZnByaW50ZihzdGRlcnIsICJTb3JyeSwgaXRlcmF0ZWQgc2VnbWVudHMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIKLQkJCSJQbGVhc2UgcmVwb3J0IHRoYXQgJSouKnMsIHNlZ21lbnQgJWQgaXMgc3VjaCBhIHNlZ21lbnRcbiIsCi0JCQkqKChCWVRFKilwTW9kdWxlICsgcE1vZHVsZS0+bmFtZV90YWJsZSksIAotCQkJKigoQllURSopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUpLCAKLQkJCShjaGFyICopcE1vZHVsZSArIHBNb2R1bGUtPm5hbWVfdGFibGUgKyAxLAotCQkJc2VnbnVtCi0JCSk7Ci0JCWV4aXQoMSk7Ci0JfQotCiAgICAgZmQgPSBNT0RVTEVfT3BlbkZpbGUoIGhNb2R1bGUgKTsKICAgICBkcHJpbnRmX21vZHVsZSggc3RkZGViLCAiTG9hZGluZyBzZWdtZW50ICVkLCBzZWxlY3Rvcj0lMDR4XG4iLAogICAgICAgICAgICAgICAgICAgICBzZWdudW0sIHBTZWctPnNlbGVjdG9yICk7CiAgICAgbHNlZWsoIGZkLCBwU2VnLT5maWxlcG9zIDw8IHBNb2R1bGUtPmFsaWdubWVudCwgU0VFS19TRVQgKTsKLSAgICByZWFkKCBmZCwgR2xvYmFsTG9jayggcFNlZy0+c2VsZWN0b3IgKSwgcFNlZy0+c2l6ZSA/IHBTZWctPnNpemUgOiAweDEwMDAwKTsKKyAgICBzaXplID0gcFNlZy0+c2l6ZSA/IHBTZWctPnNpemUgOiAweDEwMDAwOworICAgIG1lbSA9IEdsb2JhbExvY2socFNlZy0+c2VsZWN0b3IpOworICAgIGlmICghKHBTZWctPmZsYWdzICYgTkVfU0VHRkxBR1NfSVRFUkFURUQpKQorICAgICAgcmVhZChmZCwgbWVtLCBzaXplKTsKKyAgICBlbHNlIHsKKyAgICAgIC8qCisJIFRoZSBmb2xsb3dpbmcgYml0IG9mIGNvZGUgZm9yICJpdGVyYXRlZCBzZWdtZW50cyIgd2FzIHdyaXR0ZW4gd2l0aG91dAorCSBhbnkgZG9jdW1lbnRhdGlvbiBvbiB0aGUgZm9ybWF0IG9mIHRoZXNlIHNlZ21lbnRzLiBJdCBzZWVtcyB0byB3b3JrLAorCSBidXQgbWF5IGJlIG1pc3Npbmcgc29tZXRoaW5nLiBJZiB5b3UgaGF2ZSBhbnkgZG9jbyBwbGVhc2UgZWl0aGVyIHNlbmQKKwkgaXQgdG8gbWUgb3IgZml4IHRoZSBjb2RlIHlvdXJzZWxmLiBnZm1Ad2VycGxlLm1pcmEubmV0LmF1CisgICAgICAqLworICAgICAgY2hhciogYnVmZiA9IG1hbGxvYyhzaXplKTsKKyAgICAgIGNoYXIqIGN1cnIgPSBidWZmOworICAgICAgcmVhZChmZCwgYnVmZiwgc2l6ZSk7CisgICAgICB3aGlsZShjdXJyIDwgYnVmZiArIHNpemUpIHsKKwl1bnNpZ25lZCBpbnQgcmVwdCA9ICooKHNob3J0KikgY3VycikrKzsKKwl1bnNpZ25lZCBpbnQgbGVuID0gKigoc2hvcnQqKSBjdXJyKSsrOworCWZvcig7IHJlcHQgPiAwOyByZXB0LS0pIHsKKwkgIGNoYXIqIGJ5dGVzID0gY3VycjsKKwkgIHVuc2lnbmVkIGludCBieXRlOworCSAgZm9yKGJ5dGUgPSAwOyBieXRlIDwgbGVuOyBieXRlKyspCisJICAgICptZW0rKyA9ICpieXRlcysrOworCX0KKwljdXJyICs9IGxlbjsKKyAgICAgIH0KKyAgICAgIGZyZWUoYnVmZik7CisgICAgfQogCiAgICAgaWYgKCEocFNlZy0+ZmxhZ3MgJiBORV9TRUdGTEFHU19SRUxPQ19EQVRBKSkKICAgICAgICAgcmV0dXJuIFRSVUU7ICAvKiBObyByZWxvY2F0aW9uIGRhdGEsIHdlIGFyZSBkb25lICovCmRpZmYgLS1naXQgYS9sb2FkZXIvc2lnbmFsLmMgYi9sb2FkZXIvc2lnbmFsLmMKaW5kZXggODJkOTY1MS4uZDk0M2JjNSAxMDA2NDQKLS0tIGEvbG9hZGVyL3NpZ25hbC5jCisrKyBiL2xvYWRlci9zaWduYWwuYwpAQCAtODAsMTkgKzgwLDIxIEBACiAJICAgaXQgYWxpZ25lZCAgKi8KIAlzZWd2X2FjdC5zYV9yZXN0b3JlciA9IAogCSAgICAodm9pZCAoKikoKSkgKCgodW5zaWduZWQgaW50KShjc3RhY2spICsgc2l6ZW9mKGNzdGFjaykgLSA0KSAmIH4zKTsKLQl1c3IyX2FjdC5zYV9yZXN0b3Jlcj0gc2Vndl9hY3Quc2FfcmVzdG9yZXI7Ci0JdXNyMl9hY3Quc2FfaGFuZGxlciA9IChfX3NpZ2hhbmRsZXJfdCkgc3RvcF93YWl0OwogCS8qIFBvaW50IHRvIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBtaW51cyA0IGp1c3QgaW4gY2FzZSwgYW5kIG1ha2UKIAkgICBpdCBhbGlnbmVkICAqLwogCXdpbmVfc2lnYWN0aW9uKFNJR1NFR1YsICZzZWd2X2FjdCwgTlVMTCk7CiAJd2luZV9zaWdhY3Rpb24oU0lHSUxMLCAmc2Vndl9hY3QsIE5VTEwpOwogCXdpbmVfc2lnYWN0aW9uKFNJR0ZQRSwgJnNlZ3ZfYWN0LCBOVUxMKTsKLQl3aW5lX3NpZ2FjdGlvbihTSUdVU1IyLCAmdXNyMl9hY3QsIE5VTEwpOwogI2lmZGVmIFNJR0JVUwogCXdpbmVfc2lnYWN0aW9uKFNJR0JVUywgJnNlZ3ZfYWN0LCBOVUxMKTsKICNlbmRpZgogCXdpbmVfc2lnYWN0aW9uKFNJR1RSQVAsICZzZWd2X2FjdCwgTlVMTCk7IC8qIEZvciBicmVha3BvaW50cyAqLwotI2VuZGlmCisjaWZkZWYgQ09ORklHX0lQQworCXVzcjJfYWN0LnNhX3Jlc3RvcmVyPSBzZWd2X2FjdC5zYV9yZXN0b3JlcjsKKwl1c3IyX2FjdC5zYV9oYW5kbGVyID0gKF9fc2lnaGFuZGxlcl90KSBzdG9wX3dhaXQ7CisJd2luZV9zaWdhY3Rpb24oU0lHVVNSMiwgJnVzcjJfYWN0LCBOVUxMKTsKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLworI2VuZGlmICAvKiBsaW51eCAqLwogI2lmIGRlZmluZWQoX19OZXRCU0RfXykgfHwgZGVmaW5lZChfX0ZyZWVCU0RfXykKICAgICAgICAgc2lnc2V0X3Qgc2lnX21hc2s7CiAgICAgICAgIHN0cnVjdCBzaWdhbHRzdGFjayBzczsKQEAgLTEzNCw2ICsxMzYsNyBAQAogICAgICAgICAgICAgICAgIHBlcnJvcigic2lnYWN0aW9uOiBTSUdUUkFQIik7CiAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgfQorI2lmZGVmIENPTkZJR19JUEMKICAgICAgICAgdXNyMl9hY3Quc2FfaGFuZGxlciA9ICh2b2lkICgqKSkgc3RvcF93YWl0OyAvKiBGb3IgYnJlYWtwb2ludHMgKi8KIAl1c3IyX2FjdC5zYV9mbGFncyA9IFNBX09OU1RBQ0s7CiAgICAgICAgIHVzcjJfYWN0LnNhX21hc2sgPSBzaWdfbWFzazsKQEAgLTE0MSw3ICsxNDQsOCBAQAogICAgICAgICAgICAgICAgIHBlcnJvcigic2lnYWN0aW9uOiBTSUdVU1IyIik7CiAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgfQotI2VuZGlmCisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KKyNlbmRpZiAgLyogX19GcmVlQlNEX18gfHwgX19OZXRCU0RfXyAqLwogfQogCiAjZW5kaWYgLyogaWZuZGVmIFdJTkVMSUIgKi8KZGlmZiAtLWdpdCBhL2xvYWRlci90YXNrLmMgYi9sb2FkZXIvdGFzay5jCmluZGV4IDczNTA5NjUuLmIyMTgwZjQgMTAwNjQ0Ci0tLSBhL2xvYWRlci90YXNrLmMKKysrIGIvbG9hZGVyL3Rhc2suYwpAQCAtNTI4LDcgKzUyOCw3IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBUQVNLX0RlbGV0ZVRhc2sKICAqLwotdm9pZCBUQVNLX0RlbGV0ZVRhc2soIEhUQVNLIGhUYXNrICkKK3N0YXRpYyB2b2lkIFRBU0tfRGVsZXRlVGFzayggSFRBU0sgaFRhc2sgKQogewogICAgIFREQiAqcFRhc2s7CiAKQEAgLTYwMCwxMSArNjAwLDE2IEBACiAgICAgVERCICpwT2xkVGFzayA9IE5VTEwsICpwTmV3VGFzazsKICAgICBIVEFTSyBoVGFzayA9IDA7CiAKKyNpZmRlZiBDT05GSUdfSVBDCiAgICAgZGRlX3Jlc2NoZWR1bGUoKTsKKyNlbmRpZgogICAgICAgLyogRmlyc3QgY2hlY2sgaWYgdGhlcmUncyBhIHRhc2sgdG8ga2lsbCAqLwogCiAgICAgaWYgKGhUYXNrVG9LaWxsICYmIChoVGFza1RvS2lsbCAhPSBoQ3VycmVudFRhc2spKQorICAgIHsKICAgICAgICAgVEFTS19EZWxldGVUYXNrKCBoVGFza1RvS2lsbCApOworICAgICAgICBoVGFza1RvS2lsbCA9IDA7CisgICAgfQogCiAgICAgICAvKiBJZiBjdXJyZW50IHRhc2sgaXMgbG9ja2VkLCBzaW1wbHkgcmV0dXJuICovCiAKZGlmZiAtLWdpdCBhL2xvYWRlci93aW5lLmMgYi9sb2FkZXIvd2luZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODhmOTg1Li4wMDAwMDAwCi0tLSBhL2xvYWRlci93aW5lLmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NTYgKzAsMCBAQAotc3RhdGljIGNoYXIgUkNTSWRbXSA9ICIkSWQ6IHdpbmUuYyx2IDEuMiAxOTkzLzA3LzA0IDA0OjA0OjIxIHJvb3QgRXhwIHJvb3QgJCI7Ci1zdGF0aWMgY2hhciBDb3B5cmlnaHRbXSA9ICJDb3B5cmlnaHQgIFJvYmVydCBKLiBBbXN0YWR0LCAxOTkzIjsKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2lmZGVmIGxpbnV4Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+Ci0jaW5jbHVkZSA8bGludXgvaGVhZC5oPgotI2luY2x1ZGUgPGxpbnV4L2xkdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NlZ21lbnQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSAibmVleGUuaCIKLSNpbmNsdWRlICJzZWdtZW0uaCIKLSNpbmNsdWRlICJwcm90b3R5cGVzLmgiCi0jaW5jbHVkZSAiZGxscy5oIgotI2luY2x1ZGUgIndpbmUuaCIKLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0jaW5jbHVkZSAid2luZW9wdHMuaCIKLSNpbmNsdWRlICJhcmNoLmgiCi0jaW5jbHVkZSAib3B0aW9ucy5oIgotCi0vKiAjZGVmaW5lIERFQlVHX0ZJWFVQICovCi0KLWV4dGVybiBpbnQgQ2FsbFRvSW5pdDE2KHVuc2lnbmVkIGxvbmcgY3NpcCwgdW5zaWduZWQgbG9uZyBzc3NwLCAKLQkJCXVuc2lnbmVkIHNob3J0IGRzKTsKLWV4dGVybiB2b2lkIENhbGxUbzMyKCk7Ci0KLWNoYXIgKiBHZXRNb2R1bGVOYW1lKHN0cnVjdCB3X2ZpbGVzICogd3BudCwgaW50IGluZGV4LCBjaGFyICpidWZmZXIpOwotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgcmFuX291dDsKLWV4dGVybiBjaGFyIFdpbmRvd3NQYXRoWzI1Nl07Ci1jaGFyICpXSU5fUHJvZ3JhbU5hbWU7Ci0KLXVuc2lnbmVkIHNob3J0IFdJTl9TdGFja1NpemU7Ci11bnNpZ25lZCBzaG9ydCBXSU5fSGVhcFNpemU7Ci0KLXN0cnVjdCAgd19maWxlcyAqIHdpbmVfZmlsZXMgPSBOVUxMOwotCi1pbnQgV2luZUZvcmNlRmFpbCA9IDA7Ci0KLWNoYXIgKipBcmd2OwotaW50IEFyZ2M7Ci1zdHJ1Y3QgbXpfaGVhZGVyX3MgKkN1cnJlbnRNWkhlYWRlcjsKLXN0cnVjdCBuZV9oZWFkZXJfcyAqQ3VycmVudE5FSGVhZGVyOwotaW50IEN1cnJlbnRORUZpbGU7Ci1ISU5TVEFOQ0UgaFN5c1JlczsKLQotc3RhdGljIGNoYXIgKkRMTF9FeHRlbnNpb25zW10gPSB7ICJkbGwiLCAiZXhlIiwgTlVMTCB9Owotc3RhdGljIGNoYXIgKkVYRV9FeHRlbnNpb25zW10gPSB7ICJleGUiLCBOVUxMIH07Ci1zdGF0aWMgY2hhciAqV2luZVBhdGggPSBOVUxMOwotCi1GSUxFICpTcHlGcCA9IE5VTEw7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJbXllcnJvcgotICovCi12b2lkCi1teWVycm9yKGNvbnN0IGNoYXIgKnMpCi17Ci0gICAgaWYgKHMgPT0gTlVMTCkKLQlwZXJyb3IoIndpbmUiKTsKLSAgICBlbHNlCi0JZnByaW50ZihzdGRlcnIsICJ3aW5lOiAlc1xuIiwgcyk7Ci0KLSAgICBleGl0KDEpOwotfQotDAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQlHZXRGaWxlbmFtZUZyb21JbnN0YW5jZQotICovCi1jaGFyICoKLUdldEZpbGVuYW1lRnJvbUluc3RhbmNlKHVuc2lnbmVkIHNob3J0IGluc3RhbmNlKQotewotICAgIHJlZ2lzdGVyIHN0cnVjdCB3X2ZpbGVzICp3ID0gd2luZV9maWxlczsKLQotICAgIHdoaWxlICh3ICYmIHctPmhpbnN0YW5jZSAhPSBpbnN0YW5jZSkKLQl3ID0gdy0+bmV4dDsKLSAgICAKLSAgICBpZiAodykKLQlyZXR1cm4gdy0+ZmlsZW5hbWU7Ci0gICAgZWxzZQotCXJldHVybiBOVUxMOwotfQotCi1zdHJ1Y3Qgd19maWxlcyAqCi1HZXRGaWxlSW5mbyh1bnNpZ25lZCBzaG9ydCBpbnN0YW5jZSkKLXsKLSAgICByZWdpc3RlciBzdHJ1Y3Qgd19maWxlcyAqdyA9IHdpbmVfZmlsZXM7Ci0KLSAgICB3aGlsZSAodyAmJiB3LT5oaW5zdGFuY2UgIT0gaW5zdGFuY2UpCi0JdyA9IHctPm5leHQ7Ci0gICAgCi0gICAgcmV0dXJuIHc7Ci19Ci0MCi0jaWZuZGVmIFdJTkVMSUIKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgotICogTG9hZCBNWiBIZWFkZXIKLSAqLwotdm9pZCBsb2FkX216X2hlYWRlcihpbnQgZmQsIHN0cnVjdCBtel9oZWFkZXJfcyAqbXpfaGVhZGVyKQotewotICAgIGlmIChyZWFkKGZkLCBtel9oZWFkZXIsIHNpemVvZihzdHJ1Y3QgbXpfaGVhZGVyX3MpKSAhPQotCXNpemVvZihzdHJ1Y3QgbXpfaGVhZGVyX3MpKQotICAgIHsKLQlteWVycm9yKCJVbmFibGUgdG8gcmVhZCBNWiBoZWFkZXIgZnJvbSBmaWxlIik7Ci0gICAgfQotfQotCi12b2lkIGxvYWRfbmVfaGVhZGVyIChpbnQgZmQsIHN0cnVjdCBuZV9oZWFkZXJfcyAqbmVfaGVhZGVyKQotewotICAgIGlmIChyZWFkKGZkLCBuZV9oZWFkZXIsIHNpemVvZihzdHJ1Y3QgbmVfaGVhZGVyX3MpKSAKLQkhPSBzaXplb2Yoc3RydWN0IG5lX2hlYWRlcl9zKSkKLSAgICB7Ci0JbXllcnJvcigiVW5hYmxlIHRvIHJlYWQgTkUgaGVhZGVyIGZyb20gZmlsZSIpOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCUxvYWRJbWFnZQotICogTG9hZCBvbmUgTkUgZm9ybWF0IGV4ZWN1dGFibGUgaW50byBtZW1vcnkKLSAqLwotSElOU1RBTkNFIExvYWRJbWFnZShjaGFyICptb2R1bGVuYW1lLCBpbnQgZmlsZXR5cGUsIGludCBjaGFuZ2VfZGlyKQotewotICAgIHVuc2lnbmVkIGludCByZWFkX3NpemU7Ci0gICAgaW50IGk7Ci0gICAgc3RydWN0IHdfZmlsZXMgKiB3cG50LCAqd3BudDE7Ci0gICAgdW5zaWduZWQgaW50IHN0YXR1czsKLSAgICBjaGFyIGJ1ZmZlclsyNTZdOwotICAgIGNoYXIgKmZ1bGxuYW1lOwotCi0gICAgLyoKLSAgICAgKiBzZWFyY2ggZmlsZQotICAgICAqLwotICAgIGZ1bGxuYW1lID0gRmluZEZpbGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgbW9kdWxlbmFtZSwgCi0JCQkoZmlsZXR5cGUgPT0gRVhFID8gRVhFX0V4dGVuc2lvbnMgOiBETExfRXh0ZW5zaW9ucyksIAotCQkJV2luZG93c1BhdGgpOwotICAgIGlmIChmdWxsbmFtZSA9PSBOVUxMKQotICAgIHsKLSAgICAJZnByaW50ZihzdGRlcnIsICJMb2FkSW1hZ2U6IEkgY2FuJ3QgZmluZCAlcy5kbGwgfCAlcy5leGUgIVxuIiwKLQkJbW9kdWxlbmFtZSwgbW9kdWxlbmFtZSk7Ci0JcmV0dXJuIChISU5TVEFOQ0UpIE5VTEw7Ci0gICAgfQotCi0gICAgZnVsbG5hbWUgPSBHZXREb3NGaWxlTmFtZShmdWxsbmFtZSk7Ci0gICAgV0lOX1Byb2dyYW1OYW1lID0gc3RyZHVwKGZ1bGxuYW1lKTsKLSAgICAKLSAgICBmcHJpbnRmKHN0ZGVyciwiTG9hZEltYWdlOiBsb2FkaW5nICVzICglcylcbiAgICAgICAgICAgWyVzXVxuIiwgCi0JICAgIG1vZHVsZW5hbWUsIGJ1ZmZlciwgV0lOX1Byb2dyYW1OYW1lKTsKLQotICAgIGlmIChjaGFuZ2VfZGlyICYmIGZ1bGxuYW1lKQotICAgIHsKLQljaGFyIGRpcm5hbWVbMjU2XTsKLQljaGFyICpwOwotCi0Jc3RyY3B5KGRpcm5hbWUsIGZ1bGxuYW1lKTsKLQlwID0gc3RycmNocihkaXJuYW1lLCAnXFwnKTsKLQkqcCA9ICdcMCc7Ci0KLQlET1NfU2V0RGVmYXVsdERyaXZlKGRpcm5hbWVbMF0gLSAnQScpOwotCURPU19DaGFuZ2VEaXIoZGlybmFtZVswXSAtICdBJywgZGlybmFtZSArIDIpOwotICAgIH0KLQotICAgIC8qIEZpcnN0IGFsbG9jYXRlIGEgc3BvdCB0byBzdG9yZSB0aGUgaW5mbyB3ZSBjb2xsZWN0LCBhbmQgYWRkIGl0IHRvCi0gICAgICogb3VyIGxpbmtlZCBsaXN0LgotICAgICAqLwotCi0gICAgd3BudCA9IChzdHJ1Y3Qgd19maWxlcyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCB3X2ZpbGVzKSk7Ci0gICAgaWYod2luZV9maWxlcyA9PSBOVUxMKQotICAgICAgd2luZV9maWxlcyA9IHdwbnQ7Ci0gICAgZWxzZSB7Ci0gICAgICB3cG50MSA9IHdpbmVfZmlsZXM7Ci0gICAgICB3aGlsZSh3cG50MS0+bmV4dCkgd3BudDEgPSAgd3BudDEtPm5leHQ7Ci0gICAgICB3cG50MS0+bmV4dCAgPSB3cG50OwotICAgIH07Ci0gICAgd3BudC0+bmV4dCA9IE5VTEw7Ci0KLSAgICAvKgotICAgICAqIE9wZW4gZmlsZSBmb3IgcmVhZGluZy4KLSAgICAgKi8KLSAgICB3cG50LT5mZCA9IG9wZW4oYnVmZmVyLCBPX1JET05MWSk7Ci0gICAgaWYgKHdwbnQtPmZkIDwgMCkKLSAgICB7Ci0JbXllcnJvcihOVUxMKTsKLSAgICB9Ci0gICAgLyoKLSAgICAgKiBFc3RhYmxpc2ggaGVhZGVyIHBvaW50ZXJzLgotICAgICAqLwotICAgIHdwbnQtPmZpbGVuYW1lID0gc3RyZHVwKGJ1ZmZlcik7Ci0gICAgd3BudC0+bmFtZSA9IE5VTEw7Ci0gICAgaWYobW9kdWxlbmFtZSkgIHdwbnQtPm5hbWUgPSBzdHJkdXAobW9kdWxlbmFtZSk7Ci0KLSAgICB3cG50LT5tel9oZWFkZXIgPSAoc3RydWN0IG16X2hlYWRlcl9zICopIG1hbGxvYyhzaXplb2Yoc3RydWN0IG16X2hlYWRlcl9zKSk7OwotICAgIHN0YXR1cyA9IGxzZWVrKHdwbnQtPmZkLCAwLCBTRUVLX1NFVCk7Ci0gICAgbG9hZF9tel9oZWFkZXIgKHdwbnQtPmZkLCB3cG50LT5tel9oZWFkZXIpOwotICAgIGlmICh3cG50LT5tel9oZWFkZXItPm11c3RfYmVfMHg0MCAhPSAweDQwKQotCW15ZXJyb3IoIlRoaXMgaXMgbm90IGEgV2luZG93cyBwcm9ncmFtIik7Ci0gICAgCi0gICAgd3BudC0+bmVfaGVhZGVyID0gKHN0cnVjdCBuZV9oZWFkZXJfcyAqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBuZV9oZWFkZXJfcykpOwotICAgIHN0YXR1cyA9IGxzZWVrKHdwbnQtPmZkLCB3cG50LT5tel9oZWFkZXItPm5lX29mZnNldCwgU0VFS19TRVQpOwotICAgIGxvYWRfbmVfaGVhZGVyICh3cG50LT5mZCwgd3BudC0+bmVfaGVhZGVyKTsKLSAgICBpZiAod3BudC0+bmVfaGVhZGVyLT5oZWFkZXJfdHlwZVswXSAhPSAnTicgfHwgCi0Jd3BudC0+bmVfaGVhZGVyLT5oZWFkZXJfdHlwZVsxXSAhPSAnRScpCi0gICAgICBteWVycm9yKCJUaGlzIGlzIG5vdCBhIFdpbmRvd3MgcHJvZ3JhbSIpOwotCi0gICAgaWYod2luZV9maWxlcyA9PSAgd3BudCl7Ci0gICAgICBDdXJyZW50TVpIZWFkZXIgPSB3cG50LT5tel9oZWFkZXI7Ci0gICAgICBDdXJyZW50TkVIZWFkZXIgPSB3cG50LT5uZV9oZWFkZXI7Ci0gICAgICBDdXJyZW50TkVGaWxlICAgPSB3cG50LT5mZDsKLSAgICAgIAotICAgICAgV0lOX1N0YWNrU2l6ZSA9IHdwbnQtPm5lX2hlYWRlci0+c3RhY2tfbGVuZ3RoOwotICAgICAgV0lOX0hlYXBTaXplID0gd3BudC0+bmVfaGVhZGVyLT5sb2NhbF9oZWFwX2xlbmd0aDsKLSAgICB9OwotCi0gICAgLyoKLSAgICAgKiBDcmVhdGUgc2VnbWVudCBzZWxlY3RvcnMuCi0gICAgICovCi0jaWZuZGVmIFdJTkVMSUIKLSAgICBzdGF0dXMgPSBsc2Vlayh3cG50LT5mZCwgd3BudC0+bXpfaGVhZGVyLT5uZV9vZmZzZXQgKyAKLQkJICAgd3BudC0+bmVfaGVhZGVyLT5zZWdtZW50X3RhYl9vZmZzZXQsCi0JCSAgIFNFRUtfU0VUKTsKLSAgICByZWFkX3NpemUgID0gd3BudC0+bmVfaGVhZGVyLT5uX3NlZ21lbnRfdGFiICoKLQkgICAgICAgICBzaXplb2Yoc3RydWN0IG5lX3NlZ21lbnRfdGFibGVfZW50cnlfcyk7Ci0gICAgd3BudC0+c2VnX3RhYmxlID0gKHN0cnVjdCBuZV9zZWdtZW50X3RhYmxlX2VudHJ5X3MgKikgbWFsbG9jKHJlYWRfc2l6ZSk7Ci0gICAgaWYgKHJlYWQod3BudC0+ZmQsIHdwbnQtPnNlZ190YWJsZSwgcmVhZF9zaXplKSAhPSByZWFkX3NpemUpCi0JbXllcnJvcigiVW5hYmxlIHRvIHJlYWQgc2VnbWVudCB0YWJsZSBoZWFkZXIgZnJvbSBmaWxlIik7Ci0gICAgd3BudC0+c2VsZWN0b3JfdGFibGUgPSBDcmVhdGVTZWxlY3RvcnMod3BudCk7Ci0gICAgd3BudC0+aGluc3RhbmNlIAotCT0gd3BudC0+Ci0JICAgIHNlbGVjdG9yX3RhYmxlW3dwbnQtPm5lX2hlYWRlci0+YXV0b19kYXRhX3NlZy0xXS5zZWxlY3RvcjsKLQotICAgIC8qIEdldCB0aGUgbG9va3VwICB0YWJsZS4gIFRoaXMgaXMgdXNlZCBmb3IgbG9va2luZyB1cCB0aGUgYWRkcmVzc2VzCi0gICAgICAgb2YgZnVuY3Rpb25zIHRoYXQgYXJlIGV4cG9ydGVkICovCi0KLSAgICByZWFkX3NpemUgID0gd3BudC0+bmVfaGVhZGVyLT5lbnRyeV90YWJfbGVuZ3RoOwotICAgIHdwbnQtPmxvb2t1cF90YWJsZSA9IChjaGFyICopIG1hbGxvYyhyZWFkX3NpemUpOwotICAgIGxzZWVrKHdwbnQtPmZkLCB3cG50LT5tel9oZWFkZXItPm5lX29mZnNldCArIAotCSAgd3BudC0+bmVfaGVhZGVyLT5lbnRyeV90YWJfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgaWYgKHJlYWQod3BudC0+ZmQsIHdwbnQtPmxvb2t1cF90YWJsZSwgcmVhZF9zaXplKSAhPSByZWFkX3NpemUpCi0JbXllcnJvcigiVW5hYmxlIHRvIHJlYWQgbG9va3VwIHRhYmxlIGhlYWRlciBmcm9tIGZpbGUiKTsKLQotICAgIC8qIEdldCB0aGUgaW5hbWUgdGFibGUuICBUaGlzIGlzIHVzZWQgZm9yIGxvb2tpbmcgdXAgdGhlIG5hbWVzCi0gICAgICAgb2YgZnVuY3Rpb25zIHRoYXQgYXJlIGV4cG9ydGVkICovCi0KLSAgICBzdGF0dXMgPSBsc2Vlayh3cG50LT5mZCwgd3BudC0+bmVfaGVhZGVyLT5ucm5hbWVfdGFiX29mZnNldCwgIFNFRUtfU0VUKTsKLSAgICByZWFkX3NpemUgID0gd3BudC0+bmVfaGVhZGVyLT5ucm5hbWVfdGFiX2xlbmd0aDsKLSAgICB3cG50LT5ucm5hbWVfdGFibGUgPSAoY2hhciAqKSBtYWxsb2MocmVhZF9zaXplKTsKLSAgICBpZiAocmVhZCh3cG50LT5mZCwgd3BudC0+bnJuYW1lX3RhYmxlLCByZWFkX3NpemUpICE9IHJlYWRfc2l6ZSkKLQlteWVycm9yKCJVbmFibGUgdG8gcmVhZCBucm5hbWUgdGFibGUgaGVhZGVyIGZyb20gZmlsZSIpOwotCi0gICAgc3RhdHVzID0gbHNlZWsod3BudC0+ZmQsIHdwbnQtPm16X2hlYWRlci0+bmVfb2Zmc2V0ICsgCi0JCSAgIHdwbnQtPm5lX2hlYWRlci0+cm5hbWVfdGFiX29mZnNldCwgIFNFRUtfU0VUKTsKLSAgICByZWFkX3NpemUgID0gd3BudC0+bmVfaGVhZGVyLT5tb2R1bGVyZWZfdGFiX29mZnNldCAtIAotCSAgICB3cG50LT5uZV9oZWFkZXItPnJuYW1lX3RhYl9vZmZzZXQ7Ci0gICAgd3BudC0+cm5hbWVfdGFibGUgPSAoY2hhciAqKSBtYWxsb2MocmVhZF9zaXplKTsKLSAgICBpZiAocmVhZCh3cG50LT5mZCwgd3BudC0+cm5hbWVfdGFibGUsIHJlYWRfc2l6ZSkgIT0gcmVhZF9zaXplKQotCW15ZXJyb3IoIlVuYWJsZSB0byByZWFkIHJuYW1lIHRhYmxlIGhlYWRlciBmcm9tIGZpbGUiKTsKLQotICAgIC8qIE5vdyBnZXQgdGhlIG1vZHVsZSBuYW1lICovCi0KLSAgICB3cG50LT5uYW1lICA9IChjaGFyKikgbWFsbG9jKCp3cG50LT5ybmFtZV90YWJsZSArIDEpOwotICAgIG1lbWNweSh3cG50LT5uYW1lLCB3cG50LT5ybmFtZV90YWJsZSsxLCAqd3BudC0+cm5hbWVfdGFibGUpOwotICAgIHdwbnQtPm5hbWVbKndwbnQtPnJuYW1lX3RhYmxlXSA9ICAwOwotI2VuZGlmCi0gICAgLyoKLSAgICAgKiBOb3cgbG9hZCBhbnkgRExMcyB0aGF0ICB0aGlzIG1vZHVsZSByZWZlcnMgdG8uCi0gICAgICovCi0gICAgZm9yKGk9MDsgaTx3cG50LT5uZV9oZWFkZXItPm5fbW9kX3JlZl90YWI7IGkrKyl7Ci0gICAgICBjaGFyIGJ1ZmZbMTRdOwotICAgICAgY2hhciBidWZmMlsyNTZdOwotICAgICAgaW50ICBmZCwgajsKLSAgICAgIEdldE1vZHVsZU5hbWUod3BudCwgaSArIDEsIGJ1ZmYpOwotICAgICAgCi0jaWZuZGVmIFdJTkVMSUIKLSAgICAgIGlmKEZpbmRETExUYWJsZShidWZmKSkgY29udGludWU7ICAvKiBUaGlzIG1vZHVsZSBhbHJlYWR5IGxvYWRlZCAqLwotI2VuZGlmCi0KLSAgICAgIExvYWRJbWFnZShidWZmLCBETEwsIDApOwotLyoKLSAgICAgIGZwcmludGYoc3RkZXJyLCJVbmFibGUgdG8gbG9hZDolc1xuIiwgIGJ1ZmYpOwotKi8KLSAgICB9Ci1yZXR1cm4od3BudC0+aGluc3RhbmNlKTsKLX0KLQwKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqCQkJCQltYWluCi0gKi8KLV9XaW5NYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKLXsKLQlpbnQgc2VnbWVudDsKLQljaGFyICpwOwotCWNoYXIgKnN5c3Jlc25hbWU7Ci0JY2hhciBmaWxlbmFtZVsxMDBdOwotCWNoYXIgc3lzcGF0aFsyNTZdOwotCWNoYXIgZXhlX3BhdGhbMjU2XTsKLSNpZmRlZiBXSU5FU1RBVAotCWNoYXIgKiBjcDsKLSNlbmRpZgotCXN0cnVjdCB3X2ZpbGVzICogd3BudDsKLQlpbnQgY3NfcmVnLCBkc19yZWcsIHNzX3JlZywgaXBfcmVnLCBzcF9yZWc7Ci0JaW50IGk7Ci0JaW50IHJ2OwotCi0JQXJnYyA9IGFyZ2MgLSAxOwotCUFyZ3YgPSBhcmd2ICsgMTsKLQkKLQlXaW5lUGF0aCA9IG1hbGxvYygxMDI0KTsKLQkKLQlnZXRjd2QoV2luZVBhdGgsIDUxMik7Ci0JCi0JaWYgKChwID0gZ2V0ZW52KCJXSU5FUEFUSCIpKSAhPSBOVUxMKSB7IAotCQlzdHJjYXQoV2luZVBhdGgsICI7Iik7Ci0JCXN0cmNhdChXaW5lUGF0aCwgcCk7Ci0JfQotCQotCWlmICgoaEluc3RNYWluID0gTG9hZEltYWdlKEFyZ3ZbMF0sIEVYRSwgMSkpID09IChISU5TVEFOQ0UpIE5VTEwgKSB7Ci0JCWZwcmludGYoc3RkZXJyLCAid2luZTogY2FuJ3QgZmluZCAlcyEuXG4iLCBBcmd2WzBdKTsKLQkJZXhpdCgxKTsKLQl9Ci0KLQlHZXRQcml2YXRlUHJvZmlsZVN0cmluZygid2luZSIsICJTeXN0ZW1SZXNvdXJjZXMiLCAic3lzcmVzLmRsbCIsIAotCQkJCWZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCBXSU5FX0lOSSk7Ci0KLQloU3lzUmVzID0gTG9hZEltYWdlKGZpbGVuYW1lLCBETEwpOwotCWlmIChoU3lzUmVzID09IChISU5TVEFOQ0UpTlVMTCkKLQkJZnByaW50ZihzdGRlcnIsICJ3aW5lOiBjYW4ndCBmaW5kICVzIVxuIiwgZmlsZW5hbWUpOwotIAllbHNlCi0gCSAgICBwcmludGYoIlN5c3RlbSBSZXNvdXJjZXMgTG9hZGVkIC8vIGhTeXNSZXM9JyUwNFgnXG4iLCBoU3lzUmVzKTsKLQkKLSAgICAvKgotICAgICAqIEZpeHVwIHJlZmVyZW5jZXMuCi0gICAgICovCi0gICAgd3BudCA9IHdpbmVfZmlsZXM7Ci0gICAgZm9yKHdwbnQgPSB3aW5lX2ZpbGVzOyB3cG50OyB3cG50ID0gd3BudC0+bmV4dCkKLSAgICB7Ci0JZm9yIChzZWdtZW50ID0gMDsgc2VnbWVudCA8IHdwbnQtPm5lX2hlYWRlci0+bl9zZWdtZW50X3RhYjsgc2VnbWVudCsrKQotCXsKLQkgICAgaWYgKEZpeHVwU2VnbWVudCh3cG50LCBzZWdtZW50KSA8IDApCi0JICAgIHsKLQkJbXllcnJvcigiZml4dXAgZmFpbGVkLiIpOwotCSAgICB9Ci0JfQotICAgIH0KLQotI2lmZGVmIFdJTkVTVEFUCi0gICAgY3AgPSBzdHJyY2hyKGFyZ3ZbMF0sICcvJyk7Ci0gICAgaWYoIWNwKSBjcCA9IGFyZ3ZbMF07Ci0JZWxzZSBjcCsrOwotICAgIGlmKHN0cmNtcChjcCwid2luZXN0YXQiKSA9PSAwKSB7Ci0JICAgIHdpbmVzdGF0KCk7Ci0JICAgIGV4aXQoMCk7Ci0gICAgfTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXplIHNpZ25hbCBoYW5kbGluZy4KLSAgICAgKi8KLSAgICBpbml0X3dpbmVfc2lnbmFscygpOwotCi0gICAgLyoKLSAgICAgKiBGaXh1cCBzdGFjayBhbmQganVtcCB0byBzdGFydC4KLSAgICAgKi8KLSAgICBkc19yZWcgPSAod2luZV9maWxlcy0+Ci0JICAgICAgc2VsZWN0b3JfdGFibGVbd2luZV9maWxlcy0+bmVfaGVhZGVyLT5hdXRvX2RhdGFfc2VnLTFdLnNlbGVjdG9yKTsKLSAgICBjc19yZWcgPSB3aW5lX2ZpbGVzLT5zZWxlY3Rvcl90YWJsZVt3aW5lX2ZpbGVzLT5uZV9oZWFkZXItPmNzLTFdLnNlbGVjdG9yOwotICAgIGlwX3JlZyA9IHdpbmVfZmlsZXMtPm5lX2hlYWRlci0+aXA7Ci0gICAgc3NfcmVnID0gd2luZV9maWxlcy0+c2VsZWN0b3JfdGFibGVbd2luZV9maWxlcy0+bmVfaGVhZGVyLT5zcy0xXS5zZWxlY3RvcjsKLSAgICBzcF9yZWcgPSB3aW5lX2ZpbGVzLT5uZV9oZWFkZXItPnNwOwotCi0gICAgaWYgKE9wdGlvbnMuZGVidWcpIHdpbmVfZGVidWcoMCwgTlVMTCk7Ci0KLSAgICBydiA9IENhbGxUb0luaXQxNihjc19yZWcgPDwgMTYgfCBpcF9yZWcsIHNzX3JlZyA8PCAxNiB8IHNwX3JlZywgZHNfcmVnKTsKLSAgICBwcmludGYgKCJydiA9ICV4XG4iLCBydik7Ci19Ci0KLXZvaWQgSW5pdGlhbGl6ZUxvYWRlZERMTHMoKQotewotICAgIHN0cnVjdCB3X2ZpbGVzICogd3BudDsKLSAgICBpbnQgY3NfcmVnLCBkc19yZWcsIGlwX3JlZzsKLSAgICBpbnQgcnY7Ci0KLSAgICBmcHJpbnRmKHN0ZGVyciwgIkluaXRpYWxpemluZyBETExzXG4iKTsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGl6ZSBsaWJyYXJpZXMKLSAgICAgKi8KLSAgICB3cG50ID0gd2luZV9maWxlczsKLSAgICBmb3Iod3BudCA9IHdpbmVfZmlsZXM7IHdwbnQ7IHdwbnQgPSB3cG50LT5uZXh0KQotICAgIHsKLQkvKiAKLQkgKiBJcyB0aGlzIGEgbGlicmFyeT8gCi0JICovCi0JaWYgKHdwbnQtPm5lX2hlYWRlci0+Zm9ybWF0X2ZsYWdzICYgMHg4MDAwKQotCXsKLQkgICAgaWYgKCEod3BudC0+bmVfaGVhZGVyLT5mb3JtYXRfZmxhZ3MgJiAweDAwMDEpKQotCSAgICB7Ci0JCS8qIE5vdCBTSU5HTEVEQVRBICovCi0JCWZwcmludGYoc3RkZXJyLCAiTGlicmFyeSBpcyBub3QgbWFya2VkIFNJTkdMRURBVEFcbiIpOwotCQlleGl0KDEpOwotCSAgICB9Ci0KLQkgICAgZHNfcmVnID0gd3BudC0+c2VsZWN0b3JfdGFibGVbd3BudC0+Ci0JCQkJCSAgbmVfaGVhZGVyLT5hdXRvX2RhdGFfc2VnLTFdLnNlbGVjdG9yOwotCSAgICBjc19yZWcgPSB3cG50LT5zZWxlY3Rvcl90YWJsZVt3cG50LT5uZV9oZWFkZXItPmNzLTFdLnNlbGVjdG9yOwotCSAgICBpcF9yZWcgPSB3cG50LT5uZV9oZWFkZXItPmlwOwotCi0JICAgIGZwcmludGYoc3RkZXJyLCAiSW5pdGlhbGl6aW5nICVzLCBjczppcCAlMDR4OiUwNHgsIGRzICUwNHhcbiIsIAotCQkgICAgd3BudC0+bmFtZSwgY3NfcmVnLCBpcF9yZWcsIGRzX3JlZyk7Ci0KLQkgICAgcnYgPSBDYWxsVG8xNihjc19yZWcgPDwgMTYgfCBpcF9yZWcsIGRzX3JlZyk7Ci0JICAgIHByaW50ZiAoInJ2ID0gJXhcbiIsIHJ2KTsKLQl9Ci0gICAgfQotfQotCi0MCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICoJCQkJCUdldEltcG9ydGVkTmFtZQotICovCi1jaGFyICoKLUdldEltcG9ydGVkTmFtZShpbnQgZmQsIHN0cnVjdCBtel9oZWFkZXJfcyAqbXpfaGVhZGVyLCAKLQkJc3RydWN0IG5lX2hlYWRlcl9zICpuZV9oZWFkZXIsIGludCBuYW1lX29mZnNldCwgY2hhciAqYnVmZmVyKQotewotICAgIGNoYXIgKnA7Ci0gICAgaW50IGxlbmd0aDsKLSAgICBpbnQgc3RhdHVzOwotICAgIGludCBpOwotICAgIAotICAgIHN0YXR1cyA9IGxzZWVrKGZkLCBtel9oZWFkZXItPm5lX29mZnNldCArIG5lX2hlYWRlci0+aW5hbWVfdGFiX29mZnNldCArCi0JCSAgIG5hbWVfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgbGVuZ3RoID0gMDsKLSAgICByZWFkKGZkLCAmbGVuZ3RoLCAxKTsgIC8qIEdldCB0aGUgbGVuZ3RoIGJ5dGUgKi8KLSAgICBsZW5ndGggPSBDT05WX0NIQVJfVE9fTE9ORyAobGVuZ3RoKTsKLSAgICByZWFkKGZkLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgYnVmZmVyW2xlbmd0aF0gPSAwOwotICAgIHJldHVybiBidWZmZXI7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJR2V0TW9kdWxlTmFtZQotICovCi1jaGFyICoKLUdldE1vZHVsZU5hbWUoc3RydWN0IHdfZmlsZXMgKiB3cG50LCBpbnQgaW5kZXgsIGNoYXIgKmJ1ZmZlcikKLXsKLSAgICBpbnQgZmQgPSB3cG50LT5mZDsKLSAgICBzdHJ1Y3QgbXpfaGVhZGVyX3MgKm16X2hlYWRlciA9IHdwbnQtPm16X2hlYWRlcjsgCi0gICAgc3RydWN0IG5lX2hlYWRlcl9zICpuZV9oZWFkZXIgPSB3cG50LT5uZV9oZWFkZXI7Ci0gICAgY2hhciAqcDsKLSAgICBpbnQgbGVuZ3RoOwotICAgIFdPUkQgbmFtZV9vZmZzZXQsIHN0YXR1czsKLSAgICBpbnQgaTsKLSAgICAKLSAgICBzdGF0dXMgPSBsc2VlayhmZCwgbXpfaGVhZGVyLT5uZV9vZmZzZXQgKyBuZV9oZWFkZXItPm1vZHVsZXJlZl90YWJfb2Zmc2V0ICsKLQkJICAgMiooaW5kZXggLSAxKSwgU0VFS19TRVQpOwotICAgIG5hbWVfb2Zmc2V0ID0gMDsKLSAgICByZWFkKGZkLCAmbmFtZV9vZmZzZXQsIDIpOwotICAgIG5hbWVfb2Zmc2V0ID0gQ09OVl9TSE9SVCAobmFtZV9vZmZzZXQpOwotICAgIHN0YXR1cyA9IGxzZWVrKGZkLCBtel9oZWFkZXItPm5lX29mZnNldCArIG5lX2hlYWRlci0+aW5hbWVfdGFiX29mZnNldCArCi0JCSAgIG5hbWVfb2Zmc2V0LCBTRUVLX1NFVCk7Ci0gICAgbGVuZ3RoID0gMDsKLSAgICByZWFkKGZkLCAmbGVuZ3RoLCAxKTsgIC8qIEdldCB0aGUgbGVuZ3RoIGJ5dGUgKi8KLSAgICBsZW5ndGggPSBDT05WX0NIQVJfVE9fTE9ORyAobGVuZ3RoKTsKLSAgICByZWFkKGZkLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgYnVmZmVyW2xlbmd0aF0gPSAwOwotCi0gICAgLyogTW9kdWxlIG5hbWVzICBhcmUgYWx3YXlzIHVwcGVyIGNhc2UgKi8KLSAgICBmb3IoaT0wOyBpPGxlbmd0aDsgaSsrKQotCSAgICBpZihidWZmZXJbaV0gPj0gJ2EnICYmIGJ1ZmZlcltpXSA8PSAneicpICBidWZmZXJbaV0gJj0gfjB4MjA7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi0MCi0jaWZuZGVmIFdJTkVMSUIKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJRml4dXBTZWdtZW50Ci0gKi8KLWludAotRml4dXBTZWdtZW50KHN0cnVjdCB3X2ZpbGVzICogd3BudCwgaW50IHNlZ21lbnRfbnVtKQotewotICAgIGludCBmZCA9ICB3cG50LT5mZDsKLSAgICBzdHJ1Y3QgbXpfaGVhZGVyX3MgKiBtel9oZWFkZXIgPSB3cG50LT5tel9oZWFkZXI7Ci0gICAgc3RydWN0IG5lX2hlYWRlcl9zICpuZV9oZWFkZXIgPSAgd3BudC0+bmVfaGVhZGVyOwotICAgIHN0cnVjdCBuZV9zZWdtZW50X3RhYmxlX2VudHJ5X3MgKnNlZ190YWJsZSA9IHdwbnQtPnNlZ190YWJsZTsKLSAgICBzdHJ1Y3Qgc2VnbWVudF9kZXNjcmlwdG9yX3MgKnNlbGVjdG9yX3RhYmxlID0gd3BudC0+c2VsZWN0b3JfdGFibGU7Ci0gICAgc3RydWN0IHJlbG9jYXRpb25fZW50cnlfcyAqcmVwLCAqcmVwMTsKLSAgICBzdHJ1Y3QgbmVfc2VnbWVudF90YWJsZV9lbnRyeV9zICpzZWc7Ci0gICAgc3RydWN0IHNlZ21lbnRfZGVzY3JpcHRvcl9zICpzZWw7Ci0gICAgc3RydWN0IGRsbF90YWJsZV9lbnRyeV9zICpkbGxfdGFibGU7Ci0gICAgaW50IHN0YXR1czsKLSAgICB1bnNpZ25lZCBzaG9ydCAqc3A7Ci0gICAgdW5zaWduZWQgaW50IHNlbGVjdG9yLCBhZGRyZXNzOwotICAgIHVuc2lnbmVkIGludCBuZXh0X2FkZHI7Ci0gICAgaW50IG9yZGluYWw7Ci0gICAgY2hhciBkbGxfbmFtZVsyNTddOwotICAgIGNoYXIgZnVuY19uYW1lWzI1N107Ci0gICAgaW50IGksIG5fZW50cmllczsKLSAgICBpbnQgYWRkaXRpdmU7Ci0KLSAgICBzZWcgPSAmc2VnX3RhYmxlW3NlZ21lbnRfbnVtXTsKLSAgICBzZWwgPSAmc2VsZWN0b3JfdGFibGVbc2VnbWVudF9udW1dOwotCi0jaWZkZWYgREVCVUdfRklYVVAKLSAgICBwcmludGYoIlNlZ21lbnQgZml4dXBzIGZvciAlcywgc2VnbWVudCAlZCwgc2VsZWN0b3IgJXhcbiIsIAotCSAgIHdwbnQtPm5hbWUsIHNlZ21lbnRfbnVtLCAoaW50KSBzZWwtPmJhc2VfYWRkciA+PiAxNik7Ci0jZW5kaWYKLQotICAgIGlmICgoc2VnLT5zZWdfZGF0YV9vZmZzZXQgPT0gMCkgfHwKLQkhKHNlZy0+c2VnX2ZsYWdzICYgTkVfU0VHRkxBR1NfUkVMT0NfREFUQSkpCi0JcmV0dXJuIDA7Ci0KLSAgICAvKgotICAgICAqIEdvIHRocm91Z2ggdGhlIHJlbG9jYXRpb24gdGFibGUgb24gZW50cnkgYXQgYSB0aW1lLgotICAgICAqLwotICAgIGkgPSBzZWctPnNlZ19kYXRhX2xlbmd0aDsKLSAgICBpZiAoaSA9PSAwKQotCWkgPSAweDEwMDAwOwotCi0gICAgc3RhdHVzID0gbHNlZWsoZmQsIHNlZy0+c2VnX2RhdGFfb2Zmc2V0ICogCi0JCSAgICAgICAoMSA8PCBuZV9oZWFkZXItPmFsaWduX3NoaWZ0X2NvdW50KSArIGksIFNFRUtfU0VUKTsKLSAgICBuX2VudHJpZXMgPSAwOwotICAgIHJlYWQoZmQsICZuX2VudHJpZXMsIHNpemVvZihzaG9ydCBpbnQpKTsKLSAgICByZXAgPSAoc3RydWN0IHJlbG9jYXRpb25fZW50cnlfcyAqKQotCSAgbWFsbG9jKG5fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGlvbl9lbnRyeV9zKSk7Ci0KLSAgICBpZiAocmVhZChmZCxyZXAsIG5fZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgcmVsb2NhdGlvbl9lbnRyeV9zKSkgIT0KLSAgICAgICAgbl9lbnRyaWVzICogc2l6ZW9mKHN0cnVjdCByZWxvY2F0aW9uX2VudHJ5X3MpKQotICAgIHsKLQlteWVycm9yKCJVbmFibGUgdG8gcmVhZCByZWxvY2F0aW9uIGluZm9ybWF0aW9uIik7Ci0gICAgfQotICAgIAotICAgIHJlcDEgPSByZXA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbl9lbnRyaWVzOyBpKyssIHJlcCsrKQotICAgIHsKLQkvKgotCSAqIEdldCB0aGUgdGFyZ2V0IGFkZHJlc3MgY29ycmVzcG9uZGluZyB0byB0aGlzIGVudHJ5LgotCSAqLwotCWFkZGl0aXZlID0gMDsKLQkKLQlzd2l0Y2ggKHJlcC0+cmVsb2NhdGlvbl90eXBlKQotCXsKLQkgIGNhc2UgTkVfUkVMVFlQRV9PUkRJTkFMQUREOgotCSAgICBhZGRpdGl2ZSA9IDE7Ci0JICAgIAotCSAgY2FzZSBORV9SRUxUWVBFX09SRElOQUw6Ci0JICAgIGlmIChHZXRNb2R1bGVOYW1lKHdwbnQsIHJlcC0+dGFyZ2V0MSwKLQkJCSAgICAgIGRsbF9uYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihzdGRlcnIsICJORV9SRUxUWVBFX09SRElOQUwgZmFpbGVkIik7Ci0JCXJldHVybiAtMTsKLQkgICAgfQotCSAgICAKLQkgICAgb3JkaW5hbCA9IHJlcC0+dGFyZ2V0MjsKLQotICAJICAgIHN0YXR1cyA9IEdldEVudHJ5RExMT3JkaW5hbChkbGxfbmFtZSwgb3JkaW5hbCwgJnNlbGVjdG9yLAotCQkJCQkmYWRkcmVzcyk7Ci0JICAgIGlmIChzdGF0dXMpCi0JICAgIHsKLQkJY2hhciBzWzgwXTsKLQkJCi0JCXNwcmludGYocywgIkJhZCBETEwgbmFtZSAnJXMuJWQnIiwgZGxsX25hbWUsIG9yZGluYWwpOwotCQlteWVycm9yKHMpOwotCQlyZXR1cm4gLTE7Ci0JICAgIH0KLQotI2lmZGVmIERFQlVHX0ZJWFVQCi0JICAgIHByaW50ZigiJWQ6ICVzLiVkOiAlMDQuNHg6JTA0LjR4XG4iLCBpICsgMSwgZGxsX25hbWUsIG9yZGluYWwsCi0JCSAgIHNlbGVjdG9yLCBhZGRyZXNzKTsKLSNlbmRpZgotCSAgICBicmVhazsKLQkgICAgCi0JICBjYXNlIE5FX1JFTFRZUEVfTkFNRUFERDoKLQkgICAgYWRkaXRpdmUgPSAxOwotCSAgICAKLQkgIGNhc2UgTkVfUkVMVFlQRV9OQU1FOgotCSAgICBpZiAoR2V0TW9kdWxlTmFtZSh3cG50LCByZXAtPnRhcmdldDEsIGRsbF9uYW1lKQotCQk9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihzdGRlcnIsIk5FX1JFTFRZUEVfTkFNRSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLQkgICAgaWYgKEdldEltcG9ydGVkTmFtZShmZCwgbXpfaGVhZGVyLCBuZV9oZWFkZXIsIAotCQkJCXJlcC0+dGFyZ2V0MiwgZnVuY19uYW1lKSA9PSBOVUxMKQotCSAgICB7Ci0JICAgICAgZnByaW50ZihzdGRlcnIsImdldGltcG9ydGVkbmFtZSBmYWlsZWQiKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLSAgCSAgICBzdGF0dXMgPSBHZXRFbnRyeURMTE5hbWUoZGxsX25hbWUsIGZ1bmNfbmFtZSwgJnNlbGVjdG9yLCAKLQkJCQkJICAgJmFkZHJlc3MpOwotCSAgICBpZiAoc3RhdHVzKQotCSAgICB7Ci0JCWNoYXIgc1s4MF07Ci0JCQotCQlzcHJpbnRmKHMsICJCYWQgRExMIG5hbWUgJyVzICglcyknIiwgZGxsX25hbWUsZnVuY19uYW1lKTsKLQkJbXllcnJvcihzKTsKLQkJcmV0dXJuIC0xOwotCSAgICB9Ci0KLSNpZmRlZiBERUJVR19GSVhVUAotCSAgICBwcmludGYoIiVkOiAlcyAlcy4lZDogJTA0LjR4OiUwNC40eFxuIiwgaSArIDEsIGZ1bmNfbmFtZSwKLQkJICAgZGxsX25hbWUsIG9yZGluYWwsIHNlbGVjdG9yLCBhZGRyZXNzKTsKLSNlbmRpZgotCSAgICBicmVhazsKLQkgICAgCi0JICBjYXNlIE5FX1JFTFRZUEVfSU5URVJOQUw6Ci0gICAgCSAgY2FzZSBORV9SRUxUWVBFX0lOVDE6Ci0JICAgIGlmIChyZXAtPnRhcmdldDEgPT0gMHgwMGZmKQotCSAgICB7Ci0JCWFkZHJlc3MgID0gR2V0RW50cnlQb2ludEZyb21PcmRpbmFsKHdwbnQsIHJlcC0+dGFyZ2V0Mik7Ci0JCXNlbGVjdG9yID0gKGFkZHJlc3MgPj4gMTYpICYgMHhmZmZmOwotCQlhZGRyZXNzICY9IDB4ZmZmZjsKLQkgICAgfQotCSAgICBlbHNlCi0JICAgIHsKLQkJc2VsZWN0b3IgPSBzZWxlY3Rvcl90YWJsZVtyZXAtPnRhcmdldDEtMV0uc2VsZWN0b3I7Ci0JCWFkZHJlc3MgID0gcmVwLT50YXJnZXQyOwotCSAgICB9Ci0JICAgIAotI2lmZGVmIERFQlVHX0ZJWFVQCi0JICAgIHByaW50ZigiJWQ6ICUwNC40eDolMDQuNHhcbiIsIGkgKyAxLCBzZWxlY3RvciwgYWRkcmVzcyk7Ci0jZW5kaWYKLQkgICAgYnJlYWs7Ci0KLQkgIGNhc2UgNzoKLQkgICAgLyogUmVsb2NhdGlvbiB0eXBlIDc6Ci0JICAgICAqCi0JICAgICAqICAgIFRoZXNlIGFwcGVhciB0byBiZSB1c2VkIGFzIGZpeHVwcyBmb3IgdGhlIFdpbmRvd3MKLQkgICAgICogZmxvYXRpbmcgcG9pbnQgZW11bGF0b3IuICBMZXQncyBqdXN0IGlnbm9yZSB0aGVtIGFuZAotCSAgICAgKiB0cnkgdG8gdXNlIHRoZSBoYXJkd2FyZSBmbG9hdGluZyBwb2ludC4gIExpbnV4IHNob3VsZAotCSAgICAgKiBzdWNjZXNzZnVsbHkgZW11bGF0ZSB0aGUgY29wcm9jZXNzb3IgaWYgaXQgZG9lc24ndAotCSAgICAgKiBleGlzdC4KLQkgICAgICovCi0jaWZkZWYgREVCVUdfRklYVVAKLQkgICAgcHJpbnRmKCIlZDogQUREUiBUWVBFICVkLCAgVFlQRSAlZCwgIE9GRlNFVCAlMDQuNHgsICAiLAotCQkgICBpICsgMSwgcmVwLT5hZGRyZXNzX3R5cGUsIHJlcC0+cmVsb2NhdGlvbl90eXBlLCAKLQkJICAgcmVwLT5vZmZzZXQpOwotCSAgICBwcmludGYoIlRBUkdFVCAlMDQuNHggJTA0LjR4XG4iLCByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0Mik7Ci0jZW5kaWYKLQkgICAgY29udGludWU7Ci0JICAgIAotCSAgZGVmYXVsdDoKLQkgICAgZnByaW50ZihzdGRlcnIsIiVkOiBBRERSIFRZUEUgJWQsICBUWVBFICVkLCAgT0ZGU0VUICUwNC40eCwgICIsCi0JCSAgIGkgKyAxLCByZXAtPmFkZHJlc3NfdHlwZSwgcmVwLT5yZWxvY2F0aW9uX3R5cGUsIAotCQkgICByZXAtPm9mZnNldCk7Ci0JICAgIGZwcmludGYoc3RkZXJyLCJUQVJHRVQgJTA0LjR4ICUwNC40eFxuIiwgCi0JCSAgICByZXAtPnRhcmdldDEsIHJlcC0+dGFyZ2V0Mik7Ci0JICAgIGZyZWUocmVwMSk7Ci0JICAgIHJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIFN0dWZmIHRoZSByaWdodCBzaXplIHJlc3VsdCBpbi4KLQkgKi8KLQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoKGNoYXIgKikgc2VsLT5iYXNlX2FkZHIgKyByZXAtPm9mZnNldCk7Ci0JaWYgKGFkZGl0aXZlKQotCXsKLQkgICAgaWYgKEZpbmRETExUYWJsZShkbGxfbmFtZSkgPT0gTlVMTCkKLQkJYWRkaXRpdmUgPSAyOwotCi0JICAgIGZwcmludGYoc3RkZXJyLCIlZDogQUREUiBUWVBFICVkLCAgVFlQRSAlZCwgIE9GRlNFVCAlMDQuNHgsICAiLAotCQkgICBpICsgMSwgcmVwLT5hZGRyZXNzX3R5cGUsIHJlcC0+cmVsb2NhdGlvbl90eXBlLCAKLQkJICAgcmVwLT5vZmZzZXQpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwiVEFSR0VUICUwNC40eCAlMDQuNHhcbiIsIAotCQkgICAgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwotCSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICBBZGRpdGl2ZSA9ICVkXG4iLCBhZGRpdGl2ZSk7Ci0JfQotCQotCXN3aXRjaCAocmVwLT5hZGRyZXNzX3R5cGUpCi0JewotCSAgY2FzZSBORV9SQUREUl9PRkZTRVQxNjoKLQkgICAgZG8gewotI2lmZGVmIERFQlVHX0ZJWFVQCi0JCXByaW50ZigiICAgICUwNC40eDolMDQuNHg6JTA0LjR4IE9GRlNFVDE2XG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNwID4+IDE2LCAoaW50KSBzcCAmIDB4RkZGRiwgKnNwKTsKLSNlbmRpZgotCQluZXh0X2FkZHIgPSAqc3A7Ci0JCSpzcCA9ICh1bnNpZ25lZCBzaG9ydCkgYWRkcmVzczsKLQkJaWYgKGFkZGl0aXZlID09IDIpCi0JCSAgICAqc3AgKz0gbmV4dF9hZGRyOwotCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoKGNoYXIgKikgc2VsLT5iYXNlX2FkZHIgKyBuZXh0X2FkZHIpOwotCSAgICB9IAotCSAgICB3aGlsZSAobmV4dF9hZGRyICE9IDB4ZmZmZiAmJiAhYWRkaXRpdmUpOwotCi0JICAgIGJyZWFrOwotCSAgICAKLQkgIGNhc2UgTkVfUkFERFJfUE9JTlRFUjMyOgotCSAgICBkbyB7Ci0jaWZkZWYgREVCVUdfRklYVVAKLQkJcHJpbnRmKCIgICAgJTA0LjR4OiUwNC40eDolMDQuNHggUE9JTlRFUjMyXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNwID4+IDE2LCAoaW50KSBzcCAmIDB4RkZGRiwgKnNwKTsKLSNlbmRpZgotCQluZXh0X2FkZHIgPSAqc3A7Ci0JCSpzcCAgICAgPSAodW5zaWduZWQgc2hvcnQpIGFkZHJlc3M7Ci0JCWlmIChhZGRpdGl2ZSA9PSAyKQotCQkgICAgKnNwICs9IG5leHRfYWRkcjsKLQkJKihzcCsxKSA9ICh1bnNpZ25lZCBzaG9ydCkgc2VsZWN0b3I7Ci0JCXNwID0gKHVuc2lnbmVkIHNob3J0ICopICgoY2hhciAqKSBzZWwtPmJhc2VfYWRkciArIG5leHRfYWRkcik7Ci0JICAgIH0gCi0JICAgIHdoaWxlIChuZXh0X2FkZHIgIT0gMHhmZmZmICYmICFhZGRpdGl2ZSk7Ci0KLQkgICAgYnJlYWs7Ci0JICAgIAotCSAgY2FzZSBORV9SQUREUl9TRUxFQ1RPUjoKLQkgICAgZG8gewotI2lmZGVmIERFQlVHX0ZJWFVQCi0JCXByaW50ZigiICAgICUwNC40eDolMDQuNHg6JTA0LjR4IFNFTEVDVE9SXG4iLAotCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHNwID4+IDE2LCAoaW50KSBzcCAmIDB4RkZGRiwgKnNwKTsKLSNlbmRpZgotCQluZXh0X2FkZHIgPSAqc3A7Ci0JCSpzcCAgICAgPSAodW5zaWduZWQgc2hvcnQpIHNlbGVjdG9yOwotCQlzcCA9ICh1bnNpZ25lZCBzaG9ydCAqKSAoKGNoYXIgKikgc2VsLT5iYXNlX2FkZHIgKyBuZXh0X2FkZHIpOwotCQlpZiAocmVwLT5yZWxvY2F0aW9uX3R5cGUgPT0gTkVfUkVMVFlQRV9JTlQxKSAKLQkJICAgIGJyZWFrOwotCSAgICB9IAotCSAgICB3aGlsZSAobmV4dF9hZGRyICE9IDB4ZmZmZiAmJiAhYWRkaXRpdmUpOwotCi0JICAgIGJyZWFrOwotCSAgICAKLQkgIGRlZmF1bHQ6Ci0JICAgIHByaW50ZigiJWQ6IEFERFIgVFlQRSAlZCwgIFRZUEUgJWQsICBPRkZTRVQgJTA0LjR4LCAgIiwKLQkJICAgaSArIDEsIHJlcC0+YWRkcmVzc190eXBlLCByZXAtPnJlbG9jYXRpb25fdHlwZSwgCi0JCSAgIHJlcC0+b2Zmc2V0KTsKLQkgICAgcHJpbnRmKCJUQVJHRVQgJTA0LjR4ICUwNC40eFxuIiwgcmVwLT50YXJnZXQxLCByZXAtPnRhcmdldDIpOwotCSAgICBmcmVlKHJlcDEpOwotCSAgICByZXR1cm4gLTE7Ci0JfQotICAgIH0KLQotICAgIGZyZWUocmVwMSk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKgkJCQkJR2V0UHJvY0FkZHJlc3MKLSAqLwotRkFSUFJPQyBHZXRQcm9jQWRkcmVzcyhISU5TVEFOQ0UgaGluc3RhbmNlLCBjaGFyICpwcm9jX25hbWUpCi17Ci0gICAgaWYgKChpbnQpIHByb2NfbmFtZSAmIDB4ZmZmZjAwMDApCi0JcHJpbnRmKCJHZXRQcm9jQWRkcmVzczogJSMwNHgsICclcydcbiIsIGhpbnN0YW5jZSwgcHJvY19uYW1lKTsKLSAgICBlbHNlCi0JcHJpbnRmKCJHZXRQcm9jQWRkcmVzczogJSMwNHgsICVkXG4iLCBoaW5zdGFuY2UsIChpbnQpIHByb2NfbmFtZSk7Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVtb3J5L01ha2VmaWxlLmluIGIvbWVtb3J5L01ha2VmaWxlLmluCmluZGV4IGUwNTZkY2UuLjc5MWJkYWUgMTAwNjQ0Ci0tLSBhL21lbW9yeS9NYWtlZmlsZS5pbgorKysgYi9tZW1vcnkvTWFrZWZpbGUuaW4KQEAgLTMyLDcgKzMyLDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9tZW1vcnkvYXRvbS5jIGIvbWVtb3J5L2F0b20uYwppbmRleCBkYjc2ODYzLi4zNTkxNThjIDEwMDY0NAotLS0gYS9tZW1vcnkvYXRvbS5jCisrKyBiL21lbW9yeS9hdG9tLmMKQEAgLTIyLDYgKzIyLDExIEBACiAjaW5jbHVkZSAic3RhY2tmcmFtZS5oIgogI2luY2x1ZGUgInVzZXIuaCIKIAorI2lmZGVmIENPTkZJR19JUEMKKyNpbmNsdWRlICJkZGVfYXRvbS5oIgorI2luY2x1ZGUgIm9wdGlvbnMuaCIKKyNlbmRpZgorCiAjZGVmaW5lIERFRkFVTFRfQVRPTVRBQkxFX1NJWkUgICAgMzcKICNkZWZpbmUgTUlOX1NUUl9BVE9NICAgICAgICAgICAgICAweGMwMDAKIApAQCAtMzIxLDM2ICszMjYsNDggQEAKIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2NhbEFkZEF0b20gICAoVVNFUi4yNjgpCisgKiAgICAgICAgICAgR2xvYmFsQWRkQXRvbSAgIChVU0VSLjI2OCkKICAqLwotQVRPTSBMb2NhbEFkZEF0b20oIFNFR1BUUiBzdHIgKQorQVRPTSBHbG9iYWxBZGRBdG9tKCBTRUdQVFIgc3RyICkKIHsKKyNpZmRlZiBDT05GSUdfSVBDCisgICAgaWYgKE9wdGlvbnMuaXBjKSByZXR1cm4gRERFX0dsb2JhbEFkZEF0b20oIHN0ciApOworI2VuZGlmCiAgICAgcmV0dXJuIEFUT01fQWRkQXRvbSggVVNFUl9IZWFwU2VsLCBzdHIgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2NhbERlbGV0ZUF0b20gICAoVVNFUi4yNjkpCisgKiAgICAgICAgICAgR2xvYmFsRGVsZXRlQXRvbSAgIChVU0VSLjI2OSkKICAqLwotQVRPTSBMb2NhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApCitBVE9NIEdsb2JhbERlbGV0ZUF0b20oIEFUT00gYXRvbSApCiB7CisjaWZkZWYgQ09ORklHX0lQQworICAgIGlmIChPcHRpb25zLmlwYykgcmV0dXJuIERERV9HbG9iYWxEZWxldGVBdG9tKCBhdG9tICk7CisjZW5kaWYKICAgICByZXR1cm4gQVRPTV9EZWxldGVBdG9tKCBVU0VSX0hlYXBTZWwsIGF0b20gKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2NhbEZpbmRBdG9tICAgKFVTRVIuMjcwKQorICogICAgICAgICAgIEdsb2JhbEZpbmRBdG9tICAgKFVTRVIuMjcwKQogICovCi1BVE9NIExvY2FsRmluZEF0b20oIFNFR1BUUiBzdHIgKQorQVRPTSBHbG9iYWxGaW5kQXRvbSggU0VHUFRSIHN0ciApCiB7CisjaWZkZWYgQ09ORklHX0lQQworICAgIGlmIChPcHRpb25zLmlwYykgcmV0dXJuIERERV9HbG9iYWxGaW5kQXRvbSggc3RyICk7CisjZW5kaWYKICAgICByZXR1cm4gQVRPTV9GaW5kQXRvbSggVVNFUl9IZWFwU2VsLCBzdHIgKTsKIH0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICAgICAgICAgICBMb2NhbEdldEF0b21OYW1lICAgKFVTRVIuMjcxKQorICogICAgICAgICAgIEdsb2JhbEdldEF0b21OYW1lICAgKFVTRVIuMjcxKQogICovCi1XT1JEIExvY2FsR2V0QXRvbU5hbWUoIEFUT00gYXRvbSwgTFBTVFIgYnVmZmVyLCBzaG9ydCBjb3VudCApCitXT1JEIEdsb2JhbEdldEF0b21OYW1lKCBBVE9NIGF0b20sIExQU1RSIGJ1ZmZlciwgc2hvcnQgY291bnQgKQogeworI2lmZGVmIENPTkZJR19JUEMKKyAgICBpZiAoT3B0aW9ucy5pcGMpIHJldHVybiBEREVfR2xvYmFsR2V0QXRvbU5hbWUoIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKKyNlbmRpZgogICAgIHJldHVybiBBVE9NX0dldEF0b21OYW1lKCBVU0VSX0hlYXBTZWwsIGF0b20sIGJ1ZmZlciwgY291bnQgKTsKIH0KZGlmZiAtLWdpdCBhL21lbW9yeS9nbG9iYWwuYyBiL21lbW9yeS9nbG9iYWwuYwppbmRleCA3MDRmZTlkLi44M2YwZGRhIDEwMDY0NAotLS0gYS9tZW1vcnkvZ2xvYmFsLmMKKysrIGIvbWVtb3J5L2dsb2JhbC5jCkBAIC04MSwyMSArODEsNiBAQAogICAgIGlmIChwcmludGVkKQogCXByaW50ZigiXG4iKTsKIH0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogICAgICAgICAgIEdMT0JBTF9GaW5kQXJlbmEKLSAqCi0gKiBGaW5kIHRoZSBhcmVuYSAgZm9yIGEgZ2l2ZW4gaGFuZGxlCi0gKiAod2hlbiBoYW5kbGUgaXMgbm90IHNlcmlhbCAtIGUuZy4gRERFKQotICovCi1zdGF0aWMgR0xPQkFMQVJFTkEgKkdMT0JBTF9GaW5kQXJlbmEoIEhHTE9CQUwgaGFuZGxlKQotewotICAgIGludCBpOwotICAgIGZvciAoaSA9IGdsb2JhbEFyZW5hU2l6ZS0xIDsgaT49MCA7IGktLSkgewotCWlmIChwR2xvYmFsQXJlbmFbaV0uc2l6ZSE9MCAmJiBwR2xvYmFsQXJlbmFbaV0uaGFuZGxlID09IGhhbmRsZSkKLQkgICAgcmV0dXJuICggJnBHbG9iYWxBcmVuYVtpXSApOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTE5Niw5ICsxODEsMTEgQEAKIAogICAgICAgLyogQWxsb2NhdGUgdGhlIGxpbmVhciBtZW1vcnkgKi8KIAorI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoKGZsYWdzICYgR01FTV9EREVTSEFSRSkgJiYgT3B0aW9ucy5pcGMpCi0gICAgICAgIHB0cj0gRERFX21hbGxvYyhmbGFncywgc2l6ZSwgJnNobWRhdGEpOworICAgICAgICBwdHIgPSBEREVfbWFsbG9jKGZsYWdzLCBzaXplLCAmc2htZGF0YSk7CiAgICAgZWxzZSAKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwogCXB0ciA9IG1hbGxvYyggc2l6ZSApOwogICAgIGlmICghcHRyKSByZXR1cm4gMDsKIApAQCAtMjE2LDYgKzIwMywyNSBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKKworI2lmZGVmIENPTkZJR19JUEMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIEdMT0JBTF9GaW5kQXJlbmEKKyAqCisgKiBGaW5kIHRoZSBhcmVuYSAgZm9yIGEgZ2l2ZW4gaGFuZGxlCisgKiAod2hlbiBoYW5kbGUgaXMgbm90IHNlcmlhbCAtIGUuZy4gRERFKQorICovCitzdGF0aWMgR0xPQkFMQVJFTkEgKkdMT0JBTF9GaW5kQXJlbmEoIEhHTE9CQUwgaGFuZGxlKQoreworICAgIGludCBpOworICAgIGZvciAoaSA9IGdsb2JhbEFyZW5hU2l6ZS0xIDsgaT49MCA7IGktLSkgeworCWlmIChwR2xvYmFsQXJlbmFbaV0uc2l6ZSE9MCAmJiBwR2xvYmFsQXJlbmFbaV0uaGFuZGxlID09IGhhbmRsZSkKKwkgICAgcmV0dXJuICggJnBHbG9iYWxBcmVuYVtpXSApOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICBEREVfR2xvYmFsSGFuZGxlVG9TZWwKICAqLwpAQCAtMjM4LDYgKzI0NCw3IEBACiAKICAgICByZXR1cm4gU0VMRUNUT1JPRiggc2VncHRyICk7CiB9CisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KIAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTI2OCwxMSArMjc1LDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgc2l6ZSwgZmxhZ3MgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7CiAgICAgCisjaWZkZWYgQ09ORklHX0lQQwogICAgIGlmIChPcHRpb25zLmlwYyAmJiAoZmxhZ3MgJiBHTUVNX0RERVNIQVJFIHx8IGlzX2RkZV9oYW5kbGUoaGFuZGxlKSkpIHsKIAlmcHJpbnRmKHN0ZG5pbXAsCiAJCSJHbG9iYWxSZUFsbG9jOiBzaGFyZWQgbWVtb3J5IHJlYWxsb2NhdGluZyB1bmltcGxlbWVudGVkXG4iKTsgCiAJcmV0dXJuIDA7CiAgICAgfQorI2VuZGlmICAvKiBDT05GSUdfSVBDICovCiAKICAgICBwQXJlbmEgPSBHRVRfQVJFTkFfUFRSKCBoYW5kbGUgKTsKIApAQCAtMzY2LDcgKzM3NSw5IEBACiAKICAgICBkcHJpbnRmX2dsb2JhbCggc3RkZGViLCAiR2xvYmFsRnJlZTogJTA0eFxuIiwgaGFuZGxlICk7CiAgICAgaWYgKCFHTE9CQUxfRnJlZUJsb2NrKCBoYW5kbGUgKSkgcmV0dXJuIGhhbmRsZTsgIC8qIGZhaWxlZCAqLworI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoaXNfZGRlX2hhbmRsZShoYW5kbGUpKSByZXR1cm4gRERFX0dsb2JhbEZyZWUoaGFuZGxlKTsKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwogICAgIGlmIChwdHIpIGZyZWUoIHB0ciApOwogICAgIHJldHVybiAwOwogfQpAQCAtMzgyLDkgKzM5MywxMyBAQAogICAgIGRwcmludGZfZ2xvYmFsKCBzdGRkZWIsICJXSU4xNl9HbG9iYWxMb2NrKCUwNHgpIC0+ICUwOGx4XG4iLAogICAgICAgICAgICAgICAgICAgICBoYW5kbGUsIE1BS0VMT05HKCAwLCBHbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpKSApOwogICAgIGlmICghaGFuZGxlKSByZXR1cm4gMDsKLSAgICBpZiAoICFpc19kZGVfaGFuZGxlKGhhbmRsZSkgJiYgIUdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+YmFzZSkKLQlyZXR1cm4gKFNFR1BUUikwOwogCisjaWZkZWYgQ09ORklHX0lQQworICAgIGlmIChpc19kZGVfaGFuZGxlKGhhbmRsZSkpCisgICAgICAgIHJldHVybiAoU0VHUFRSKU1BS0VMT05HKCAwLCBEREVfR2xvYmFsSGFuZGxlVG9TZWwoaGFuZGxlKSApOworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCisKKyAgICBpZiAoIUdFVF9BUkVOQV9QVFIoaGFuZGxlKS0+YmFzZSkgcmV0dXJuIChTRUdQVFIpMDsKICAgICByZXR1cm4gKFNFR1BUUilNQUtFTE9ORyggMCwgR2xvYmFsSGFuZGxlVG9TZWwoaGFuZGxlKSApOwogfQogCkBAIC0zOTcsOSArNDEyLDkgQEAKIExQU1RSIEdsb2JhbExvY2soIEhHTE9CQUwgaGFuZGxlICkKIHsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7Ci0gICAgaWYgKGlzX2RkZV9oYW5kbGUoaGFuZGxlKSkgewotICAgICAgIHJldHVybiBEREVfQXR0YWNoSGFuZGxlKGhhbmRsZSwgTlVMTCk7Ci0gICAgfQorI2lmZGVmIENPTkZJR19JUEMKKyAgICBpZiAoaXNfZGRlX2hhbmRsZShoYW5kbGUpKSByZXR1cm4gRERFX0F0dGFjaEhhbmRsZShoYW5kbGUsIE5VTEwpOworI2VuZGlmCiAgICAgcmV0dXJuIChMUFNUUilHRVRfQVJFTkFfUFRSKGhhbmRsZSktPmJhc2U7CiB9CiAKQEAgLTY0NCw5ICs2NTksOSBAQAogewogICAgIGRwcmludGZfdG9vbGhlbHAoIHN0ZGRlYiwgIkdsb2JhbEhhbmRsZVRvU2VsOiAlMDR4XG4iLCBoYW5kbGUgKTsKICAgICBpZiAoIWhhbmRsZSkgcmV0dXJuIDA7Ci0gICAgaWYgKGlzX2RkZV9oYW5kbGUoaGFuZGxlKSkgCi0JcmV0dXJuIERERV9HbG9iYWxIYW5kbGVUb1NlbChoYW5kbGUpOwotCisjaWZkZWYgQ09ORklHX0lQQworICAgIGlmIChpc19kZGVfaGFuZGxlKGhhbmRsZSkpIHJldHVybiBEREVfR2xvYmFsSGFuZGxlVG9TZWwoaGFuZGxlKTsKKyNlbmRpZgogICAgIGlmICghKGhhbmRsZSAmIDcpKQogICAgIHsKICAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiUHJvZ3JhbSBhdHRlbXB0ZWQgaW52YWxpZCBzZWxlY3RvciBjb252ZXJzaW9uXG4iICk7CmRpZmYgLS1naXQgYS9taXNjL01ha2VmaWxlLmluIGIvbWlzYy9NYWtlZmlsZS5pbgppbmRleCBjMmJkYWE3Li5mMmI0YTk2IDEwMDY0NAotLS0gYS9taXNjL01ha2VmaWxlLmluCisrKyBiL21pc2MvTWFrZWZpbGUuaW4KQEAgLTM2LDcgKzM2LDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9taXNjL2NsaXBib2FyZC5jIGIvbWlzYy9jbGlwYm9hcmQuYwppbmRleCBlMTFjNGE4Li5mZWYzMDlkIDEwMDY0NAotLS0gYS9taXNjL2NsaXBib2FyZC5jCisrKyBiL21pc2MvY2xpcGJvYXJkLmMKQEAgLTE0Myw2ICsxNDMsNyBAQAogewogICAgIExQQ0xJUEZPUk1BVCBscEZvcm1hdCA9IENsaXBGb3JtYXRzOyAKICAgICBkcHJpbnRmX2NsaXBib2FyZChzdGRkZWIsIkdldENsaXBib2FyZERhdGEoJTA0WCkgIVxuIiwgd0Zvcm1hdCk7CisgICAgaWYgKCFoV25kQ2xpcGJvYXJkT3duZXIpIHJldHVybiAwOwogICAgIGlmKHdGb3JtYXQgPT0gQ0ZfVEVYVCAmJiAhd2luZU93bnNTZWxlY3Rpb24pCiAgICAgewl3YWl0X2Zvcl9zZWxlY3Rpb249VHJ1ZTsKICAgICAgICAgZHByaW50Zl9jbGlwYm9hcmQoc3RkZGViLCJSZXF1ZXN0aW5nIHNlbGVjdGlvblxuIik7CmRpZmYgLS1naXQgYS9taXNjL2ZpbGUuYyBiL21pc2MvZmlsZS5jCmluZGV4IDg5NWUxODAuLmMzZGMzZWQgMTAwNjQ0Ci0tLSBhL21pc2MvZmlsZS5jCisrKyBiL21pc2MvZmlsZS5jCkBAIC03NSw3ICs3NSw3IEBACiAgIGRwcmludGZfZmlsZShzdGRkZWIsICJfbHJlYWQ6IGhhbmRsZSAlZCwgYnVmZmVyID0gJXAsIGxlbmd0aCA9ICVkXG4iLAogCSAgCQloRmlsZSwgbHBCdWZmZXIsIHdCeXRlcyk7CiAgIAotICByZXN1bHQgPSB3Qnl0ZXMgPT0gMCA/IDAgOiByZWFkIChoRmlsZSwgbHBCdWZmZXIsIHdCeXRlcyk7CisgIHJlc3VsdCA9ICh3Qnl0ZXMgPT0gMCkgPyAwIDogcmVhZCAoaEZpbGUsIGxwQnVmZmVyLCB3Qnl0ZXMpOwogCiAgIGlmIChyZXN1bHQgPT0gLTEpCiAgIAlyZXR1cm4gSEZJTEVfRVJST1I7CkBAIC00NTQsMTIgKzQ1NCwxMiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExPTkcgX2hyZWFkKElOVCBoZiwgTFBTVFIgaHB2QnVmZmVyLCBMT05HIGNiQnVmZmVyKQogewotICAgIHJldHVybiBjYkJ1ZmZlciA9PSAwID8gMCA6IHJlYWQoaGYsIGhwdkJ1ZmZlciwgY2JCdWZmZXIpOworICAgIHJldHVybiAoY2JCdWZmZXIgPT0gMCkgPyAwIDogcmVhZChoZiwgaHB2QnVmZmVyLCBjYkJ1ZmZlcik7CiB9CiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgX2h3cml0ZQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExPTkcgX2h3cml0ZShJTlQgaGYsIExQQ1NUUiBocHZCdWZmZXIsIExPTkcgY2JCdWZmZXIpCiB7Ci0gICAgcmV0dXJuIGNiQnVmZmVyID09IDAgPyAwIDogd3JpdGUoaGYsIGhwdkJ1ZmZlciwgY2JCdWZmZXIpOworICAgIHJldHVybiAoY2JCdWZmZXIgPT0gMCkgPyAwIDogd3JpdGUoaGYsIGhwdkJ1ZmZlciwgY2JCdWZmZXIpOwogfQpkaWZmIC0tZ2l0IGEvbWlzYy9tYWluLmMgYi9taXNjL21haW4uYwppbmRleCAxZWI3NTBjLi5jZWIyMDZkIDEwMDY0NAotLS0gYS9taXNjL21haW4uYworKysgYi9taXNjL21haW4uYwpAQCAtODQ2LDMgKzg0NiwyNyBAQAogewogCXByaW50ZigiRmlsZUNEUiglOHgpXG4iLCAoaW50KSB4KTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqCUdldFdpbkRlYnVnSW5mbyAoS0VSTkVMLjM1NSkKKyovCitCT09MIEdldFdpbkRlYnVnSW5mbyhXSU5ERUJVR0lORk8gRkFSKiBscHdkaSwgVUlOVCBmbGFncykKK3sKKwlwcmludGYoIkdldFdpbkRlYnVnSW5mbyglOGx4LCVkKSBzdHViIHJldHVybmluZyAwXG4iLCAodW5zaWduZWQgbG9uZylscHdkaSwgZmxhZ3MpOworCS8qIDAgbWVhbnMgbm90IGluIGRlYnVnZ2luZyBtb2RlL3ZlcnNpb24gKi8KKwkvKiBDYW4gdGhpcyB0eXBlIG9mIGRlYnVnZ2luZyBiZSB1c2VkIGluIHdpbmUgPyAqLworCS8qIENvbnN0YW50czogV0RJX09QVElPTlMgV0RJX0ZJTFRFUiBXRElfQUxMT0NCUkVBSyAqLworCXJldHVybiAwOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoJR2V0V2luRGVidWdJbmZvIChLRVJORUwuMzU1KQorKi8KK0JPT0wgU2V0V2luRGVidWdJbmZvKFdJTkRFQlVHSU5GTyBGQVIqIGxwd2RpKQoreworCXByaW50ZigiU2V0V2luRGVidWdJbmZvKCU4bHgpIHN0dWIgcmV0dXJuaW5nIDBcbiIsICh1bnNpZ25lZCBsb25nKWxwd2RpKTsKKwkvKiAwIG1lYW5zIG5vdCBpbiBkZWJ1Z2dpbmcgbW9kZS92ZXJzaW9uICovCisJLyogQ2FuIHRoaXMgdHlwZSBvZiBkZWJ1Z2dpbmcgYmUgdXNlZCBpbiB3aW5lID8gKi8KKwkvKiBDb25zdGFudHM6IFdESV9PUFRJT05TIFdESV9GSUxURVIgV0RJX0FMTE9DQlJFQUsgKi8KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2MvcHJvZmlsZS5jIGIvbWlzYy9wcm9maWxlLmMKaW5kZXggM2E0MDBkNy4uZDkwNjdiMSAxMDA2NDQKLS0tIGEvbWlzYy9wcm9maWxlLmMKKysrIGIvbWlzYy9wcm9maWxlLmMKQEAgLTM4Miw2ICszODIsOCBAQAogQk9PTCBXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nIChMUFNUUiBBcHBOYW1lLCBMUFNUUiBLZXlOYW1lLCBMUFNUUiBTdHJpbmcsCiAJCQkJTFBTVFIgRmlsZU5hbWUpCiB7CisgICAgaWYgKCFBcHBOYW1lIHx8ICFLZXlOYW1lIHx8ICFTdHJpbmcpICAvKiBGbHVzaCBmaWxlIHRvIGRpc2sgKi8KKyAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgcmV0dXJuIEdldFNldFByb2ZpbGUgKDEsIEFwcE5hbWUsIEtleU5hbWUsIFN0cmluZywgIiIsIDAsIEZpbGVOYW1lKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWlzYy9zaGVsbC5jIGIvbWlzYy9zaGVsbC5jCmluZGV4IDIxNTc0NzAuLjc1OGZlYjIgMTAwNjQ0Ci0tLSBhL21pc2Mvc2hlbGwuYworKysgYi9taXNjL3NoZWxsLmMKQEAgLTQ1MCwxMCArNDUwLDE0IEBACiAgKi8KIElOVCBBYm91dERsZ1Byb2MoSFdORCBoV25kLCBXT1JEIG1zZywgV09SRCB3UGFyYW0sIExPTkcgbFBhcmFtKQogeworICBjaGFyIFRlbXBsYXRlWzUxMl0sIEFwcFRpdGxlWzUxMl07CisgCiAgIHN3aXRjaChtc2cpIHsKICAgIGNhc2UgV01fSU5JVERJQUxPRzoKICAgICBTZW5kRGxnSXRlbU1lc3NhZ2UoaFduZCxzdGMxLFNUTV9TRVRJQ09OLExPV09SRChsUGFyYW0pLDApOwotICAgIFNldFdpbmRvd1RleHQoaFduZCwgQXBwTmFtZSk7CisgICAgR2V0V2luZG93VGV4dChoV25kLCBUZW1wbGF0ZSwgNTExKTsKKyAgICBzcHJpbnRmKEFwcFRpdGxlLCBUZW1wbGF0ZSwgQXBwTmFtZSk7CisgICAgU2V0V2luZG93VGV4dChoV25kLCBBcHBUaXRsZSk7CiAgICAgU2V0V2luZG93VGV4dChHZXREbGdJdGVtKGhXbmQsMTAwKSwgQXBwTWlzYyk7CiAgICAgcmV0dXJuIDE7CiAgICAgCkBAIC00NzQsNyArNDc4LDcgQEAKIElOVCBTaGVsbEFib3V0KEhXTkQgaFduZCwgTFBDU1RSIHN6QXBwLCBMUENTVFIgc3pPdGhlclN0dWZmLCBISUNPTiBoSWNvbikKIHsKICAgaWYgKHN6QXBwKSB7Ci0gICAgc3ByaW50ZihBcHBOYW1lLCAiQWJvdXQgJXMiLCBzekFwcCk7CisgICAgc3RyY3B5KEFwcE5hbWUsIHN6QXBwKTsKICAgfSBlbHNlICB7CiAgICAgKkFwcE5hbWUgPSAwOwogICB9CmRpZmYgLS1naXQgYS9taXNjZW11L0ltYWtlZmlsZSBiL21pc2NlbXUvSW1ha2VmaWxlCmluZGV4IDc0YTg5ZGYuLjYwYWRiMWEgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvSW1ha2VmaWxlCisrKyBiL21pc2NlbXUvSW1ha2VmaWxlCkBAIC0zLDYgKzMsNyBAQAogTU9EVUxFID0gbWlzY2VtdQogCiBTUkNTID0gXAorCWRvc21lbS5jIFwKIAlkcG1pLmMgXAogCWVtdWxhdGUuYyBcCiAJaW5zdHIuYyBcCmRpZmYgLS1naXQgYS9taXNjZW11L01ha2VmaWxlLmluIGIvbWlzY2VtdS9NYWtlZmlsZS5pbgppbmRleCBjOWFmNWVhLi40MjYwOTdkIDEwMDY0NAotLS0gYS9taXNjZW11L01ha2VmaWxlLmluCisrKyBiL21pc2NlbXUvTWFrZWZpbGUuaW4KQEAgLTksOSArOSwyMiBAQAogCiBNT0RVTEUgCT0gbWlzY2VtdQogCi1TUkNTIAk9IGRwbWkuYyBlbXVsYXRlLmMgaW5zdHIuYyBpbnQxMC5jIGludDEzLmMgXAotICAgICAgICBpbnQxYS5jIGludDIxLmMgaW50MjUuYyBpbnQyNi5jIGludDJhLmMgaW50MmYuYyBpbnQ1Yy5jIGludGVycnVwdHMuYyBcCi0gICAgICAgIGlvcG9ydHMuYworU1JDUyA9IFwKKwlkb3NtZW0uYyBcCisJZHBtaS5jIFwKKwllbXVsYXRlLmMgXAorCWluc3RyLmMgXAorCWludDEwLmMgXAorCWludDEzLmMgXAorCWludDFhLmMgXAorCWludDIxLmMgXAorCWludDI1LmMgXAorCWludDI2LmMgXAorCWludDJhLmMgXAorCWludDJmLmMgXAorCWludDVjLmMgXAorCWludGVycnVwdHMuYyBcCisJaW9wb3J0cy5jCiAKIE9CSlMgPSAkKFNSQ1M6LmM9Lm8pCiAKQEAgLTI5LDcgKzQyLDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9taXNjZW11L2Rvc21lbS5jIGIvbWlzY2VtdS9kb3NtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWMwNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY2VtdS9kb3NtZW0uYwpAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIERPUyBtZW1vcnkgZW11bGF0aW9uCisgKgorICogQ29weXJpZ2h0IDE5OTUgQWxleGFuZHJlIEp1bGxpYXJkCisgKi8KKworI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAid2luZG93cy5oIgorI2luY2x1ZGUgImdsb2JhbC5oIgorI2luY2x1ZGUgImxkdC5oIgorI2luY2x1ZGUgIm1pc2NlbXUuaCIKKyNpbmNsdWRlICJtb2R1bGUuaCIKKworCitIQU5ETEUgRE9TTUVNX0Jpb3NTZWc7ICAvKiBCSU9TIGRhdGEgc2VnbWVudCBhdCAweDQwOjAgKi8KKworCisjcHJhZ21hIHBhY2soMSkKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICBXT1JEICBDb20xQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwMDogQ09NMSBJL08gYWRkcmVzcyAqLworICAgIFdPUkQgIENvbTJBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDAyOiBDT00yIEkvTyBhZGRyZXNzICovCisgICAgV09SRCAgQ29tM0FkZHI7ICAgICAgICAgICAgICAgICAgLyogMDQ6IENPTTMgSS9PIGFkZHJlc3MgKi8KKyAgICBXT1JEICBDb200QWRkcjsgICAgICAgICAgICAgICAgICAvKiAwNjogQ09NNCBJL08gYWRkcmVzcyAqLworICAgIFdPUkQgIExwdDFBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDA4OiBMUFQxIEkvTyBhZGRyZXNzICovCisgICAgV09SRCAgTHB0MkFkZHI7ICAgICAgICAgICAgICAgICAgLyogMGE6IExQVDIgSS9PIGFkZHJlc3MgKi8KKyAgICBXT1JEICBMcHQzQWRkcjsgICAgICAgICAgICAgICAgICAvKiAwYzogTFBUMyBJL08gYWRkcmVzcyAqLworICAgIFdPUkQgIExwdDRBZGRyOyAgICAgICAgICAgICAgICAgIC8qIDBlOiBMUFQ0IEkvTyBhZGRyZXNzICovCisgICAgV09SRCAgSW5zdGFsbGVkSGFyZHdhcmU7ICAgICAgICAgLyogMTA6IEluc3RhbGxlZCBoYXJkd2FyZSBmbGFncyAqLworICAgIEJZVEUgIFBPU1RzdGF0dXM7ICAgICAgICAgICAgICAgIC8qIDEyOiBQb3dlci1PbiBTZWxmIFRlc3Qgc3RhdHVzICovCisgICAgV09SRCAgTWVtU2l6ZSBXSU5FX1BBQ0tFRDsgICAgICAgLyogMTM6IEJhc2UgbWVtb3J5IHNpemUgaW4gS2IgKi8KKyAgICBXT1JEICB1bnVzZWQxIFdJTkVfUEFDS0VEOyAgICAgICAvKiAxNTogTWFudWZhY3R1cmluZyB0ZXN0IHNjcmF0Y2ggcGFkICovCisgICAgQllURSAgS2JkRmxhZ3MxOyAgICAgICAgICAgICAgICAgLyogMTc6IEtleWJvYXJkIGZsYWdzIDEgKi8KKyAgICBCWVRFICBLYmRGbGFnczI7ICAgICAgICAgICAgICAgICAvKiAxODogS2V5Ym9hcmQgZmxhZ3MgMiAqLworICAgIEJZVEUgIHVudXNlZDI7ICAgICAgICAgICAgICAgICAgIC8qIDE5OiBLZXlib2FyZCBkcml2ZXIgd29ya3NwYWNlICovCisgICAgV09SRCAgTmV4dEtiZENoYXJQdHI7ICAgICAgICAgICAgLyogMWE6IE5leHQgY2hhcmFjdGVyIGluIGtiZCBidWZmZXIgKi8KKyAgICBXT1JEICBGaXJzdEtiZENoYXJQdHI7ICAgICAgICAgICAvKiAxYzogRmlyc3QgY2hhcmFjdGVyIGluIGtiZCBidWZmZXIgKi8KKyAgICBXT1JEICBLYmRCdWZmZXJbMTZdOyAgICAgICAgICAgICAvKiAxZTogS2V5Ym9hcmQgYnVmZmVyICovCisgICAgQllURSAgRGlza2V0dGVTdGF0dXMxOyAgICAgICAgICAgLyogM2U6IERpc2tldHRlIHJlY2FsaWJyYXRlIHN0YXR1cyAqLworICAgIEJZVEUgIERpc2tldHRlU3RhdHVzMjsgICAgICAgICAgIC8qIDNmOiBEaXNrZXR0ZSBtb3RvciBzdGF0dXMgKi8KKyAgICBCWVRFICBEaXNrZXR0ZVN0YXR1czM7ICAgICAgICAgICAvKiA0MDogRGlza2V0dGUgbW90b3IgdGltZW91dCAqLworICAgIEJZVEUgIERpc2tldHRlU3RhdHVzNDsgICAgICAgICAgIC8qIDQxOiBEaXNrZXR0ZSBsYXN0IG9wZXJhdGlvbiBzdGF0dXMgKi8KKyAgICBCWVRFICBEaXNrU3RhdHVzWzddOyAgICAgICAgICAgICAvKiA0MjogRGlzayBzdGF0dXMvY29tbWFuZCBieXRlcyAqLworICAgIEJZVEUgIFZpZGVvTW9kZTsgICAgICAgICAgICAgICAgIC8qIDQ5OiBWaWRlbyBtb2RlICovCisgICAgV09SRCAgVmlkZW9Db2x1bW5zOyAgICAgICAgICAgICAgLyogNGE6IE51bWJlciBvZiBjb2x1bW5zICovCisgICAgV09SRCAgVmlkZW9QYWdlU2l6ZTsgICAgICAgICAgICAgLyogNGM6IFZpZGVvIHBhZ2Ugc2l6ZSBpbiBieXRlcyAqLworICAgIFdPUkQgIFZpZGVvUGFnZVN0YXJ0QWRkcjsgICAgICAgIC8qIDRlOiBWaWRlbyBwYWdlIHN0YXJ0IGFkZHJlc3MgKi8KKyAgICBCWVRFICBWaWRlb0N1cnNvclBvc1sxNl07ICAgICAgICAvKiA1MDogQ3Vyc29yIHBvc2l0aW9uIGZvciA4IHBhZ2VzICovCisgICAgV09SRCAgVmlkZW9DdXJzb3JUeXBlOyAgICAgICAgICAgLyogNjA6IFZpZGVvIGN1cnNvciB0eXBlICovCisgICAgQllURSAgVmlkZW9DdXJQYWdlOyAgICAgICAgICAgICAgLyogNjI6IFZpZGVvIGN1cnJlbnQgcGFnZSAqLworICAgIFdPUkQgIFZpZGVvQ3RybEFkZHIgV0lORV9QQUNLRUQ7IC8qIDYzOiBWaWRlbyBjb250cm9sbGVyIGFkZHJlc3MgKi8KKyAgICBCWVRFICBWaWRlb1JlZzE7ICAgICAgICAgICAgICAgICAvKiA2NTogVmlkZW8gbW9kZSBzZWxlY3QgcmVnaXN0ZXIgKi8KKyAgICBCWVRFICBWaWRlb1JlZzI7ICAgICAgICAgICAgICAgICAvKiA2NjogVmlkZW8gQ0dBIHBhbGV0dGUgcmVnaXN0ZXIgKi8KKyAgICBEV09SRCBSZXNldEVudHJ5IFdJTkVfUEFDS0VEOyAgICAvKiA2NzogV2FybSByZXNldCBlbnRyeSBwb2ludCAqLworICAgIEJZVEUgIExhc3RJUlE7ICAgICAgICAgICAgICAgICAgIC8qIDZiOiBMYXN0IHVuZXhwZWN0ZWQgaW50ZXJydXB0ICovCisgICAgRFdPUkQgVGlja3M7ICAgICAgICAgICAgICAgICAgICAgLyogNmM6IFRpY2tzIHNpbmNlIG1pZG5pZ2h0ICovCisgICAgQllURSAgVGlja3NPdmVyZmxvdzsgICAgICAgICAgICAgLyogNzA6IFRpbWVyIG92ZXJmbG93IGlmIHBhc3QgbWlkbmlnaHQgKi8KKyAgICBCWVRFICBDdHJsQnJlYWtGbGFnOyAgICAgICAgICAgICAvKiA3MTogQ3RybC1CcmVhayBmbGFnICovCisgICAgV09SRCAgUmVzZXRGbGFnOyAgICAgICAgICAgICAgICAgLyogNzI6IFBPU1QgUmVzZXQgZmxhZyAqLworICAgIEJZVEUgIERpc2tPcFN0YXR1czsgICAgICAgICAgICAgIC8qIDc0OiBMYXN0IGhhcmQtZGlzayBvcGVyYXRpb24gc3RhdHVzICovCisgICAgQllURSAgTmJIYXJkRGlza3M7ICAgICAgICAgICAgICAgLyogNzU6IE51bWJlciBvZiBoYXJkIGRpc2tzICovCisgICAgQllURSAgRGlza0N0cmxCeXRlOyAgICAgICAgICAgICAgLyogNzY6IERpc2sgY29udHJvbCBieXRlICovCisgICAgQllURSAgRGlza0lPUG9ydDsgICAgICAgICAgICAgICAgLyogNzc6IERpc2sgSS9PIHBvcnQgb2Zmc2V0ICovCisgICAgQllURSAgTHB0VGltZW91dFs0XTsgICAgICAgICAgICAgLyogNzg6IFRpbWVvdXRzIGZvciBwYXJhbGxlbCBwb3J0cyAqLworICAgIEJZVEUgIENvbVRpbWVvdXRbNF07ICAgICAgICAgICAgIC8qIDdjOiBUaW1lb3V0cyBmb3Igc2VyaWFsIHBvcnRzICovCisgICAgV09SRCAgS2JkQnVmZmVyU3RhcnQ7ICAgICAgICAgICAgLyogODA6IEtleWJvYXJkIGJ1ZmZlciBzdGFydCAqLworICAgIFdPUkQgIEtiZEJ1ZmZlckVuZDsgICAgICAgICAgICAgIC8qIDgyOiBLZXlib2FyZCBidWZmZXIgZW5kICovCit9IEJJT1NEQVRBOworCisjcHJhZ21hIHBhY2soNCkKKworCitzdGF0aWMgQklPU0RBVEEgKnBCaW9zRGF0YSA9IE5VTEw7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRE9TTUVNX0luaXQKKyAqCisgKiBDcmVhdGUgdGhlIGRvcyBtZW1vcnkgc2VnbWVudHMsIGFuZCBzdG9yZSB0aGVtIGludG8gdGhlIEtFUk5FTAorICogZXhwb3J0ZWQgdmFsdWVzLiBNT0RVTEVfSW5pdCgpIG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gY2FsbGVkLgorICovCitCT09MIERPU01FTV9Jbml0KHZvaWQpCit7CisgICAgSE1PRFVMRSBoTW9kdWxlID0gR2V0TW9kdWxlSGFuZGxlKCAiS0VSTkVMIiApOworICAgIGNoYXIgKmRvc21lbTsKKworICAgIC8qIEFsbG9jYXRlIDcgNjRrIHNlZ21lbnRzIGZvciAwMDAwLCBBMDAwLCBCMDAwLCBDMDAwLCBEMDAwLCBFMDAwLCBGMDAwLiAqLworCisgICAgZG9zbWVtID0gbWFsbG9jKCAweDcwMDAwICk7CisKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTgzLCAgLyogS0VSTkVMLjE4MzogX18wMDAwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKKyAgICBET1NNRU1fQmlvc1NlZyA9IEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg0MDAsIDB4MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICk7CisKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTkzLCAgLyogS0VSTkVMLjE5MzogX18wMDQwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBET1NNRU1fQmlvc1NlZyApOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxNzQsICAvKiBLRVJORUwuMTc0OiBfX0EwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHgxMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTgxLCAgLyogS0VSTkVMLjE4MTogX19CMDAwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4MjAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7CisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE4MiwgIC8qIEtFUk5FTC4xODI6IF9fQjgwMEggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDI4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTUsICAvKiBLRVJORUwuMTk1OiBfX0MwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHgzMDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKKyAgICBNT0RVTEVfU2V0RW50cnlQb2ludCggaE1vZHVsZSwgMTc5LCAgLyogS0VSTkVMLjE3OTogX19EMDAwSCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBHTE9CQUxfQ3JlYXRlQmxvY2soIEdNRU1fRklYRUQsIGRvc21lbSArIDB4NDAwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAwMDAsIGhNb2R1bGUsIEZBTFNFLCBGQUxTRSwgRkFMU0UsIE5VTEwgKSk7CisgICAgTU9EVUxFX1NldEVudHJ5UG9pbnQoIGhNb2R1bGUsIDE5MCwgIC8qIEtFUk5FTC4xOTA6IF9fRTAwMEggKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDUwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxNzMsICAvKiBLRVJORUwuMTczOiBfX1JPTUJJT1MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgR0xPQkFMX0NyZWF0ZUJsb2NrKCBHTUVNX0ZJWEVELCBkb3NtZW0gKyAweDYwMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMDAwLCBoTW9kdWxlLCBGQUxTRSwgRkFMU0UsIEZBTFNFLCBOVUxMICkpOworICAgIE1PRFVMRV9TZXRFbnRyeVBvaW50KCBoTW9kdWxlLCAxOTQsICAvKiBLRVJORUwuMTk0OiBfX0YwMDBIICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEdMT0JBTF9DcmVhdGVCbG9jayggR01FTV9GSVhFRCwgZG9zbWVtICsgMHg2MDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDAwMCwgaE1vZHVsZSwgRkFMU0UsIEZBTFNFLCBGQUxTRSwgTlVMTCApKTsKKyAgICBET1NNRU1fRmlsbEJpb3NTZWdtZW50KCk7CisKKyAgICByZXR1cm4gVFJVRTsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBET1NNRU1fQWxhcm0KKyAqCisgKiBJbmNyZW1lbnQgdGhlIEJJT1MgdGljayBjb3VudGVyLgorICovCitzdGF0aWMgdm9pZCBET1NNRU1fQWxhcm0odm9pZCkKK3sKKyAgICBwQmlvc0RhdGEtPlRpY2tzID0gSU5UMUFfR2V0VGlja3NTaW5jZU1pZG5pZ2h0KCk7CisgICAgcHJpbnRmKCAiVGlja3MgPSAlZFxuIiwgcEJpb3NEYXRhLT5UaWNrcyApOworLyoKKyAgICBzaWduYWwoIFNJR0FMUk0sIERPU01FTV9BbGFybSApOworICAgIGFsYXJtKCAxICk7CisqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIERPU01FTV9GaWxsQmlvc1NlZ21lbnQKKyAqCisgKiBGaWxsIHRoZSBCSU9TIGRhdGEgc2VnbWVudCB3aXRoIGR1bW15IHZhbHVlcy4KKyAqLwordm9pZCBET1NNRU1fRmlsbEJpb3NTZWdtZW50KHZvaWQpCit7CisgICAgcEJpb3NEYXRhID0gKEJJT1NEQVRBICopR2xvYmFsTG9jayggRE9TTUVNX0Jpb3NTZWcgKTsKKworICAgICAgLyogQ2xlYXIgYWxsIHVudXNlZCB2YWx1ZXMgKi8KKyAgICBtZW1zZXQoIHBCaW9zRGF0YSwgMCwgc2l6ZW9mKCpwQmlvc0RhdGEpICk7CisKKyAgICAvKiBGSVhNRTogc2hvdWxkIGNoZWNrIHRoZSBudW1iZXIgb2YgY29uZmlndXJlZCBkcml2ZXMgYW5kIHBvcnRzICovCisKKyAgICBwQmlvc0RhdGEtPkNvbTFBZGRyICAgICAgICAgICAgID0gMHgzZTg7CisgICAgcEJpb3NEYXRhLT5Db20yQWRkciAgICAgICAgICAgICA9IDB4MmU4OworICAgIHBCaW9zRGF0YS0+THB0MUFkZHIgICAgICAgICAgICAgPSAweDM3ODsKKyAgICBwQmlvc0RhdGEtPkxwdDJBZGRyICAgICAgICAgICAgID0gMHgyNzg7CisgICAgcEJpb3NEYXRhLT5JbnN0YWxsZWRIYXJkd2FyZSAgICA9IDB4ODQ0MzsKKyAgICBwQmlvc0RhdGEtPk1lbVNpemUgICAgICAgICAgICAgID0gNjQwOworICAgIHBCaW9zRGF0YS0+TmV4dEtiZENoYXJQdHIgICAgICAgPSAweDFlOworICAgIHBCaW9zRGF0YS0+Rmlyc3RLYmRDaGFyUHRyICAgICAgPSAweDFlOworICAgIHBCaW9zRGF0YS0+VmlkZW9Nb2RlICAgICAgICAgICAgPSAwOworICAgIHBCaW9zRGF0YS0+VmlkZW9Db2x1bW5zICAgICAgICAgPSA4MDsKKyAgICBwQmlvc0RhdGEtPlZpZGVvUGFnZVNpemUgICAgICAgID0gODAgKiAyNSAqIDI7CisgICAgcEJpb3NEYXRhLT5WaWRlb1BhZ2VTdGFydEFkZHIgICA9IDB4YjgwMDsKKyAgICBwQmlvc0RhdGEtPlZpZGVvQ3RybEFkZHIgICAgICAgID0gMHgzZDQ7CisgICAgcEJpb3NEYXRhLT5UaWNrcyAgICAgICAgICAgICAgICA9IElOVDFBX0dldFRpY2tzU2luY2VNaWRuaWdodCgpOworICAgIHBCaW9zRGF0YS0+TmJIYXJkRGlza3MgICAgICAgICAgPSAyOworICAgIHBCaW9zRGF0YS0+S2JkQnVmZmVyU3RhcnQgICAgICAgPSAweDFlOworICAgIHBCaW9zRGF0YS0+S2JkQnVmZmVyRW5kICAgICAgICAgPSAweDNlOworCisvKgorICAgIHNpZ25hbCggU0lHQUxSTSwgRE9TTUVNX0FsYXJtICk7CisgICAgYWxhcm0oIDEgKTsKKyovCit9CmRpZmYgLS1naXQgYS9taXNjZW11L2VtdWxhdGUuYyBiL21pc2NlbXUvZW11bGF0ZS5jCmluZGV4IGE4YjQwZjMuLmFmYTYxZTcgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvZW11bGF0ZS5jCisrKyBiL21pc2NlbXUvZW11bGF0ZS5jCkBAIC03MiwxMSArNzIsMTIgQEAKICAgICAgICAgLyogSU46IEFYJjB4MEMwMCByb3VuZGluZyBwcm90b2NvbCAqLwogICAgICAgICAvKiBPVVQ6IERYOkFYIHZhcmlhYmxlIHBvcHBlZCAqLwogICAgICAgICB7Ci0gICAgICAgICAgICBEV09SRCBkdyxqdW5rOworICAgICAgICAgICAgRFdPUkQgZHc7CiAgICAgICAgICAgICAvKiBJIGRvbid0IGtub3cgbXVjaCBhYm91dCBhc20oKSBwcm9ncmFtbWluZy4gVGhpcyBjb3VsZCBiZSAKICAgICAgICAgICAgICAqIHdyb25nLiAKICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgX19hc21fXygiZmlzdHAgJTFcbndhaXQiOiI9bSIgKGp1bmspOiJtIiAoZHcpOiJtZW1vcnkiKTsKKy8qIEZJWE1FOiBjb3VsZCBzb21lb25lIHdobyByZWFsbHkgdW5kZXJzdGFuZHMgYXNtKCkgZml4IHRoaXMgcGxlYXNlPyAtLUFKICovCisvKiAgICAgICAgICAgIF9fYXNtX18oImZpc3RwICUwO3dhaXQiIDogIj1tIiAoZHcpIDogOiAibWVtb3J5Iik7ICovCiAgICAgICAgICAgICBkcHJpbnRmX2ludChzdGRkZWIsImVtdWxhdGUuYzpPbiB0b3Agb2Ygc3RhY2sgd2FzICVsZFxuIixkdyk7CiAgICAgICAgICAgICBBWF9yZWcoJmNvbnRleHQpID0gTE9XT1JEKGR3KTsKICAgICAgICAgICAgIERYX3JlZygmY29udGV4dCkgPSBISVdPUkQoZHcpOwpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnN0ci5jIGIvbWlzY2VtdS9pbnN0ci5jCmluZGV4IDU1Mzg4ZGEuLmU1ZDg5ZDggMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW5zdHIuYworKysgYi9taXNjZW11L2luc3RyLmMKQEAgLTExLDYgKzExLDI1OCBAQAogI2luY2x1ZGUgInJlZ2lzdGVycy5oIgogCiAKKyNkZWZpbmUgU1RBQ0tfUFRSKGNvbnRleHQpIFwKKyAgICAoUFRSX1NFR19PRkZfVE9fTElOKCBTU19yZWcoY29udGV4dCksIFwKKyAgICAgICAgKChHRVRfU0VMX0ZMQUdTKFNTX3JlZyhjb250ZXh0KSkgJiBMRFRfRkxBR1NfMzJCSVQpID8gXAorICAgICAgICAgICAgRVNQX3JlZyhjb250ZXh0KSA6IFNQX3JlZyhjb250ZXh0KSkpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICAgICAgICAgICBJTlNUUl9SZXBsYWNlU2VsZWN0b3IKKyAqCisgKiBUcnkgdG8gcmVwbGFjZSBhbiBpbnZhbGlkIHNlbGVjdG9yIGJ5IGEgdmFsaWQgb25lLgorICogRm9yIG5vdywgb25seSBzZWxlY3RvciAweDQwIGlzIGhhbmRsZWQgaGVyZS4KKyAqLworc3RhdGljIFdPUkQgSU5TVFJfUmVwbGFjZVNlbGVjdG9yKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQsIFdPUkQgc2VsKQoreworICAgIGlmIChzZWwgPT0gMHg0MCkKKyAgICB7CisgICAgICAgIGZwcmludGYoIHN0ZGVyciwgIkRpcmVjdCBhY2Nlc3MgdG8gc2VnbWVudCAweDQwIChjczppcD0lMDR4OiUwNGx4KS5cbiIsCisgICAgICAgICAgICAgICAgIENTX3JlZyhjb250ZXh0KSwgRUlQX3JlZyhjb250ZXh0KSApOworICAgICAgICByZXR1cm4gRE9TTUVNX0Jpb3NTZWc7CisgICAgfQorICAgIHJldHVybiAwOyAgLyogQ2FuJ3QgcmVwbGFjZSBzZWxlY3RvciAqLworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAgICAgIElOU1RSX0dldE9wZXJhbmRBZGRyCisgKgorICogUmV0dXJuIHRoZSBhZGRyZXNzIG9mIGFuIGluc3RydWN0aW9uIG9wZXJhbmQgKGZyb20gdGhlIG1vZC9ybSBieXRlKS4KKyAqLworc3RhdGljIEJZVEUgKklOU1RSX0dldE9wZXJhbmRBZGRyKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKmluc3RyLCBpbnQgbG9uZ19hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VncHJlZml4LCBpbnQgKmxlbiApCit7CisgICAgaW50IG1vZCwgcm0sIGJhc2UsIGluZGV4ID0gMCwgc3MgPSAwLCBzZWcgPSAwLCBvZmY7CisKKyNkZWZpbmUgR0VUX1ZBTCh2YWwsdHlwZSkgXAorICAgIHsgKnZhbCA9ICoodHlwZSAqKWluc3RyOyBpbnN0ciArPSBzaXplb2YodHlwZSk7ICpsZW4gKz0gc2l6ZW9mKHR5cGUpOyB9CisKKyAgICAqbGVuID0gMDsKKyAgICBHRVRfVkFMKCAmbW9kLCBCWVRFICk7CisgICAgcm0gPSBtb2QgJiA3OworICAgIG1vZCA+Pj0gNjsKKworICAgIGlmIChtb2QgPT0gMykKKyAgICB7CisgICAgICAgIHN3aXRjaChybSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6IHJldHVybiAoQllURSAqKSZFQVhfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDE6IHJldHVybiAoQllURSAqKSZFQ1hfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDI6IHJldHVybiAoQllURSAqKSZFRFhfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDM6IHJldHVybiAoQllURSAqKSZFQlhfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDQ6IHJldHVybiAoQllURSAqKSZFU1BfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDU6IHJldHVybiAoQllURSAqKSZFQlBfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDY6IHJldHVybiAoQllURSAqKSZFU0lfcmVnKGNvbnRleHQpOworICAgICAgICBjYXNlIDc6IHJldHVybiAoQllURSAqKSZFRElfcmVnKGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvbmdfYWRkcikKKyAgICB7CisgICAgICAgIGlmIChybSA9PSA0KQorICAgICAgICB7CisgICAgICAgICAgICBCWVRFIHNpYjsKKyAgICAgICAgICAgIEdFVF9WQUwoICZzaWIsIEJZVEUgKTsKKyAgICAgICAgICAgIHJtID0gc2liICYgNzsKKyAgICAgICAgICAgIHNzID0gc2liID4+IDY7CisgICAgICAgICAgICBzd2l0Y2goc2liID4+IDMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDA6IGluZGV4ID0gRUFYX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6IGluZGV4ID0gRUNYX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6IGluZGV4ID0gRURYX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDM6IGluZGV4ID0gRUJYX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDQ6IGluZGV4ID0gMDsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6IGluZGV4ID0gRUJQX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDY6IGluZGV4ID0gRVNJX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDc6IGluZGV4ID0gRURJX3JlZyhjb250ZXh0KTsgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2gocm0pCisgICAgICAgIHsKKyAgICAgICAgY2FzZSAwOiBiYXNlID0gRUFYX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSAxOiBiYXNlID0gRUNYX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSAyOiBiYXNlID0gRURYX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBiYXNlID0gRUJYX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSA0OiBiYXNlID0gRVNQX3JlZyhjb250ZXh0KTsgc2VnID0gU1NfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSA1OiBiYXNlID0gRUJQX3JlZyhjb250ZXh0KTsgc2VnID0gU1NfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSA2OiBiYXNlID0gRVNJX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgY2FzZSA3OiBiYXNlID0gRURJX3JlZyhjb250ZXh0KTsgc2VnID0gRFNfcmVnKGNvbnRleHQpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKG1vZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAocm0gPT0gNSkgIC8qIHNwZWNpYWwgY2FzZTogZHM6KGRpc3AzMikgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHRVRfVkFMKCAmYmFzZSwgRFdPUkQgKTsKKyAgICAgICAgICAgICAgICBzZWcgPSBEU19yZWcoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6ICAvKiA4LWJpdCBkaXNwICovCisgICAgICAgICAgICBHRVRfVkFMKCAmb2ZmLCBCWVRFICk7CisgICAgICAgICAgICBiYXNlICs9IChzaWduZWQgY2hhcilvZmY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6ICAvKiAzMi1iaXQgZGlzcCAqLworICAgICAgICAgICAgR0VUX1ZBTCggJm9mZiwgRFdPUkQgKTsKKyAgICAgICAgICAgIGJhc2UgKz0gKHNpZ25lZCBsb25nKW9mZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgIC8qIHNob3J0IGFkZHJlc3MgKi8KKyAgICB7CisgICAgICAgIHN3aXRjaChybSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6ICAvKiBkczooYngsc2kpICovCisgICAgICAgICAgICBiYXNlID0gQlhfcmVnKGNvbnRleHQpICsgU0lfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IERTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6ICAvKiBkczooYngsZGkpICovCisgICAgICAgICAgICBiYXNlID0gQlhfcmVnKGNvbnRleHQpICsgRElfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IERTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6ICAvKiBzczooYnAsc2kpICovCisgICAgICAgICAgICBiYXNlID0gQlBfcmVnKGNvbnRleHQpICsgU0lfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IFNTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6ICAvKiBzczooYnAsZGkpICovCisgICAgICAgICAgICBiYXNlID0gQlBfcmVnKGNvbnRleHQpICsgRElfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IFNTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6ICAvKiBkczooc2kpICovCisgICAgICAgICAgICBiYXNlID0gU0lfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IERTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU6ICAvKiBkczooZGkpICovCisgICAgICAgICAgICBiYXNlID0gRElfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IERTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY6ICAvKiBzczooYnApICovCisgICAgICAgICAgICBiYXNlID0gQlBfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IFNTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc6ICAvKiBkczooYngpICovCisgICAgICAgICAgICBiYXNlID0gQlhfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgc2VnICA9IERTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoKG1vZCkKKyAgICAgICAgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBpZiAocm0gPT0gNikgIC8qIHNwZWNpYWwgY2FzZTogZHM6KGRpc3AxNikgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBHRVRfVkFMKCAmYmFzZSwgV09SRCApOworICAgICAgICAgICAgICAgIHNlZyAgPSBEU19yZWcoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDE6ICAvKiA4LWJpdCBkaXNwICovCisgICAgICAgICAgICBHRVRfVkFMKCAmb2ZmLCBCWVRFICk7CisgICAgICAgICAgICBiYXNlICs9IChzaWduZWQgY2hhcilvZmY7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6ICAvKiAxNi1iaXQgZGlzcCAqLworICAgICAgICAgICAgR0VUX1ZBTCggJm9mZiwgV09SRCApOworICAgICAgICAgICAgYmFzZSArPSAoc2lnbmVkIHNob3J0KW9mZjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzZWdwcmVmaXggIT0gLTEpIHNlZyA9IHNlZ3ByZWZpeDsKKworICAgIHJldHVybiAoQllURSAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggc2VnLCAoYmFzZSArIChpbmRleCA8PCBzcykpICk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgSU5TVFJfRW11bGF0ZUxEUworICoKKyAqIEVtdWxhdGUgdGhlIExEUyAoYW5kIExFUyxMRlMsZXRjLikgaW5zdHJ1Y3Rpb24uCisgKi8KK3N0YXRpYyBCT09MIElOU1RSX0VtdWxhdGVMRFMoIHN0cnVjdCBzaWdjb250ZXh0X3N0cnVjdCAqY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJZVEUgKmluc3RyLCBpbnQgbG9uZ19vcCwgaW50IGxvbmdfYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZWdwcmVmaXgsIGludCAqbGVuICkKK3sKKyAgICBCWVRFICpyZWdtb2RybSA9IGluc3RyICsgMSArICgqaW5zdHIgPT0gMHgwZik7CisgICAgQllURSAqYWRkciA9IElOU1RSX0dldE9wZXJhbmRBZGRyKCBjb250ZXh0LCByZWdtb2RybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdfYWRkciwgc2VncHJlZml4LCBsZW4gKTsKKyAgICBXT1JEIHNlZyA9ICooV09SRCAqKShhZGRyICsgKGxvbmdfb3AgPyA0IDogMikpOworCisgICAgaWYgKCEoc2VnID0gSU5TVFJfUmVwbGFjZVNlbGVjdG9yKCBjb250ZXh0LCBzZWcgKSkpCisgICAgICAgIHJldHVybiBGQUxTRTsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCisKKyAgICAvKiBOb3cgc3RvcmUgdGhlIG9mZnNldCBpbiB0aGUgY29ycmVjdCByZWdpc3RlciAqLworCisgICAgc3dpdGNoKCgqcmVnbW9kcm0gPj4gMykgJiA3KQorICAgIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGlmIChsb25nX29wKSBFQVhfcmVnKGNvbnRleHQpID0gKihEV09SRCAqKWFkZHI7CisgICAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gKihXT1JEICopYWRkcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxOgorICAgICAgICBpZiAobG9uZ19vcCkgRUNYX3JlZyhjb250ZXh0KSA9ICooRFdPUkQgKilhZGRyOworICAgICAgICBlbHNlIENYX3JlZyhjb250ZXh0KSA9ICooV09SRCAqKWFkZHI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgaWYgKGxvbmdfb3ApIEVEWF9yZWcoY29udGV4dCkgPSAqKERXT1JEICopYWRkcjsKKyAgICAgICAgZWxzZSBEWF9yZWcoY29udGV4dCkgPSAqKFdPUkQgKilhZGRyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICAgIGlmIChsb25nX29wKSBFQlhfcmVnKGNvbnRleHQpID0gKihEV09SRCAqKWFkZHI7CisgICAgICAgIGVsc2UgQlhfcmVnKGNvbnRleHQpID0gKihXT1JEICopYWRkcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICBpZiAobG9uZ19vcCkgRVNQX3JlZyhjb250ZXh0KSA9ICooRFdPUkQgKilhZGRyOworICAgICAgICBlbHNlIFNQX3JlZyhjb250ZXh0KSA9ICooV09SRCAqKWFkZHI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgaWYgKGxvbmdfb3ApIEVCUF9yZWcoY29udGV4dCkgPSAqKERXT1JEICopYWRkcjsKKyAgICAgICAgZWxzZSBCUF9yZWcoY29udGV4dCkgPSAqKFdPUkQgKilhZGRyOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDY6CisgICAgICAgIGlmIChsb25nX29wKSBFU0lfcmVnKGNvbnRleHQpID0gKihEV09SRCAqKWFkZHI7CisgICAgICAgIGVsc2UgU0lfcmVnKGNvbnRleHQpID0gKihXT1JEICopYWRkcjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICBpZiAobG9uZ19vcCkgRURJX3JlZyhjb250ZXh0KSA9ICooRFdPUkQgKilhZGRyOworICAgICAgICBlbHNlIERJX3JlZyhjb250ZXh0KSA9ICooV09SRCAqKWFkZHI7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8qIFN0b3JlIHRoZSBjb3JyZWN0IHNlZ21lbnQgaW4gdGhlIHNlZ21lbnQgcmVnaXN0ZXIgKi8KKworICAgIHN3aXRjaCgqaW5zdHIpCisgICAgeworICAgIGNhc2UgMHhjNDogRVNfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsgIC8qIGxlcyAqLworICAgIGNhc2UgMHhjNTogRFNfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsgIC8qIGxkcyAqLworICAgIGNhc2UgMHgwZjogc3dpdGNoKGluc3RyWzFdKQorICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgY2FzZSAweGIyOiBTU19yZWcoY29udGV4dCkgPSBzZWc7IGJyZWFrOyAgLyogbHNzICovCisgICAgICAgICAgICAgICBjYXNlIDB4YjQ6IEZTX3JlZyhjb250ZXh0KSA9IHNlZzsgYnJlYWs7ICAvKiBsZnMgKi8KKyAgICAgICAgICAgICAgIGNhc2UgMHhiNTogR1NfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsgIC8qIGxncyAqLworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogQWRkIHRoZSBvcGNvZGUgc2l6ZSB0byB0aGUgdG90YWwgbGVuZ3RoICovCisKKyAgICAqbGVuICs9IDEgKyAoKmluc3RyID09IDB4MGYpOworICAgIHJldHVybiBUUlVFOworfQorCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICogICAgICAgICAgIElOU1RSX0VtdWxhdGVJbnN0cnVjdGlvbgogICoKQEAgLTE4LDcgKzI3MCw3IEBACiAgKi8KIEJPT0wgSU5TVFJfRW11bGF0ZUluc3RydWN0aW9uKCBzdHJ1Y3Qgc2lnY29udGV4dF9zdHJ1Y3QgKmNvbnRleHQgKQogewotICAgIGludCBwcmVmaXgsIHNlZ3ByZWZpeCwgcmVwWCwgbG9uZ19vcCwgbG9uZ19hZGRyOworICAgIGludCBwcmVmaXgsIHNlZ3ByZWZpeCwgcHJlZml4bGVuLCBsZW4sIHJlcFgsIGxvbmdfb3AsIGxvbmdfYWRkcjsKICAgICBCWVRFICppbnN0cjsKIAogICAgIGxvbmdfb3AgPSBsb25nX2FkZHIgPSAoR0VUX1NFTF9GTEFHUyhDU19yZWcoY29udGV4dCkpICYgTERUX0ZMQUdTXzMyQklUKSAhPSAwOwpAQCAtMjksNiArMjgxLDcgQEAKICAgICBzZWdwcmVmaXggPSAtMTsgIC8qIG5vIHByZWZpeCAqLwogICAgIHByZWZpeCA9IDE7CiAgICAgcmVwWCA9IDA7CisgICAgcHJlZml4bGVuID0gMDsKICAgICB3aGlsZShwcmVmaXgpCiAgICAgewogICAgICAgICBzd2l0Y2goKmluc3RyKQpAQCAtNzIsNyArMzI1LDcgQEAKICAgICAgICAgaWYgKHByZWZpeCkKICAgICAgICAgewogICAgICAgICAgICAgaW5zdHIrKzsKLSAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkrKzsKKyAgICAgICAgICAgIHByZWZpeGxlbisrOwogICAgICAgICB9CiAgICAgfQogCkBAIC04MCwxMDMgKzMzMyw1OSBAQAogCiAgICAgc3dpdGNoKCppbnN0cikKICAgICB7Ci0gICAgICAgIGNhc2UgMHhjZDogLyogaW50IDxYWD4gKi8KLSAgICAgICAgICAgIGlmIChsb25nX29wKQorICAgICAgICBjYXNlIDB4MDc6IC8qIHBvcCBlcyAqLworICAgICAgICBjYXNlIDB4MTc6IC8qIHBvcCBzcyAqLworICAgICAgICBjYXNlIDB4MWY6IC8qIHBvcCBkcyAqLwogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW50IHh4IGZyb20gMzItYml0IGNvZGUgaXMgbm90IHN1cHBvcnRlZC5cbiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCisgICAgICAgICAgICAgICAgV09SRCBzZWcgPSAqKFdPUkQgKilTVEFDS19QVFIoIGNvbnRleHQgKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNlZyA9IElOU1RSX1JlcGxhY2VTZWxlY3RvciggY29udGV4dCwgc2VnICkpICE9IDApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2goKmluc3RyKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMHgwNzogRVNfcmVnKGNvbnRleHQpID0gc2VnOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAweDE3OiBTU19yZWcoY29udGV4dCkgPSBzZWc7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MWY6IERTX3JlZyhjb250ZXh0KSA9IHNlZzsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IHNpemVvZihXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyAxOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCisgICAgICAgICAgICBicmVhazsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCisKKyAgICAgICAgY2FzZSAweDBmOiAvKiBleHRlbmRlZCBpbnN0cnVjdGlvbiAqLworICAgICAgICAgICAgc3dpdGNoKGluc3RyWzFdKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNFR1BUUiBhZGRyID0gSU5UX0dldEhhbmRsZXIoIGluc3RyWzFdICk7Ci0gICAgICAgICAgICAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayB0aGUgc3RhY2sgJ2JpZycgYml0ICovCi0gICAgICAgICAgICAgICAgV09SRCAqc3RhY2sgPSAoV09SRCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggU1NfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX3JlZyhjb250ZXh0KSApOwotICAgICAgICAgICAgICAgIC8qIFB1c2ggdGhlIGZsYWdzIGFuZCByZXR1cm4gYWRkcmVzcyBvbiB0aGUgc3RhY2sgKi8KLSAgICAgICAgICAgICAgICAqKC0tc3RhY2spID0gRkxfcmVnKGNvbnRleHQpOwotICAgICAgICAgICAgICAgICooLS1zdGFjaykgPSBDU19yZWcoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgKigtLXN0YWNrKSA9IElQX3JlZyhjb250ZXh0KSArIDI7Ci0gICAgICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpIC09IDMgKiBzaXplb2YoV09SRCk7Ci0gICAgICAgICAgICAgICAgLyogSnVtcCB0byB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8KLSAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCkgID0gSElXT1JEKGFkZHIpOwotICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgPSBMT1dPUkQoYWRkcik7CisgICAgICAgICAgICBjYXNlIDB4YTE6IC8qIHBvcCBmcyAqLworICAgICAgICAgICAgY2FzZSAweGE5OiAvKiBwb3AgZ3MgKi8KKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFdPUkQgc2VnID0gKihXT1JEICopU1RBQ0tfUFRSKCBjb250ZXh0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoc2VnID0gSU5TVFJfUmVwbGFjZVNlbGVjdG9yKCBjb250ZXh0LCBzZWcgKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGluc3RyWzFdKQorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweGExOiBGU19yZWcoY29udGV4dCkgPSBzZWc7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAweGE5OiBHU19yZWcoY29udGV4dCkgPSBzZWc7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IHNpemVvZihXT1JEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIDB4YjI6IC8qIGxzcyBhZGRyLHJlZyAqLworICAgICAgICAgICAgY2FzZSAweGI0OiAvKiBsZnMgYWRkcixyZWcgKi8KKyAgICAgICAgICAgIGNhc2UgMHhiNTogLyogbGdzIGFkZHIscmVnICovCisgICAgICAgICAgICAgICAgaWYgKElOU1RSX0VtdWxhdGVMRFMoIGNvbnRleHQsIGluc3RyLCBsb25nX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2FkZHIsIHNlZ3ByZWZpeCwgJmxlbiApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyBsZW47CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHhjZjogLyogaXJldCAqLwotICAgICAgICAgICAgaWYgKGxvbmdfb3ApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayB0aGUgc3RhY2sgJ2JpZycgYml0ICovCi0gICAgICAgICAgICAgICAgRFdPUkQgKnN0YWNrID0gKERXT1JEICopUFRSX1NFR19PRkZfVE9fTElOKCBTU19yZWcoY29udGV4dCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpID0gKnN0YWNrKys7Ci0gICAgICAgICAgICAgICAgQ1NfcmVnKGNvbnRleHQpICA9ICpzdGFjaysrOwotICAgICAgICAgICAgICAgIEVGTF9yZWcoY29udGV4dCkgPSAqc3RhY2s7Ci0gICAgICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IDMqc2l6ZW9mKERXT1JEKTsgIC8qIFBvcCB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kIGZsYWdzICovCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRklYTUU6IHNob3VsZCBjaGVjayB0aGUgc3RhY2sgJ2JpZycgYml0ICovCi0gICAgICAgICAgICAgICAgV09SRCAqc3RhY2sgPSAoV09SRCAqKVBUUl9TRUdfT0ZGX1RPX0xJTiggU1NfcmVnKGNvbnRleHQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNQX3JlZyhjb250ZXh0KSApOwotICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgPSAqc3RhY2srKzsKLSAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCkgID0gKnN0YWNrKys7Ci0gICAgICAgICAgICAgICAgRkxfcmVnKGNvbnRleHQpICA9ICpzdGFjazsKLSAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gMypzaXplb2YoV09SRCk7ICAvKiBQb3AgdGhlIHJldHVybiBhZGRyZXNzIGFuZCBmbGFncyAqLwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweGU0OiAvKiBpbmIgYWwsWFggKi8KLSAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IGlucG9ydCggaW5zdHJbMV0sIDEgKTsKLQkgICAgRUlQX3JlZyhjb250ZXh0KSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweGU1OiAvKiBpbiAoZSlheCxYWCAqLwotICAgICAgICAgICAgaWYgKGxvbmdfb3ApIEVBWF9yZWcoY29udGV4dCkgPSBpbnBvcnQoIGluc3RyWzFdLCA0ICk7Ci0gICAgICAgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IGlucG9ydCggaW5zdHJbMV0sIDIgKTsKLQkgICAgRUlQX3JlZyhjb250ZXh0KSArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweGU2OiAvKiBvdXRiIFhYLGFsICovCi0gICAgICAgICAgICBvdXRwb3J0KCBpbnN0clsxXSwgMSwgQUxfcmVnKGNvbnRleHQpICk7Ci0JICAgIEVJUF9yZWcoY29udGV4dCkgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHhlNzogLyogb3V0IFhYLChlKWF4ICovCi0gICAgICAgICAgICBpZiAobG9uZ19vcCkgb3V0cG9ydCggaW5zdHJbMV0sIDQsIEVBWF9yZWcoY29udGV4dCkgKTsKLSAgICAgICAgICAgIGVsc2Ugb3V0cG9ydCggaW5zdHJbMV0sIDIsIEFYX3JlZyhjb250ZXh0KSApOwotICAJICAgIEVJUF9yZWcoY29udGV4dCkgKz0gMjsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgMHhlYzogLyogaW5iIGFsLGR4ICovCi0gICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSBpbnBvcnQoIERYX3JlZyhjb250ZXh0KSwgMSApOwotCSAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ZWQ6IC8qIGluIChlKWF4LGR4ICovCi0gICAgICAgICAgICBpZiAobG9uZ19vcCkgRUFYX3JlZyhjb250ZXh0KSA9IGlucG9ydCggRFhfcmVnKGNvbnRleHQpLCA0ICk7Ci0gICAgICAgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IGlucG9ydCggRFhfcmVnKGNvbnRleHQpLCAyICk7Ci0JICAgIEVJUF9yZWcoY29udGV4dCkrKzsgIAotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAweGVlOiAvKiBvdXRiIGR4LGFsICovCi0gICAgICAgICAgICBvdXRwb3J0KCBEWF9yZWcoY29udGV4dCksIDEsIEFMX3JlZyhjb250ZXh0KSApOwotCSAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgIAotICAgICAgICBjYXNlIDB4ZWY6IC8qIG91dCBkeCwoZSlheCAqLwotICAgICAgICAgICAgaWYgKGxvbmdfb3ApIG91dHBvcnQoIERYX3JlZyhjb250ZXh0KSwgNCwgRUFYX3JlZyhjb250ZXh0KSApOwotICAgICAgICAgICAgZWxzZSBvdXRwb3J0KCBEWF9yZWcoY29udGV4dCksIDIsIEFYX3JlZyhjb250ZXh0KSApOwotCSAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ZmE6IC8qIGNsaSwgaWdub3JlZCAqLwotCSAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIDB4ZmI6IC8qIHN0aSwgaWdub3JlZCAqLwotCSAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGJyZWFrOyAgLyogVW5hYmxlIHRvIGVtdWxhdGUgaXQgKi8KIAogICAgICAgICBjYXNlIDB4NmM6IC8qIGluc2IgICAgICovCiAgICAgICAgIGNhc2UgMHg2ZDogLyogaW5zdy9kICAgKi8KQEAgLTE5MCw3ICszOTksNyBAQAogCSAgICAgIGludCBvcHNpemUgPSAodHlwICYgMSkgPyAobG9uZ19vcCA/IDQgOiAyKSA6IDE7CiAJICAgICAgaW50IHN0ZXAgPSAoRUZMX3JlZyhjb250ZXh0KSAmIDB4NDAwKSA/IC1vcHNpemUgOiArb3BzaXplOwogCSAgICAgIGludCBzZWcgPSBvdXRwID8gKHNlZ3ByZWZpeCA+PSAwID8gc2VncHJlZml4IDogRFNfcmVnKGNvbnRleHQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVTX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFU19yZWcoY29udGV4dCk7ICAvKiBGSVhNRTogaXMgdGhpcyByaWdodD8gKi8KIAogCSAgICAgIGlmIChvdXRwKQogCQkvKiBGSVhNRTogQ2hlY2sgc2VnbWVudCByZWFkYWJsZS4gICovCkBAIC0yNDUsMTQgKzQ1NCwxNTEgQEAKIAkJICAgICAgYnJlYWs7CiAJCSAgICB9CiAJCX0KLQkgICAgICBFSVBfcmVnKGNvbnRleHQpKys7Ci0JICAgICAgYnJlYWs7CisgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMTsKIAkgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIlVuZXhwZWN0ZWQgV2luZG93cyBwcm9ncmFtIHNlZ2ZhdWx0IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgLSBvcGNvZGUgPSAleFxuIiwgKmluc3RyKTsKLSAgICAgICAgICAgIHJldHVybiBGQUxTRTsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCisgICAgICAgIGNhc2UgMHg4ZTogLyogbW92IHJlZyxzZWdtZW50X3JlZyAqLworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFdPUkQgc2VnID0gKihXT1JEICopSU5TVFJfR2V0T3BlcmFuZEFkZHIoIGNvbnRleHQsIGluc3RyICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZ19hZGRyLCBzZWdwcmVmaXgsICZsZW4gKTsKKyAgICAgICAgICAgICAgICBpZiAoIShzZWcgPSBJTlNUUl9SZXBsYWNlU2VsZWN0b3IoIGNvbnRleHQsIHNlZyApKSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAvKiBVbmFibGUgdG8gZW11bGF0ZSBpdCAqLworCisgICAgICAgICAgICAgICAgc3dpdGNoKChpbnN0clsxXSA+PiAzKSAmIDcpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICAgICAgRVNfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgMTogIC8qIGNzICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgU1NfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgRFNfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICAgICAgRlNfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgR1NfcmVnKGNvbnRleHQpID0gc2VnOworICAgICAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIGxlbiArIDE7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgICAgIGNhc2UgNjogIC8qIHVudXNlZCAqLworICAgICAgICAgICAgICAgIGNhc2UgNzogIC8qIHVudXNlZCAqLworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsgIC8qIFVuYWJsZSB0byBlbXVsYXRlIGl0ICovCisKKyAgICAgICAgY2FzZSAweGM0OiAvKiBsZXMgYWRkcixyZWcgKi8KKyAgICAgICAgY2FzZSAweGM1OiAvKiBsZHMgYWRkcixyZWcgKi8KKyAgICAgICAgICAgIGlmIChJTlNUUl9FbXVsYXRlTERTKCBjb250ZXh0LCBpbnN0ciwgbG9uZ19vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb25nX2FkZHIsIHNlZ3ByZWZpeCwgJmxlbiApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgbGVuOworICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7ICAvKiBVbmFibGUgdG8gZW11bGF0ZSBpdCAqLworICAgICAgICAgICAgCisgICAgICAgIGNhc2UgMHhjZDogLyogaW50IDxYWD4gKi8KKyAgICAgICAgICAgIGlmIChsb25nX29wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW50IHh4IGZyb20gMzItYml0IGNvZGUgaXMgbm90IHN1cHBvcnRlZC5cbiIpOworICAgICAgICAgICAgICAgIGJyZWFrOyAgLyogVW5hYmxlIHRvIGVtdWxhdGUgaXQgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTRUdQVFIgYWRkciA9IElOVF9HZXRIYW5kbGVyKCBpbnN0clsxXSApOworICAgICAgICAgICAgICAgIFdPUkQgKnN0YWNrID0gKFdPUkQgKilTVEFDS19QVFIoIGNvbnRleHQgKTsKKyAgICAgICAgICAgICAgICAvKiBQdXNoIHRoZSBmbGFncyBhbmQgcmV0dXJuIGFkZHJlc3Mgb24gdGhlIHN0YWNrICovCisgICAgICAgICAgICAgICAgKigtLXN0YWNrKSA9IEZMX3JlZyhjb250ZXh0KTsKKyAgICAgICAgICAgICAgICAqKC0tc3RhY2spID0gQ1NfcmVnKGNvbnRleHQpOworICAgICAgICAgICAgICAgICooLS1zdGFjaykgPSBJUF9yZWcoY29udGV4dCkgKyBwcmVmaXhsZW4gKyAyOworICAgICAgICAgICAgICAgIFNQX3JlZyhjb250ZXh0KSAtPSAzICogc2l6ZW9mKFdPUkQpOworICAgICAgICAgICAgICAgIC8qIEp1bXAgdG8gdGhlIGludGVycnVwdCBoYW5kbGVyICovCisgICAgICAgICAgICAgICAgQ1NfcmVnKGNvbnRleHQpICA9IEhJV09SRChhZGRyKTsKKyAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpID0gTE9XT1JEKGFkZHIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSAweGNmOiAvKiBpcmV0ICovCisgICAgICAgICAgICBpZiAobG9uZ19vcCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEV09SRCAqc3RhY2sgPSAoRFdPUkQgKilTVEFDS19QVFIoIGNvbnRleHQgKTsKKyAgICAgICAgICAgICAgICBFSVBfcmVnKGNvbnRleHQpID0gKnN0YWNrKys7CisgICAgICAgICAgICAgICAgQ1NfcmVnKGNvbnRleHQpICA9ICpzdGFjaysrOworICAgICAgICAgICAgICAgIEVGTF9yZWcoY29udGV4dCkgPSAqc3RhY2s7CisgICAgICAgICAgICAgICAgU1BfcmVnKGNvbnRleHQpICs9IDMqc2l6ZW9mKERXT1JEKTsgIC8qIFBvcCB0aGUgcmV0dXJuIGFkZHJlc3MgYW5kIGZsYWdzICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgV09SRCAqc3RhY2sgPSAoV09SRCAqKVNUQUNLX1BUUiggY29udGV4dCApOworICAgICAgICAgICAgICAgIEVJUF9yZWcoY29udGV4dCkgPSAqc3RhY2srKzsKKyAgICAgICAgICAgICAgICBDU19yZWcoY29udGV4dCkgID0gKnN0YWNrKys7CisgICAgICAgICAgICAgICAgRkxfcmVnKGNvbnRleHQpICA9ICpzdGFjazsKKyAgICAgICAgICAgICAgICBTUF9yZWcoY29udGV4dCkgKz0gMypzaXplb2YoV09SRCk7ICAvKiBQb3AgdGhlIHJldHVybiBhZGRyZXNzIGFuZCBmbGFncyAqLworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSAweGU0OiAvKiBpbmIgYWwsWFggKi8KKyAgICAgICAgICAgIEFMX3JlZyhjb250ZXh0KSA9IGlucG9ydCggaW5zdHJbMV0sIDEgKTsKKwkgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyAyOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSAweGU1OiAvKiBpbiAoZSlheCxYWCAqLworICAgICAgICAgICAgaWYgKGxvbmdfb3ApIEVBWF9yZWcoY29udGV4dCkgPSBpbnBvcnQoIGluc3RyWzFdLCA0ICk7CisgICAgICAgICAgICBlbHNlIEFYX3JlZyhjb250ZXh0KSA9IGlucG9ydCggaW5zdHJbMV0sIDIgKTsKKwkgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyAyOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisKKyAgICAgICAgY2FzZSAweGU2OiAvKiBvdXRiIFhYLGFsICovCisgICAgICAgICAgICBvdXRwb3J0KCBpbnN0clsxXSwgMSwgQUxfcmVnKGNvbnRleHQpICk7CisJICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMjsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgMHhlNzogLyogb3V0IFhYLChlKWF4ICovCisgICAgICAgICAgICBpZiAobG9uZ19vcCkgb3V0cG9ydCggaW5zdHJbMV0sIDQsIEVBWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgICAgIGVsc2Ugb3V0cG9ydCggaW5zdHJbMV0sIDIsIEFYX3JlZyhjb250ZXh0KSApOworICAJICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMjsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgMHhlYzogLyogaW5iIGFsLGR4ICovCisgICAgICAgICAgICBBTF9yZWcoY29udGV4dCkgPSBpbnBvcnQoIERYX3JlZyhjb250ZXh0KSwgMSApOworICAJICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgMHhlZDogLyogaW4gKGUpYXgsZHggKi8KKyAgICAgICAgICAgIGlmIChsb25nX29wKSBFQVhfcmVnKGNvbnRleHQpID0gaW5wb3J0KCBEWF9yZWcoY29udGV4dCksIDQgKTsKKyAgICAgICAgICAgIGVsc2UgQVhfcmVnKGNvbnRleHQpID0gaW5wb3J0KCBEWF9yZWcoY29udGV4dCksIDIgKTsKKyAgCSAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIDE7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIDB4ZWU6IC8qIG91dGIgZHgsYWwgKi8KKyAgICAgICAgICAgIG91dHBvcnQoIERYX3JlZyhjb250ZXh0KSwgMSwgQUxfcmVnKGNvbnRleHQpICk7CisgIAkgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyAxOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAKKyAgICAgICAgY2FzZSAweGVmOiAvKiBvdXQgZHgsKGUpYXggKi8KKyAgICAgICAgICAgIGlmIChsb25nX29wKSBvdXRwb3J0KCBEWF9yZWcoY29udGV4dCksIDQsIEVBWF9yZWcoY29udGV4dCkgKTsKKyAgICAgICAgICAgIGVsc2Ugb3V0cG9ydCggRFhfcmVnKGNvbnRleHQpLCAyLCBBWF9yZWcoY29udGV4dCkgKTsKKyAgCSAgICBFSVBfcmVnKGNvbnRleHQpICs9IHByZWZpeGxlbiArIDE7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIDB4ZmE6IC8qIGNsaSwgaWdub3JlZCAqLworICAJICAgIEVJUF9yZWcoY29udGV4dCkgKz0gcHJlZml4bGVuICsgMTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgMHhmYjogLyogc3RpLCBpZ25vcmVkICovCisgIAkgICAgRUlQX3JlZyhjb250ZXh0KSArPSBwcmVmaXhsZW4gKyAxOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgfQotICAgIHJldHVybiBUUlVFOworICAgIGZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBXaW5kb3dzIHByb2dyYW0gc2VnZmF1bHQiCisgICAgICAgICAgICAgICAgICAgICIgLSBvcGNvZGUgPSAleFxuIiwgKmluc3RyKTsKKyAgICByZXR1cm4gRkFMU0U7ICAvKiBVbmFibGUgdG8gZW11bGF0ZSBpdCAqLwogfQpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnQxYS5jIGIvbWlzY2VtdS9pbnQxYS5jCmluZGV4IDdlMTdlNDIuLjY5Mzg2YzAgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW50MWEuYworKysgYi9taXNjZW11L2ludDFhLmMKQEAgLTE1LDYgKzE1LDI3IEBACiAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCSAgICBJTlQxQV9HZXRUaWNrc1NpbmNlTWlkbmlnaHQKKyAqCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNsb2NrIHRpY2tzIHNpbmNlIG1pZG5pZ2h0LgorICovCitEV09SRCBJTlQxQV9HZXRUaWNrc1NpbmNlTWlkbmlnaHQodm9pZCkKK3sKKyAgICBzdHJ1Y3QgdG0gKmJkdGltZTsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0dnM7CisKKyAgICAvKiBUaGlzIHNob3VsZCBnaXZlIHVzIHRoZSAoYXBwcm94aW1hdGVseSkgY29ycmVjdAorICAgICAqIDE4LjIwNiBjbG9jayB0aWNrcyBwZXIgc2Vjb25kIHNpbmNlIG1pZG5pZ2h0LgorICAgICAqLworICAgIGdldHRpbWVvZmRheSggJnR2cywgTlVMTCApOworICAgIGJkdGltZSA9IGxvY2FsdGltZSggJnR2cy50dl9zZWMgKTsKKyAgICByZXR1cm4gKCgoYmR0aW1lLT50bV9ob3VyICogMzYwMCArIGJkdGltZS0+dG1fbWluICogNjAgKworICAgICAgICAgICAgICBiZHRpbWUtPnRtX3NlYykgKiAxODIwNikgLyAxMDAwKSArCisgICAgICAgICAgICAgICAgICAodHZzLnR2X3VzZWMgLyA1NDkyNyk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCSAgICBJTlRfSW50MWFIYW5kbGVyCiAgKgogICogSGFuZGxlciBmb3IgaW50IDFhaCAoZGF0ZSBhbmQgdGltZSkuCkBAIC0yNCwyNSArNDUsMTYgQEAKICAgICB0aW1lX3QgbHRpbWU7CiAgICAgRFdPUkQgdGlja3M7CiAgICAgc3RydWN0IHRtICpiZHRpbWU7Ci0gICAgc3RydWN0IHRpbWV2YWwgdHZzOwogCiAgICAgc3dpdGNoKEFIX3JlZygmY29udGV4dCkpCiAgICAgewogCWNhc2UgMDoKLSAgICAgICAgICAgICAgICAvKiBUaGlzIHNob3VsZCBnaXZlIHVzIHRoZSAoYXBwcm94aW1hdGVseSkgY29ycmVjdAotICAgICAgICAgICAgICAgICAqIDE4LjIwNiBjbG9jayB0aWNrcyBwZXIgc2Vjb25kIHNpbmNlIG1pZG5pZ2h0Ci0gICAgICAgICAgICAgICAgICogZXhwZWN0ZWQgZnJvbSB0aGlzIGludGVycnVwdAotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheSgmdHZzLCBOVUxMKTsKLSAgICAgICAgICAgICAgICBiZHRpbWUgPSBsb2NhbHRpbWUoJnR2cy50dl9zZWMpOwotICAgICAgICAgICAgICAgIHRpY2tzID0gKCgoYmR0aW1lLT50bV9ob3VyICogMzYwMCArIGJkdGltZS0+dG1fbWluICogNjAgKwotICAgICAgICAgICAgICAgICAgICAgICAgYmR0aW1lLT50bV9zZWMpICogMTgyMDYpIC8gMTAwMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKHR2cy50dl91c2VjIC8gNTQ5MjcpOwotCQlDWF9yZWcoJmNvbnRleHQpID0gSElXT1JEKHRpY2tzKTsKLQkJRFhfcmVnKCZjb250ZXh0KSA9IExPV09SRCh0aWNrcyk7Ci0JCUFYX3JlZygmY29udGV4dCkgPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KLQkJZHByaW50Zl9pbnQoc3RkZGViLCJpbnQxYV8wMCAvLyB0aWNrcz0lbGRcbiIsIHRpY2tzKTsKLQkJYnJlYWs7CisgICAgICAgICAgICB0aWNrcyA9IElOVDFBX0dldFRpY2tzU2luY2VNaWRuaWdodCgpOworICAgICAgICAgICAgQ1hfcmVnKCZjb250ZXh0KSA9IEhJV09SRCh0aWNrcyk7CisgICAgICAgICAgICBEWF9yZWcoJmNvbnRleHQpID0gTE9XT1JEKHRpY2tzKTsKKyAgICAgICAgICAgIEFYX3JlZygmY29udGV4dCkgPSAwOyAgLyogTm8gbWlkbmlnaHQgcm9sbG92ZXIgKi8KKyAgICAgICAgICAgIGRwcmludGZfaW50KHN0ZGRlYiwiaW50MWFfMDAgLy8gdGlja3M9JWxkXG4iLCB0aWNrcyk7CisgICAgICAgICAgICBicmVhazsKIAkJCiAJY2FzZSAyOiAKIAkJbHRpbWUgPSB0aW1lKE5VTEwpOwpkaWZmIC0tZ2l0IGEvbWlzY2VtdS9pbnQyMS5jIGIvbWlzY2VtdS9pbnQyMS5jCmluZGV4IGIwYTA1ZTcuLjcyMDgwNmMgMTAwNjQ0Ci0tLSBhL21pc2NlbXUvaW50MjEuYworKysgYi9taXNjZW11L2ludDIxLmMKQEAgLTM0MSwxNCArMzQxLDkgQEAKIAkJQVhfcmVnKGNvbnRleHQpID0gQ1hfcmVnKGNvbnRleHQpOwogCQlSRVNFVF9DRkxBRyhjb250ZXh0KTsKIAl9IGVsc2UgewotCQlzaXplID0gd3JpdGUoQlhfcmVnKGNvbnRleHQpLCBwdHIgLCBDWF9yZWcoY29udGV4dCkpOwotCQlpZiAoc2l6ZSA9PSAwKSB7Ci0JCQlFcnJvciAoV3JpdGVGYXVsdCwgRUNfVW5rbm93biwgRUxfVW5rbm93bik7Ci0JCQlBWF9yZWcoY29udGV4dCkgPSBFeHRlbmRlZEVycm9yOwotCQkJcmV0dXJuOwotCQl9Ci0KLQkJaWYgKHNpemUgPT0gLTEpIHsKKwkJLyogd2VsbCwgdGhpcyBmdW5jdGlvbiBhbHJlYWR5IGhhbmRsZXMgZXZlcnl0aGluZyB3ZSBuZWVkICovCisJCXNpemUgPSBfbHdyaXRlKEJYX3JlZyhjb250ZXh0KSxwdHIsQ1hfcmVnKGNvbnRleHQpKTsKKwkJaWYgKHNpemUgPT0gLTEpIHsgLyogSEZJTEVfRVJST1IgPT0gLTEgKi8KIAkJCWVycm5vX3RvX2Rvc2VycigpOwogCQkJQVhfcmVnKGNvbnRleHQpID0gRXh0ZW5kZWRFcnJvcjsKIAkJCVNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTQxNyw4ICs0MTIsMTIgQEAKIAkJCXJldHVybjsKIAkJICAgIH0KIAkgICAgCi0JCSAgICAvKiBUaGlzIGlzbid0IHRoZSByaWdodCBhbnN3ZXIsIGJ1dCBzaG91bGQgYmUgY2xvc2UgZW5vdWdoLiAqLwogCQkgICAgRFhfcmVnKGNvbnRleHQpID0gMHgwOTQzOworCQkgICAgLyogYml0cyAwLTUgYXJlIGN1cnJlbnQgZHJpdmUKKwkJICAgICAqIGJpdCA2IC0gZmlsZSBoYXMgTk9UIGJlZW4gd3JpdHRlbi4uRklYTUU6IGNvcnJlY3Q/CisJCSAgICAgKiBiaXQgOCAtIGdlbmVyYXRlIGludDI0IGlmIG5vIGRpc2tzcGFjZSBvbiB3cml0ZS8gcmVhZCBwYXN0IGVuZCBvZiBmaWxlCisJCSAgICAgKiBiaXQgMTEgLSBtZWRpYSBub3QgcmVtb3ZhYmxlCisJCSAgICAgKi8KIAkJfQogCX0KIAlSRVNFVF9DRkxBRyhjb250ZXh0KTsKQEAgLTE1MjYsNyArMTUyNSwxMyBAQAogCQkgICAgUkVTRVRfQ0ZMQUcoJmNvbnRleHQpOwogICAgICAgICAgICAgICAgIH0KIAkJYnJlYWs7Ci0KKwkgICAgICBjYXNlIDB4MGE6IC8qIGNoZWNrIGlmIGhhbmRsZSAoQlgpIGlzIHJlbW90ZSAqLworCSAgICAgIAkvKiByZXR1cm5zIERYLCBiaXQgMTUgc2V0IGlmIHJlbW90ZSwgYml0IDE0IHNldCBpZiBkYXRlL3RpbWUKKwkgICAgICAJICogbm90IHNldCBvbiBjbG9zZQorCSAgICAgIAkgKi8KKwkJRFhfcmVnKCZjb250ZXh0KSA9IDA7CisJCVJFU0VUX0NGTEFHKCZjb250ZXh0KTsKKwkJYnJlYWs7CiAJICAgICAgY2FzZSAweDBiOiAgIC8qIFNFVCBTSEFSSU5HIFJFVFJZIENPVU5UICovCiAJCWlmICghQ1hfcmVnKCZjb250ZXh0KSkKIAkJeyAKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvSW1ha2VmaWxlIGIvbXVsdGltZWRpYS9JbWFrZWZpbGUKaW5kZXggNTgyZTM4NC4uNTFlYTk0ZiAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9JbWFrZWZpbGUKKysrIGIvbXVsdGltZWRpYS9JbWFrZWZpbGUKQEAgLTcsNiArNyw3IEBACiAJam95c3RpY2suYyBcCiAJbWNpYW5pbS5jIFwKIAltY2ljZGEuYyBcCisJbWNpc3RyaW5nLmMgXAogCW1pZGkuYyBcCiAJbW1hdXguYyBcCiAJbW1zeXN0ZW0uYyBcCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL01ha2VmaWxlLmluIGIvbXVsdGltZWRpYS9NYWtlZmlsZS5pbgppbmRleCAxN2VhMWM3Li5iYzAzNGZjIDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL01ha2VmaWxlLmluCisrKyBiL211bHRpbWVkaWEvTWFrZWZpbGUuaW4KQEAgLTksOSArOSwxNiBAQAogCiBNT0RVTEUgCT0gbXVsdGltZWRpYQogCi1TUkNTIAk9IGF1ZGlvLmMgam95c3RpY2suYyBtY2lhbmltLmMgbWNpY2RhLmMgbWlkaS5jIG1tYXV4LmMgXAotCSAgbW1zeXN0ZW0uYyB0aW1lLmMKLQorU1JDUyA9IFwKKwlhdWRpby5jIFwKKwlqb3lzdGljay5jIFwKKwltY2lhbmltLmMgXAorCW1jaWNkYS5jIFwKKwltY2lzdHJpbmcuYyBcCisJbWlkaS5jIFwKKwltbWF1eC5jIFwKKwltbXN5c3RlbS5jIFwKKwl0aW1lLmMKIAogT0JKUyA9ICQoU1JDUzouYz0ubykKIApAQCAtMjksNyArMzYsNyBAQAogCW12IHRtcF9tYWtlIE1ha2VmaWxlCiAKIGNsZWFuOgotCXJtIC1mICoubyBcIypcIyAqfiB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQogCiBkaXN0Y2xlYW46IGNsZWFuCiAJcm0gLWYgTWFrZWZpbGUKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvYXVkaW8uYyBiL211bHRpbWVkaWEvYXVkaW8uYwppbmRleCA1Y2UyMjcxLi41YzQ2ZTA3IDEwMDY0NAotLS0gYS9tdWx0aW1lZGlhL2F1ZGlvLmMKKysrIGIvbXVsdGltZWRpYS9hdWRpby5jCkBAIC0zNSw3ICszNSw3IEBACiAjZGVmaW5lIFNPVU5EX0RFViAiL2Rldi9kc3AiCiAKICNpZmRlZiBTT1VORF9WRVJTSU9OCi0jZGVmaW5lIElPQ1RMKGEsYixjKQkJaW9jdGwoYSxiLCZjKQorI2RlZmluZSBJT0NUTChhLGIsYykJCSgoLTE9PWlvY3RsKGEsYiwmYykpJiYocGVycm9yKCJpb2N0bDoiI2IiOiIjYyksMCkpCiAjZWxzZQogI2RlZmluZSBJT0NUTChhLGIsYykJCShjID0gaW9jdGwoYSxiLGMpICkKICNlbmRpZgpAQCAtODYzLDEwICs4NjMsMTEgQEAKIAljbG9zZShXT3V0RGV2W3dEZXZJRF0udW5peGRldik7CiAJV091dERldlt3RGV2SURdLnVuaXhkZXYgPSAwOwogCVdPdXREZXZbd0RldklEXS5idWZzaXplID0gMDsKKwlXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IE5VTEw7CiAJaWYgKFdBVkVfTm90aWZ5Q2xpZW50KHdEZXZJRCwgV09NX0NMT1NFLCAwTCwgMEwpICE9IE1NU1lTRVJSX05PRVJST1IpIHsKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZENsb3NlJyAvLyBjYW4ndCBub3RpZnkgY2xpZW50ICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfSU5WQUxQQVJBTTsKLQkJfQorCX0KIAlyZXR1cm4gTU1TWVNFUlJfTk9FUlJPUjsKIH0KIApAQCAtOTIwLDEwICs5MjEsMTMgQEAKIAkJZHByaW50Zl9tY2l3YXZlKHN0ZGRlYiwiTGludXggJ3dvZFByZXBhcmUnIC8vIGNhbid0IHByZXBhcmUgIVxuIik7CiAJCXJldHVybiBNTVNZU0VSUl9OT1RFTkFCTEVEOwogCQl9CisJLyogdGhlIENPT0wgd2F2ZWVkaXRvciBmZWVscyBtdWNoIGJldHRlciB3aXRob3V0IHRoaXMgY2hlY2suLi4gCisJICogc29tZW9uZSBwbGVhc2UgaGF2ZSBhIGxvb2sgYXQgYXZhaWxhYmxlIGRvY3VtZW50YXRpb24KIAlpZiAoV091dERldlt3RGV2SURdLmxwUXVldWVIZHIgIT0gTlVMTCkgewogCQlkcHJpbnRmX21jaXdhdmUoc3RkZGViLCJMaW51eCAnd29kUHJlcGFyZScgLy8gYWxyZWFkeSBwcmVwYXJlICFcbiIpOwogCQlyZXR1cm4gTU1TWVNFUlJfTk9URU5BQkxFRDsKLQkJfQorCX0KKwkqLwogCVdPdXREZXZbd0RldklEXS5kd1RvdGFsUGxheWVkID0gMDsKIAlXT3V0RGV2W3dEZXZJRF0ubHBRdWV1ZUhkciA9IGxwV2F2ZUhkcjsKIAlpZiAobHBXYXZlSGRyLT5kd0ZsYWdzICYgV0hEUl9JTlFVRVVFKSByZXR1cm4gV0FWRVJSX1NUSUxMUExBWUlORzsKZGlmZiAtLWdpdCBhL211bHRpbWVkaWEvbWNpc3RyaW5nLmMgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1M2E5MDcKLS0tIC9kZXYvbnVsbAorKysgYi9tdWx0aW1lZGlhL21jaXN0cmluZy5jCkBAIC0wLDAgKzEsMjE3NyBAQAorLyoKKyAqIE1DSSBzdHJpbmdpbnRlcmZhY2UKKyAqCisgKiBDb3B5cmlnaHQgMTk5NSBNYXJjdXMgTWVpc3NuZXIKKyAqLworLyogRklYTUU6IHNwZWNpYWwgY29tbWFuZHMgb2YgZGV2aWNlIGRyaXZlcnMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhvc2UgZHJpdmVycworICovCisKKyNpZm5kZWYgV0lORUxJQgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgIndpbmRvd3MuaCIKKyNpbmNsdWRlICJsZHQuaCIKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgInVzZXIuaCIKKyNpbmNsdWRlICJkcml2ZXIuaCIKKyNpbmNsdWRlICJtbXN5c3RlbS5oIgorI2luY2x1ZGUgInN0ZGRlYnVnLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKworZXh0ZXJuIE1DSV9PUEVOX0RSSVZFUl9QQVJNUwltY2lEcnZbTUFYTUNJRFJJVkVSU107CisKKy8qIEZJWE1FOiBJIG5lZWQgdG8gcmVtZW1iZXIgdGhlIGFsaWFzbmFtZSBvZiBhIHNwZWMuIGRyaXZlci4gCisgKiAgICAgICAgYW5kIHRoaXMgaXMgdGhlIGVhc2llc3Qgd2F5LiAqc2lnaCoKKyAqLworc3RhdGljIE1DSV9PUEVOX1BBUk1TCQltY2lPcGVuRHJ2W01BWE1DSURSSVZFUlNdOworCitMT05HIERydkRlZkRyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIgaERyaXYsIFdPUkQgd01zZywgCisJCSAgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CisKK0xPTkcgV0FWRV9Ecml2ZXJQcm9jKERXT1JEIGR3RGV2SUQsIEhEUlZSIGhEcml2LCBXT1JEIHdNc2csIAorCQkgICAgIERXT1JEIGR3UGFyYW0xLCBEV09SRCBkd1BhcmFtMik7CitMT05HIE1JRElfRHJpdmVyUHJvYyhEV09SRCBkd0RldklELCBIRFJWUiBoRHJpdiwgV09SRCB3TXNnLCAKKwkJICAgICBEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOworTE9ORyBDREFVRElPX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIgaERyaXYsIFdPUkQgd01zZywgCisJCQlEV09SRCBkd1BhcmFtMSwgRFdPUkQgZHdQYXJhbTIpOworTE9ORyBBTklNX0RyaXZlclByb2MoRFdPUkQgZHdEZXZJRCwgSERSVlIgaERyaXYsIFdPUkQgd01zZywgCisJCSAgICAgRFdPUkQgZHdQYXJhbTEsIERXT1JEIGR3UGFyYW0yKTsKKworLyogVGhlIHJlYXNvbiB3aHkgSSBqdXN0IGRvbid0IGxvd2VyY2FzZSB0aGUga2V5d29yZHMgYXJyYXkgaW4gCisgKiBtY2lTZW5kU3RyaW5nIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UgdG8gdGhlIHJlYWRlci4KKyAqLworI2RlZmluZSBTVFJDTVAoeCx5KSBzdHJjYXNlY21wKHgseSkKKworLyogc3RhbmRhcmQgZnVuY3Rpb25wYXJhbWV0ZXJzIGZvciBhbGwgZnVuY3Rpb25zICovCisjZGVmaW5lIF9NQ0lTVFJfUFJPVE9fIFwKKwlXT1JEIHdEZXZJRCxXT1JEIHVEZXZUeXAsTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsVUlOVCB1UmV0dXJuTGVuZ3RoLFwKKwlMUENTVFIgZGV2LExQU1RSICprZXl3b3JkcyxVSU5UIG5yb2ZrZXl3b3JkcyxEV09SRCBkd0ZsYWdzCisKKy8qIGNvcHkgc3RyaW5nIHRvIHJldHVybiBwb2ludGVyIGluY2x1ZGluZyBuZWNlc3NhcnkgY2hlY2tzIAorICogZm9yIHVzZSBpbiBtY2lTZW5kU3RyaW5nKCkKKyAqLworI2RlZmluZSBfTUNJX1NUUihzKSBkbyB7XAorCWludCBfX2xfXztcCisJZHByaW50Zl9tY2koc3RkZGViLCItPnJldHVybnMgXCIlc1wiIixzKTtcCisJaWYgKGxwc3RyUmV0dXJuU3RyaW5nKSB7XAorCQlfX2xfXz1zdHJsZW4ocyk7XAorCQlpZihfX2xfXz51UmV0dXJuTGVuZ3RoKSB7XAorCQkJc3RybmNweShscHN0clJldHVyblN0cmluZyxzLHVSZXR1cm5MZW5ndGgtMSk7XAorCQkJbHBzdHJSZXR1cm5TdHJpbmdbdVJldHVybkxlbmd0aC0xXT0nXDAnO1wKKwkJfSBlbHNlXAorCQkJc3RyY3B5KGxwc3RyUmV0dXJuU3RyaW5nLHMpO1wKKwkJZHByaW50Zl9tY2koc3RkZGViLCItLT5cIiVzXCJcbiIsbHBzdHJSZXR1cm5TdHJpbmcpO1wKKwl9XAorfSB3aGlsZSgwKQorCisvKiBjYWxsaW5nIERyaXZlclByb2MuIFdlIG5lZWQgdG8gcGFzcyB0aGUgc3RydWN0IGFzIFNFR01FTlRFRCBQT0lOVEVSLiAqLworI2RlZmluZSBfTUNJX0NBTExfRFJJVkVSKGNtZCxwYXJhbXMpIHtcCisJRFdPUkQJeHBhcmFtcztcCisJeHBhcmFtcz1NQUtFX1NFR1BUUigmcGFyYW1zKTtcCisJc3dpdGNoKHVEZXZUeXApIHtcCisJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzpcCisJCXJlcz1DREFVRElPX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELDAsY21kLGR3RmxhZ3MsIHhwYXJhbXMpO1wKKwkJYnJlYWs7XAorCWNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86XAorCQlyZXM9V0FWRV9Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLHhwYXJhbXMpO1wKKwkJYnJlYWs7XAorCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOlwKKwkJcmVzPU1JRElfRHJpdmVyUHJvYyhtY2lEcnZbd0RldklEXS53RGV2aWNlSUQsMCxjbWQsZHdGbGFncyx4cGFyYW1zKTtcCisJCWJyZWFrO1wKKwljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjpcCisJCXJlcz1BTklNX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELDAsY21kLGR3RmxhZ3MseHBhcmFtcyk7XAorCQlicmVhaztcCisJY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOlwKKwkJZHByaW50Zl9tY2koc3RkZGViLCJfTUNJX0NBTExfRFJJVkVSIC8vTm8gRElHSVRBTF9WSURFTyB5ZXQgIVxuIik7XAorCQlyZXM9TUNJRVJSX0RFVklDRV9OT1RfSU5TVEFMTEVEO1wKKwkJYnJlYWs7XAorCWRlZmF1bHQ6XAorCQlkcHJpbnRmX21jaShzdGRkZWIsIl9NQ0lfQ0FMTF9EUklWRVIgLy9JbnZhbGlkIERldmljZSBOYW1lICclcycgIVxuIixkZXYpO1wKKwkJcmVzPU1DSUVSUl9JTlZBTElEX0RFVklDRV9OQU1FO1wKKwkJYnJlYWs7XAorCX1cCit9CisvKiB3ZSBuZWVkIHRvIGhhdmUgc3RyaW5ncyBpbiAxNiBiaXQgc3BhY2UgZm9yIHNvbWUgdGhpbmdzIAorICogRklYTUU6IHRoaXMgaXMgYmFkLgorICovCisjZGVmaW5lCV9NQ0lfU1RSRFVQX1RPX1NFRyhkZXN0LHNvdXJjZSkge1wKKwlIQU5ETEUJeDtcCisJeD1VU0VSX0hFQVBfQUxMT0Moc3RybGVuKHNvdXJjZSkpO1wKKwlkZXN0PShMUFNUUilNQUtFTE9ORyh4LFVTRVJfSGVhcFNlbCk7XAorCXN0cmNweShQVFJfU0VHX1RPX0xJTihkZXN0KSxzb3VyY2UpO1wKK30KKworLyogcHJpbnQgYSBEV09SRCBpbiB0aGUgc3BlY2lmaWVkIHRpbWVmb3JtYXQgKi8KK3N0YXRpYyB2b2lkCitfTUNJU1RSX3ByaW50dGYoY2hhciAqYnVmLFVJTlQgdURldlR5cGUsRFdPUkQgdGltZWYsRFdPUkQgdmFsKSB7CisJKmJ1Zj0nXDAnOworCXN3aXRjaCAodGltZWYpIHsKKwljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgorCWNhc2UgTUNJX0ZPUk1BVF9GUkFNRVM6CisJY2FzZSBNQ0lfRk9STUFUX0JZVEVTOgorCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgorCWNhc2UgTUNJX1ZEX0ZPUk1BVF9UUkFDSzoKKwkvKmNhc2UgTUNJX1NFUV9GT1JNQVRfU09OR1BUUjogc2FtZWFzIE1DSV9WRF9GT1JNQVRfVFJBQ0sgKi8KKwkJc3ByaW50ZihidWYsIiVsZCIsdmFsKTsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfRk9STUFUX0hNUzoKKwkJLyogd2VsbCwgdGhlIG1hY3JvcyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQqLworCQkvKkZBTExUUkhPVUdIKi8KKwljYXNlIE1DSV9GT1JNQVRfTVNGOgorCQlzcHJpbnRmKGJ1ZiwiJWQ6JWQ6JWQiLAorCQkJTUNJX0hNU19IT1VSKHZhbCksCisJCQlNQ0lfSE1TX01JTlVURSh2YWwpLAorCQkJTUNJX0hNU19TRUNPTkQodmFsKQorCQkpOworCQlicmVhazsKKwljYXNlIE1DSV9GT1JNQVRfVE1TRjoKKwkJc3ByaW50ZihidWYsIiVkOiVkOiVkOiVkIiwKKwkJCU1DSV9UTVNGX1RSQUNLKHZhbCksCisJCQlNQ0lfVE1TRl9NSU5VVEUodmFsKSwKKwkJCU1DSV9UTVNGX1NFQ09ORCh2YWwpLAorCQkJTUNJX1RNU0ZfRlJBTUUodmFsKQorCQkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZG5pbXAsX19GSUxFX18iOk1DSVNUUl9TdGF0dXM6bWlzc2luZyB0aW1lZm9ybWF0IGZvciAlbGQsIHJlcG9ydC5cbiIsdGltZWYpOworCQlzdHJjcHkoYnVmLCIwIik7IC8qIGhtbSAqLworCQlicmVhazsKKwl9CisJcmV0dXJuOworfQorLyogcG9zc2libGUgZGlmZmVyZW50IHJldHVybiB0eXBlcyAqLworI2RlZmluZSBfTUNJU1RSX2ludAkxCisjZGVmaW5lIF9NQ0lTVFJfdGltZQkyCisjZGVmaW5lIF9NQ0lTVFJfYm9vbAkzCisjZGVmaW5lIF9NQ0lTVFJfdGZuYW1lCTQKKyNkZWZpbmUgX01DSVNUUl9tb2RlCTUKKyNkZWZpbmUgX01DSVNUUl9kaXZ0eXBlCTYKKyNkZWZpbmUgX01DSVNUUl9zZXF0eXBlCTcKKyNkZWZpbmUgX01DSVNUUl92ZG10eXBlCTgKKyNkZWZpbmUgX01DSVNUUl9kZXZ0eXBlCTkKKworc3RhdGljIHZvaWQKK19NQ0lTVFJfY29udnJldHVybihpbnQgdHlwZSxEV09SRCBkd1JldHVybixMUFNUUiBscHN0clJldHVyblN0cmluZywKKwlXT1JEIHVSZXR1cm5MZW5ndGgsV09SRCB1RGV2VHlwLGludCB0aW1lZgorKSB7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBfTUNJU1RSX3ZkbXR5cGU6CisJCXN3aXRjaCAoZHdSZXR1cm4pIHsKKwkJY2FzZSBNQ0lfVkRfTUVESUFfQ0xWOl9NQ0lfU1RSKCJDTFYiKTticmVhazsKKwkJY2FzZSBNQ0lfVkRfTUVESUFfQ0FWOl9NQ0lfU1RSKCJDQVYiKTticmVhazsKKwkJZGVmYXVsdDoKKwkJY2FzZSBNQ0lfVkRfTUVESUFfT1RIRVI6X01DSV9TVFIoIm90aGVyIik7YnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBfTUNJU1RSX3NlcXR5cGU6CisJCXN3aXRjaCAoZHdSZXR1cm4pIHsKKwkJY2FzZSBNQ0lfU0VRX05PTkU6X01DSV9TVFIoIm5vbmUiKTticmVhazsKKwkJY2FzZSBNQ0lfU0VRX1NNUFRFOl9NQ0lfU1RSKCJzbXB0ZSIpO2JyZWFrOworCQljYXNlIE1DSV9TRVFfRklMRTpfTUNJX1NUUigiZmlsZSIpO2JyZWFrOworCQljYXNlIE1DSV9TRVFfTUlESTpfTUNJX1NUUigibWlkaSIpO2JyZWFrOworCQlkZWZhdWx0OmZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX1N0YXR1czptaXNzaW5nIHNlcXVlbmNlciBtb2RlICVsZFxuIixkd1JldHVybik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBfTUNJU1RSX21vZGU6CisJCXN3aXRjaCAoZHdSZXR1cm4pIHsKKwkJY2FzZSBNQ0lfTU9ERV9OT1RfUkVBRFk6X01DSV9TVFIoIm5vdCByZWFkeSIpO2JyZWFrOworCQljYXNlIE1DSV9NT0RFX1NUT1A6X01DSV9TVFIoInN0b3BwZWQiKTticmVhazsKKwkJY2FzZSBNQ0lfTU9ERV9QTEFZOl9NQ0lfU1RSKCJwbGF5aW5nIik7YnJlYWs7CisJCWNhc2UgTUNJX01PREVfUkVDT1JEOl9NQ0lfU1RSKCJyZWNvcmRpbmciKTticmVhazsKKwkJY2FzZSBNQ0lfTU9ERV9TRUVLOl9NQ0lfU1RSKCJzZWVraW5nIik7YnJlYWs7CisJCWNhc2UgTUNJX01PREVfUEFVU0U6X01DSV9TVFIoInBhdXNlZCIpO2JyZWFrOworCQljYXNlIE1DSV9NT0RFX09QRU46X01DSV9TVFIoIm9wZW4iKTticmVhazsKKwkJZGVmYXVsdDpicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIF9NQ0lTVFJfYm9vbDoKKwkJaWYgKGR3UmV0dXJuKQorCQkJX01DSV9TVFIoInRydWUiKTsKKwkJZWxzZQorCQkJX01DSV9TVFIoImZhbHNlIik7CisJCWJyZWFrOworCWNhc2UgX01DSVNUUl9pbnQ6eworCQljaGFyCWJ1ZlsxNl07CisJCXNwcmludGYoYnVmLCIlbGQiLGR3UmV0dXJuKTsKKwkJX01DSV9TVFIoYnVmKTsKKwkJYnJlYWs7CisJfQorCWNhc2UgX01DSVNUUl90aW1lOiB7CQorCQljaGFyCWJ1ZlsxMDBdOworCQlfTUNJU1RSX3ByaW50dGYoYnVmLHVEZXZUeXAsdGltZWYsZHdSZXR1cm4pOworCQlfTUNJX1NUUihidWYpOworCQlicmVhazsKKwl9CisJY2FzZSBfTUNJU1RSX3RmbmFtZToKKwkJc3dpdGNoICh0aW1lZikgeworCQljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOl9NQ0lfU1RSKCJtaWxsaXNlY29uZHMiKTticmVhazsKKwkJY2FzZSBNQ0lfRk9STUFUX0ZSQU1FUzpfTUNJX1NUUigiZnJhbWVzIik7YnJlYWs7CisJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzpfTUNJX1NUUigiYnl0ZXMiKTticmVhazsKKwkJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6X01DSV9TVFIoInNhbXBsZXMiKTticmVhazsKKwkJY2FzZSBNQ0lfRk9STUFUX0hNUzpfTUNJX1NUUigiaG1zIik7YnJlYWs7CisJCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6X01DSV9TVFIoIm1zZiIpO2JyZWFrOworCQljYXNlIE1DSV9GT1JNQVRfVE1TRjpfTUNJX1NUUigidG1zZiIpO2JyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpNQ0lTVFJfU3RhdHVzOm1pc3NpbmcgdGltZWZvcm1hdCBmb3IgJWQsIHJlcG9ydC5cbiIsdGltZWYpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBfTUNJU1RSX2RpdnR5cGU6CisJCXN3aXRjaCAoZHdSZXR1cm4pIHsKKwkJY2FzZSBNQ0lfU0VRX0RJVl9QUFFOOl9NQ0lfU1RSKCJQUFFOIik7YnJlYWs7CisJCWNhc2UgTUNJX1NFUV9ESVZfU01QVEVfMjQ6X01DSV9TVFIoIlNNUFRFIDI0IGZyYW1lIik7YnJlYWs7CisJCWNhc2UgTUNJX1NFUV9ESVZfU01QVEVfMjU6X01DSV9TVFIoIlNNUFRFIDI1IGZyYW1lIik7YnJlYWs7CisJCWNhc2UgTUNJX1NFUV9ESVZfU01QVEVfMzA6X01DSV9TVFIoIlNNUFRFIDMwIGZyYW1lIik7YnJlYWs7CisJCWNhc2UgTUNJX1NFUV9ESVZfU01QVEVfMzBEUk9QOl9NQ0lfU1RSKCJTTVBURSAzMCBmcmFtZSBkcm9wIik7YnJlYWs7CisJCX0KKwljYXNlIF9NQ0lTVFJfZGV2dHlwZToKKwkJc3dpdGNoIChkd1JldHVybikgeworCQljYXNlIE1DSV9ERVZUWVBFX1ZDUjpfTUNJX1NUUigidmNyIik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfVklERU9ESVNDOl9NQ0lfU1RSKCJ2aWRlb2Rpc2MiKTticmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9DRF9BVURJTzpfTUNJX1NUUigiY2QgYXVkaW8iKTticmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9PVkVSTEFZOl9NQ0lfU1RSKCJvdmVybGF5Iik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfREFUOl9NQ0lfU1RSKCJkYXQiKTticmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9TQ0FOTkVSOl9NQ0lfU1RSKCJzY2FubmVyIik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOl9NQ0lfU1RSKCJhbmltYXRpb24iKTticmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOl9NQ0lfU1RSKCJkaWdpdGFsIHZpZGVvIik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfT1RIRVI6X01DSV9TVFIoIm90aGVyIik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86X01DSV9TVFIoIndhdmVmb3JtIGF1ZGlvIik7YnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfU0VRVUVOQ0VSOl9NQ0lfU1RSKCJzZXF1ZW5jZXIiKTticmVhazsKKwkJZGVmYXVsdDpmcHJpbnRmKHN0ZG5pbXAsX19GSUxFX18iOl9NQ0lTVFJfY29udnJldHVybjp1bmtub3duIGRldmljZSB0eXBlICVsZCwgcmVwb3J0LlxuIixkd1JldHVybik7YnJlYWs7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRuaW1wLF9fRklMRV9fIjpfTUNJU1RSX2NvbnZyZXR1cm46dW5rbm93biByZXN1bHR0eXBlICVkLCByZXBvcnQuXG4iLHR5cGUpOworCQlicmVhazsKKwl9Cit9CisKKyNkZWZpbmUgRkxBRzEoc3RyLGZsYWcpIFwKKwlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSxzdHIpKSB7XAorCQlkd0ZsYWdzIHw9IGZsYWc7XAorCQlpKys7XAorCQljb250aW51ZTtcCisJfQorI2RlZmluZSBGTEFHMihzdHIxLHN0cjIsZmxhZykgXAorCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLHN0cjEpICYmIChpKzE8bnJvZmtleXdvcmRzKSAmJiAhU1RSQ01QKGtleXdvcmRzW2krMV0sc3RyMikpIHtcCisJCWR3RmxhZ3MgfD0gZmxhZztcCisJCWkrPTI7XAorCQljb250aW51ZTtcCisJfQorCisvKiBBbGwga25vd24gc3ViY29tbWFuZHMgYXJlIGltcGxlbWVudGVkIGluIHNpbmdsZSBmdW5jdGlvbnMgdG8gYXZvaWQKKyAqIGJsb2F0IGFuZCBhIHh4eHggbGluZXMgbG9uZyBtY2lTZW5kU3RyaW5nKCkuIEFsbCBjb21tYW5kcyBhcmUgb2YgdGhlCisgKiBmb3JtYXQgTUNJU1RSX0NtZChfTUNJU1RSX1BST1RPXykgd2hlcmUgX01DSVNUUl9QUk9UT18gaXMgdGhlIGFib3ZlCisgKiBkZWZpbmVkIGxpbmUgb2YgYXJndW1lbnRzLiAoVGhpcyBpcyBqdXN0IGZvciBlYXN5IGVuaGFuY2VhYmlsaXR5LikKKyAqIEFsbCBmdW5jdGlvbnMgcmV0dXJuIHRoZSBNQ0lFUlJfIGVycm9ydmFsdWUgYXMgRFdPUkQuIFJldHVybnZhbHVlcworICogZm9yIHRoZSBjYWxscyBhcmUgaW4gbHBzdHJSZXR1cm5TdHJpbmcgKElmIEkgbWVudGlvbiByZXR1cm4gdmFsdWVzCisgKiBpbiBmdW5jdGlvbiBoZWFkZXJzLCBJIG1lYW4gcmV0dXJudmFsdWVzIGluIGxwc3RyUmV0dXJuU3RyaW5nLikKKyAqIEludGVnZXJzIGFyZSBzcHJpbnRmKCIlZCIpZWQgaW50ZWdlcnMuIEJvb2xlYW4gdmFsdWVzIGFyZSAKKyAqICJ0cnVlIiBhbmQgImZhbHNlIi4gCisgKiB0aW1lZm9ybWF0IGRlcGVuZGluZyB2YWx1ZXMgYXJlICIlZCIgIiVkOiVkIiAiJWQ6JWQ6JWQiICIlZDolZDolZDolZCIKKyAqIEZJWE1FOiBpcyBhYm92ZSBsaW5lIGNvcnJlY3Q/CisgKgorICogUHJlY2VkaW5nIGV2ZXJ5IGZ1bmN0aW9uIGlzIGEgbGlzdCBvZiBpbXBsZW1lbnRlZC9rbm93biBhcmd1bWVudHMuCisgKiBGZWVsIGZyZWUgdG8gYWRkIG1pc3NpbmcgYXJndW1lbnRzLgorICoKKyAqLworCisvKgorICogT3BlbnMgdGhlIHNwZWNpZmllZCBNQ0kgZHJpdmVyLiAKKyAqIEFyZ3VtZW50czogPG5hbWU+IAorICogT3B0aW9uYWw6CisgKgkic2hhcmVhYmxlIgorICoJImFsaWFzIDxhbGlhc25hbWU+IgorICogCSJlbGVtZW50IDxlbGVtZW50bmFtZT4iCisgKiBBZGRpdGlvbmFsOgorICogd2F2ZWZvcm0gYXVkaW86CisgKgkiYnVmZmVyIDxuckJ5dGVzUGVyU2VjPiIKKyAqIEFuaW1hdGlvbjoKKyAqCSJub3N0YXRpYyIJaW5jcmVhc3RlIG5yIG9mIG5vbnN0YXRpYyBjb2xvdXJzCisgKgkicGFyZW50IDx3aW5kb3doYW5kbGU+IgorICoJInN0eWxlIDxtYXNrPiIJYml0bWFzayBvZiBXU194eHh4eCAoc2VlIHdpbmRvd3MuaCkKKyAqCSJzdHlsZSBjaGlsZCIJV1NfQ0hJTEQKKyAqCSJzdHlsZSBvdmVybGFwIglXU19PVkVSTEFQUEVECisgKgkic3R5bGUgcG9wdXAiCVdTX1BPUFVQCisgKiBPdmVybGF5OgorICoJInBhcmVudCA8d2luZG93aGFuZGxlPiIKKyAqCSJzdHlsZSA8bWFzaz4iCWJpdG1hc2sgb2YgV1NfeHh4eHggKHNlZSB3aW5kb3dzLmgpCisgKgkic3R5bGUgY2hpbGQiCVdTX0NISUxECisgKgkic3R5bGUgb3ZlcmxhcCIJV1NfT1ZFUkxBUFBFRAorICoJInN0eWxlIHBvcHVwIglXU19QT1BVUAorICogUmV0dXJucyBub3RoaW5nLgorICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9PcGVuKF9NQ0lTVFJfUFJPVE9fKSB7CisJaW50CQlyZXMsaTsKKwljaGFyCQkqczsKKwl1bmlvbiB7CisJCU1DSV9PUEVOX1BBUk1TCW9wZW5QYXJhbXM7CisJCU1DSV9XQVZFX09QRU5fUEFSTVMJd2F2ZW9wZW5QYXJhbXM7CisJCU1DSV9BTklNX09QRU5fUEFSTVMJYW5pbW9wZW5QYXJhbXM7CisJCU1DSV9PVkxZX09QRU5fUEFSTVMJb3ZseW9wZW5QYXJhbXM7CisJfSBVOworCisJVS5vcGVuUGFyYW1zLmxwc3RyRWxlbWVudE5hbWUgPSBOVUxMOworCXM9c3RyY2hyKGRldiwnIScpOworCWlmIChzIT1OVUxMKSB7CisJCSpzKys9J1wwJzsKKwkJX01DSV9TVFJEVVBfVE9fU0VHKFUub3BlblBhcmFtcy5scHN0ckVsZW1lbnROYW1lLHMpOworCX0KKwlpZiAoIVNUUkNNUChkZXYsImNkYXVkaW8iKSkgeworCQl1RGV2VHlwPU1DSV9ERVZUWVBFX0NEX0FVRElPOworCX0gZWxzZSBpZiAoIVNUUkNNUChkZXYsIndhdmVhdWRpbyIpKSB7CisJCXVEZXZUeXA9TUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU87CisJfSBlbHNlIGlmICghU1RSQ01QKGRldiwic2VxdWVuY2VyIikpIHsKKwkJdURldlR5cD1NQ0lfREVWVFlQRV9TRVFVRU5DRVI7CisJfSBlbHNlIGlmICghU1RSQ01QKGRldiwiYW5pbWF0aW9uMSIpKSB7CisJCXVEZXZUeXA9TUNJX0RFVlRZUEVfQU5JTUFUSU9OOworCX0gZWxzZSBpZiAoIVNUUkNNUChkZXYsImF2aXZpZGVvIikpIHsKKwkJdURldlR5cD1NQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOworCX0gZWxzZSB7CisJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKKwl9CisJd0RldklEPTA7CisJd2hpbGUobWNpRHJ2W3dEZXZJRF0ud1R5cGUpIHsKKwkJaWYgKCsrd0RldklEPj1NQVhNQ0lEUklWRVJTKSB7CisJCQlkcHJpbnRmX21jaShzdGRkZWIsIF9fRklMRV9fIjpNQ0lTVFJfT3BlbjpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKKwkJCXJldHVybiBNQ0lFUlJfSU5URVJOQUw7CisJCX0KKwl9CisJbWNpRHJ2W3dEZXZJRF0ud1R5cGUJCT0gdURldlR5cDsKKwltY2lEcnZbd0RldklEXS53RGV2aWNlSUQJPSB3RGV2SUQ7CisJVS5vcGVuUGFyYW1zLmR3Q2FsbGJhY2sJCT0gMDsKKwlVLm9wZW5QYXJhbXMud0RldmljZUlECQk9IHdEZXZJRDsKKwlVLm92bHlvcGVuUGFyYW1zLmR3U3R5bGUJPSAwOyAKKwlVLmFuaW1vcGVuUGFyYW1zLmR3U3R5bGUJPSAwOyAKKworCV9NQ0lfU1RSRFVQX1RPX1NFRyhVLm9wZW5QYXJhbXMubHBzdHJEZXZpY2VUeXBlLGRldik7CisJVS5vcGVuUGFyYW1zLmxwc3RyQWxpYXMJCT0gTlVMTDsKKwlkd0ZsYWdzIHw9IE1DSV9PUEVOX1RZUEU7CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlGTEFHMSgic2hhcmVhYmxlIixNQ0lfT1BFTl9TSEFSRUFCTEUpOworCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiYWxpYXMiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCWR3RmxhZ3MgfD0gTUNJX09QRU5fQUxJQVM7CisJCQlfTUNJX1NUUkRVUF9UT19TRUcoVS5vcGVuUGFyYW1zLmxwc3RyQWxpYXMsa2V5d29yZHNbaV0pOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJlbGVtZW50IikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQlkd0ZsYWdzIHw9IE1DSV9PUEVOX0VMRU1FTlQ7CisJCQlfTUNJX1NUUkRVUF9UT19TRUcoVS5vcGVuUGFyYW1zLmxwc3RyRWxlbWVudE5hbWUsa2V5d29yZHNbaV0pOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwkJY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOgorCQkJRkxBRzEoIm5vc3RhdGljIixNQ0lfQU5JTV9PUEVOX05PU1RBVElDKTsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJwYXJlbnQiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9BTklNX09QRU5fUEFSRU5UOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIldSIsJihVLmFuaW1vcGVuUGFyYW1zLmhXbmRQYXJlbnQpKTsKKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sInN0eWxlIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQkJRFdPUkQJc3Q7CisKKwkJCQlkd0ZsYWdzIHw9IE1DSV9BTklNX09QRU5fV1M7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwicG9wdXAiKSkgeworCQkJCQlVLmFuaW1vcGVuUGFyYW1zLmR3U3R5bGUgfD0gV1NfUE9QVVA7IAorCQkJCX0gZWxzZSBpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJvdmVybGFwIikpIHsKKwkJCQkJVS5hbmltb3BlblBhcmFtcy5kd1N0eWxlIHw9IFdTX09WRVJMQVBQRUQ7IAorCQkJCX0gZWxzZSBpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJjaGlsZCIpKSB7CisJCQkJCVUuYW5pbW9wZW5QYXJhbXMuZHdTdHlsZSB8PSBXU19DSElMRDsgCisJCQkJfSBlbHNlIGlmIChzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWxkIiwmc3QpKSB7CisJCQkJCVUuYW5pbW9wZW5QYXJhbXMuZHdTdHlsZSB8PSBzdDsgCisJCQkJfSBlbHNlCisJCQkJCWZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX09wZW46dW5rbm93biAnc3R5bGUnIGtleXdvcmQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLGtleXdvcmRzW2krMV0pOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJidWZmZXIiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9XQVZFX09QRU5fQlVGRkVSOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoVS53YXZlb3BlblBhcmFtcy5kd0J1ZmZlclNlY29uZHMpKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX09WRVJMQVk6CisJCQkvKiBsb29rcyBqdXN0IGxpa2UgYW5pbSwgYnV0IHdpdGhvdXQgTk9TVEFUSUMgKi8KKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJwYXJlbnQiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9PVkxZX09QRU5fUEFSRU5UOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlZCIsJihVLm92bHlvcGVuUGFyYW1zLmhXbmRQYXJlbnQpKTsKKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sInN0eWxlIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQkJRFdPUkQJc3Q7CisKKwkJCQlkd0ZsYWdzIHw9IE1DSV9PVkxZX09QRU5fV1M7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwicG9wdXAiKSkgeworCQkJCQlVLm92bHlvcGVuUGFyYW1zLmR3U3R5bGUgfD0gV1NfUE9QVVA7IAorCQkJCX0gZWxzZSBpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJvdmVybGFwIikpIHsKKwkJCQkJVS5vdmx5b3BlblBhcmFtcy5kd1N0eWxlIHw9IFdTX09WRVJMQVBQRUQ7IAorCQkJCX0gZWxzZSBpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJjaGlsZCIpKSB7CisJCQkJCVUub3ZseW9wZW5QYXJhbXMuZHdTdHlsZSB8PSBXU19DSElMRDsgCisJCQkJfSBlbHNlIGlmIChzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWxkIiwmc3QpKSB7CisJCQkJCVUub3ZseW9wZW5QYXJhbXMuZHdTdHlsZSB8PSBzdDsgCisJCQkJfSBlbHNlCisJCQkJCWZwcmludGYoc3RkbmltcCxfX0ZJTEVfXyI6TUNJU1RSX09wZW46dW5rbm93biAnc3R5bGUnIGtleXdvcmQgJXMsIHBsZWFzZSByZXBvcnQuXG4iLGtleXdvcmRzW2krMV0pOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZG5pbXAsX19GSUxFX18iOk1DSVNUUl9PcGVuOnVua25vd24gcGFyYW1ldGVyIHBhc3NlZCAlcywgcGxlYXNlIHJlcG9ydC5cbiIsa2V5d29yZHNbaV0pOworCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX09QRU4sVSk7CisJaWYgKHJlcz09MCkKKwkJbWVtY3B5KCZtY2lPcGVuRHJ2W3dEZXZJRF0sJlUub3BlblBhcmFtcyxzaXplb2YoTUNJX09QRU5fUEFSTVMpKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBBIGhlbHAgZnVuY3Rpb24gZm9yIGEgbG90IG9mIG90aGVycyAuLi4gCisgKiBmb3IgaW5zdGFuY2Ugc3RhdHVzL3BsYXkvcmVjb3JkL3NlZWsgZXRjLgorICovCitEV09SRAorX01DSVNUUl9kZXRlcm1pbmVfdGltZWZvcm1hdChMUENTVFIgZGV2LFdPUkQgd0RldklELFdPUkQgdURldlR5cCxpbnQgKnRpbWVmKSB7CisJTUNJX1NUQVRVU19QQVJNUwlzdGF0dXNQYXJhbXM7CisJRFdPUkQJCQlkd0ZsYWdzOworCWludAkJCXJlczsKKworCWR3RmxhZ3MJPSBNQ0lfU1RBVFVTX0lURU07CisJc3RhdHVzUGFyYW1zLmR3SXRlbQk9IE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ7CisJc3RhdHVzUGFyYW1zLmR3UmV0dXJuCT0gMDsKKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVEFUVVMsc3RhdHVzUGFyYW1zKTsKKwlpZiAocmVzPT0wKSAqdGltZWY9c3RhdHVzUGFyYW1zLmR3UmV0dXJuOworCXJldHVybiByZXM7Cit9CisKKy8qIHF1ZXJ5IHN0YXR1cyBvZiBNQ0kgZHJpdmVycworICogQXJndW1lbnRzOgorICogUmVxdWlyZWQ6IAorICoJIm1vZGUiCS0gcmV0dXJucyAibm90IHJlYWR5IiAicGF1c2VkIiAicGxheWluZyIgInN0b3BwZWQiICJvcGVuIiAKKyAqCQkgICJwYXJrZWQiICJyZWNvcmRpbmciICJzZWVraW5nIiAuLi4uCisgKiBCYXNpY3M6CisgKgkiY3VycmVudCB0cmFjayIJLSByZXR1cm5zIGN1cnJlbnQgdHJhY2sgYXMgaW50ZWdlcgorICoJImxlbmd0aCBbdHJhY2sgPG5yPl0iCS0gcmV0dXJucyBsZW5ndGggW29mIHRyYWNrIDxucj5dIGluIGN1cnJlbnQgCisgKgkJCQl0aW1lZm9ybWF0CisgKgkibnVtYmVyIG9mIHRyYWNrcyIgLSByZXR1cm5zIG51bWJlciBvZiB0cmFja3MgYXMgaW50ZWdlcgorICoJInBvc2l0aW9uIFt0cmFjayA8bnI+XSIgLSByZXR1cm5zIHBvc2l0aW9uIFtpbiB0cmFjayA8bnI+XSBpbiBjdXJyZW50IAorICoJCQkJdGltZWZvcm1hdAorICoJInJlYWR5IgkJCS0gY2hlY2tzIGlmIGRldmljZSBpcyByZWFkeSB0byBwbGF5LCAtPiBib29sCisgKgkic3RhcnQgcG9zaXRpb24iCS0gcmV0dXJucyBzdGFydCBwb3NpdGlvbiBpbiB0aW1lZm9ybWF0CisgKgkidGltZSBmb3JtYXQiCQktIHJldHVybnMgdGltZWZvcm1hdCAobGlzdCBvZiBwb3NzaWJsZSB2YWx1ZXM6CisgKiAJCQkJIm1zIiAibXNmIiAibWlsbGlzZWNvbmRzIiAiaG1zZiIgInRtc2YiICJmcmFtZXMiCisgKgkJCQkiYnl0ZXMiICJzYW1wbGVzIiAiaG1zIikKKyAqCSJtZWRpYSBwcmVzZW50IgkJLSByZXR1cm5zIGlmIG1lZGlhIGlzIHByZXNlbnQgYXMgYm9vbAorICogQW5pbWF0aW9uOgorICoJImZvcndhcmQiCQktIHJldHVybnMgInRydWUiIGlmIGRldmljZSBpcyBwbGF5aW5nIGZvcndhcmRzCisgKgkic3BlZWQiCQkJLSByZXR1cm5zIHNwZWVkIGZvciBkZXZpY2UKKyAqCSJwYWxldHRlIGhhbmRsZSIJLSByZXR1cm5zIHBhbGV0dGUgaGFuZGxlCisgKgkid2luZG93IGhhbmRsZSIJCS0gcmV0dXJucyB3aW5kb3cgaGFuZGxlCisgKiAJInN0cmV0Y2giCQktIHJldHVybnMgc3RyZXRjaCBib29sCisgKiBNSURJIHNlcXVlbmNlcjoKKyAqCSJkaXZpc2lvbiB0eXBlIgkJLSA/IHJldHVybnMgIlBQUU4iICJTTVBURSAyNCBmcmFtZSIgCisgKiAJCQkiU01QVEUgMjUgZnJhbWUiICJTTVBURSAzMCBmcmFtZSIgIlNNUFRFIDMwIGRyb3AgZnJhbWUiCisgKgkidGVtcG8iCQkJLSBjdXJyZW50IHRlbXBvIGluIChQUFFOPyBzcGVlZCBpbiBmcmFtZXMsIFNNUFRFKj8gc3BlZWQgaW4gaHNtZikKKyAqCSJvZmZzZXQiCQktIG9mZnNldCBpbiBkaXRvLgorICoJInBvcnQiCQkJLSBtaWRpIHBvcnQgYXMgaW50ZWdlcgorICogCSJzbGF2ZSIJCQktIHNsYXZlIGRldmljZSAoIm1pZGkiLCJmaWxlIiwibm9uZSIsInNtcHRlIikKKyAqCSJtYXN0ZXIiCQktIG1hc3RlcmRldmljZSAoZGl0by4pCisgKiBPdmVybGF5OgorICoJIndpbmRvdyBoYW5kbGUiCQktIHNlZSBhbmltYXRpb24KKyAqCSJzdHJldGNoIgkJLSBkaXRvCisgKiBWaWRlbyBEaXNjOgorICoJInNwZWVkIgkJCS0gc3BlZWQgYXMgaW50ZWdlcgorICoJImZvcndhcmQiCQktIHJldHVybnMgYm9vbCAod2hlbiBwbGF5aW5nIGZvcndhcmQpCisgKgkic2lkZSIJCQktIHJldHVybnMgMSBvciAyCisgKgkibWVkaWEgdHlwZSIJCS0gcmV0dXJucyAiQ0FWIiAiQ0xWIiAib3RoZXIiCisgKgkiZGlzYyBzaXplIgkJLSByZXR1cm5zICI4IiBvciAiMTIiCisgKiBXQVZFRk9STSBhdWRpbzoKKyAqCSJpbnB1dCIJCQktIGJhc2UgcXVlcmllcyBvbiBpbnB1dCBzZXQKKyAqCSJvdXRwdXQiCQktIGJhc2UgcXVlcmllcyBvbiBvdXRwdXQgc2V0CisgKgkiZm9ybWF0IHRhZyIJCS0gcmV0dXJuIGludGVnZXIgZm9ybWF0IHRhZworICoJImNoYW5uZWxzIgkJLSByZXR1cm4gaW50ZWdlciBuciBvZiBjaGFubmVscworICoJImJ5dGVzcGVyc2VjIgkJLSByZXR1cm4gYXZlcmFnZSBuciBvZiBieXRlcy9zZWMKKyAqCSJzYW1wbGVzcGVyc2VjIgkJLSByZXR1cm4gbnIgb2Ygc2FtcGxlcyBwZXIgc2VjCisgKgkiYml0c3BlcnNhbXBsZSIJCS0gcmV0dXJuIGJpdHNwZXJzYW1wbGUKKyAqCSJhbGlnbm1lbnQiCQktIHJldHVybiBibG9jayBhbGlnbm1lbnQKKyAqCSJsZXZlbCIJCQktIHJldHVybiBsZXZlbD8KKyAqLworCisjZGVmaW5lIElURU0xKHN0cixpdGVtLHh0eXBlKSBcCisJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sc3RyKSkge1wKKwkJc3RhdHVzUGFyYW1zLmR3SXRlbSA9IGl0ZW07XAorCQl0eXBlID0geHR5cGU7XAorCQlpKys7XAorCQljb250aW51ZTtcCisJfQorI2RlZmluZSBJVEVNMihzdHIxLHN0cjIsaXRlbSx4dHlwZSkgXAorCWlmICgJIVNUUkNNUChrZXl3b3Jkc1tpXSxzdHIxKSAmJlwKKwkJKGkrMTxucm9ma2V5d29yZHMpICYmXAorCQkhU1RSQ01QKGtleXdvcmRzW2krMV0sc3RyMilcCisJKSB7XAorCQlzdGF0dXNQYXJhbXMuZHdJdGVtID0gaXRlbTtcCisJCXR5cGUgPSB4dHlwZTtcCisJCWkrPTI7XAorCQljb250aW51ZTtcCisJfQorI2RlZmluZSBJVEVNMyhzdHIxLHN0cjIsc3RyMyxpdGVtLHh0eXBlKSBcCisJaWYgKAkhU1RSQ01QKGtleXdvcmRzW2ldLHN0cjEpICYmXAorCQkoaSsyPG5yb2ZrZXl3b3JkcykgJiZcCisJCSFTVFJDTVAoa2V5d29yZHNbaSsxXSxzdHIyKSAmJlwKKwkJIVNUUkNNUChrZXl3b3Jkc1tpKzJdLHN0cjMpXAorCSkge1wKKwkJc3RhdHVzUGFyYW1zLmR3SXRlbSA9IGl0ZW07XAorCQl0eXBlID0geHR5cGU7XAorCQlpKz0zO1wKKwkJY29udGludWU7XAorCX0KK3N0YXRpYyBEV09SRAorTUNJU1RSX1N0YXR1cyhfTUNJU1RSX1BST1RPXykgeworCU1DSV9TVEFUVVNfUEFSTVMJc3RhdHVzUGFyYW1zOworCWludAkJCXR5cGUsaSxyZXMsdGltZWY7CisKKwlzdGF0dXNQYXJhbXMuZHdDYWxsYmFjayA9IDA7CisJZHdGbGFncwl8PSBNQ0lfU1RBVFVTX0lURU07CisJcmVzID0gX01DSVNUUl9kZXRlcm1pbmVfdGltZWZvcm1hdChkZXYsd0RldklELHVEZXZUeXAsJnRpbWVmKTsKKwlpZiAocmVzKSByZXR1cm4gcmVzOworCisJc3RhdHVzUGFyYW1zLmR3UmV0dXJuCT0gMDsKKwlzdGF0dXNQYXJhbXMuZHdJdGVtCT0gMDsKKwlpID0gMDsKKworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwidHJhY2siKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoc3RhdHVzUGFyYW1zLmR3VHJhY2spKTsKKwkJCWR3RmxhZ3MgfD0gTUNJX1RSQUNLOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCUZMQUcxKCJzdGFydCIsTUNJX1NUQVRVU19TVEFSVCk7CisJCS8qIGdlbmVyaWMgdGhpbmdzICovCisJCUlURU0yKCJjdXJyZW50IiwidHJhY2siLE1DSV9TVEFUVVNfQ1VSUkVOVF9UUkFDSyxfTUNJU1RSX3RpbWUpOworCQlJVEVNMigidGltZSIsImZvcm1hdCIsTUNJX1NUQVRVU19USU1FX0ZPUk1BVCxfTUNJU1RSX3RmbmFtZSk7CisJCUlURU0xKCJyZWFkeSIsTUNJX1NUQVRVU19SRUFEWSxfTUNJU1RSX2Jvb2wpOworCQlJVEVNMSgibW9kZSIsTUNJX1NUQVRVU19NT0RFLF9NQ0lTVFJfbW9kZSk7CisJCUlURU0zKCJudW1iZXIiLCJvZiIsInRyYWNrcyIsTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTLF9NQ0lTVFJfaW50KTsKKwkJSVRFTTEoImxlbmd0aCIsTUNJX1NUQVRVU19MRU5HVEgsX01DSVNUUl90aW1lKTsKKwkJSVRFTTEoInBvc2l0aW9uIixNQ0lfU1RBVFVTX1BPU0lUSU9OLF9NQ0lTVFJfdGltZSk7CisJCUlURU0yKCJtZWRpYSIsInByZXNlbnQiLE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVCxfTUNJU1RSX2Jvb2wpOworCisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwkJY2FzZSBNQ0lfREVWVFlQRV9ESUdJVEFMX1ZJREVPOgorCQkJSVRFTTIoInBhbGV0dGUiLCJoYW5kbGUiLE1DSV9BTklNX1NUQVRVU19IUEFMLF9NQ0lTVFJfaW50KTsKKwkJCUlURU0yKCJ3aW5kb3ciLCJoYW5kbGUiLE1DSV9BTklNX1NUQVRVU19IV05ELF9NQ0lTVFJfaW50KTsKKwkJCUlURU0xKCJzdHJldGNoIixNQ0lfQU5JTV9TVEFUVVNfU1RSRVRDSCxfTUNJU1RSX2Jvb2wpOworCQkJSVRFTTEoInNwZWVkIixNQ0lfQU5JTV9TVEFUVVNfU1BFRUQsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoImZvcndhcmQiLE1DSV9BTklNX1NUQVRVU19GT1JXQVJELF9NQ0lTVFJfYm9vbCk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6CisJCQkvKiBqdXN0IGNvbXBsZXRpbmcgdGhlIGxpc3QsIG5vdCB3b3JraW5nIGNvcnJlY3RseSAqLworCQkJSVRFTTIoImRpdmlzaW9uIiwidHlwZSIsTUNJX1NFUV9TVEFUVVNfRElWVFlQRSxfTUNJU1RSX2RpdnR5cGUpOworCQkJLyogdGVtcG8gLi4uIFBQUU4gaW4gZnJhbWVzL3NlY29uZCwgU01QVEUgaW4gaG1zZiAqLworCQkJSVRFTTEoInRlbXBvIixNQ0lfU0VRX1NUQVRVU19URU1QTyxfTUNJU1RSX2ludCk7CisJCQlJVEVNMSgicG9ydCIsTUNJX1NFUV9TVEFUVVNfUE9SVCxfTUNJU1RSX2ludCk7CisJCQlJVEVNMSgic2xhdmUiLE1DSV9TRVFfU1RBVFVTX1NMQVZFLF9NQ0lTVFJfc2VxdHlwZSk7CisJCQlJVEVNMSgibWFzdGVyIixNQ0lfU0VRX1NUQVRVU19TTEFWRSxfTUNJU1RSX3NlcXR5cGUpOworCQkJLyogb2Zmc2V0IC4uLiBQUFFOIGluIGZyYW1lcy9zZWNvbmQsIFNNUFRFIGluIGhtc2YgKi8KKwkJCUlURU0xKCJvZmZzZXQiLE1DSV9TRVFfU1RBVFVTX1NMQVZFLF9NQ0lTVFJfdGltZSk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9PVkVSTEFZOgorCQkJSVRFTTIoIndpbmRvdyIsImhhbmRsZSIsTUNJX09WTFlfU1RBVFVTX0hXTkQsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoInN0cmV0Y2giLE1DSV9PVkxZX1NUQVRVU19TVFJFVENILF9NQ0lTVFJfYm9vbCk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9WSURFT0RJU0M6CisJCQlJVEVNMSgic3BlZWQiLE1DSV9WRF9TVEFUVVNfU1BFRUQsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoImZvcndhcmQiLE1DSV9WRF9TVEFUVVNfRk9SV0FSRCxfTUNJU1RSX2Jvb2wpOworCQkJSVRFTTEoInNpZGUiLE1DSV9WRF9TVEFUVVNfU0lERSxfTUNJU1RSX2ludCk7CisJCQlJVEVNMigibWVkaWEiLCJ0eXBlIixNQ0lfVkRfU1RBVFVTX1NJREUsX01DSVNUUl92ZG10eXBlKTsKKwkJCS8qIHJldHVybnMgOCBvciAxMiAqLworCQkJSVRFTTIoImRpc2MiLCJzaXplIixNQ0lfVkRfU1RBVFVTX0RJU0NfU0laRSxfTUNJU1RSX2ludCk7CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTzoKKwkJCS8qIEkgYW0gbm90IHF1aXRlIHN1cmUgaWYgZm9sbC4gMiBsaW5lcyBhcmUgcmlnaHQuICovCisJCQlGTEFHMSgiaW5wdXQiLE1DSV9XQVZFX0lOUFVUKTsKKwkJCUZMQUcxKCJvdXRwdXQiLE1DSV9XQVZFX09VVFBVVCk7CisKKwkJCUlURU0yKCJmb3JtYXQiLCJ0YWciLE1DSV9XQVZFX1NUQVRVU19GT1JNQVRUQUcsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoImNoYW5uZWxzIixNQ0lfV0FWRV9TVEFUVVNfQ0hBTk5FTFMsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoImJ5dGVzcGVyc2VjIixNQ0lfV0FWRV9TVEFUVVNfQVZHQllURVNQRVJTRUMsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoInNhbXBsZXNwZXJzZWMiLE1DSV9XQVZFX1NUQVRVU19TQU1QTEVTUEVSU0VDLF9NQ0lTVFJfaW50KTsKKwkJCUlURU0xKCJiaXRzcGVyc2FtcGxlIixNQ0lfV0FWRV9TVEFUVVNfQklUU1BFUlNBTVBMRSxfTUNJU1RSX2ludCk7CisJCQlJVEVNMSgiYWxpZ25tZW50IixNQ0lfV0FWRV9TVEFUVVNfQkxPQ0tBTElHTixfTUNJU1RSX2ludCk7CisJCQlJVEVNMSgibGV2ZWwiLE1DSV9XQVZFX1NUQVRVU19MRVZFTCxfTUNJU1RSX2ludCk7CisJCQlicmVhazsKKwkJfQorCQlmcHJpbnRmKHN0ZG5pbXAsX19GSUxFX18iOk1DSVNUUl9TdGF0dXM6dW5rbm93biBrZXl3b3JkICclcydcbiIsa2V5d29yZHNbaV0pOworCQlpKys7CisJfQorCWlmICghc3RhdHVzUGFyYW1zLmR3SXRlbSkgCisJCXJldHVybiBNQ0lFUlJfTUlTU0lOR19TVFJJTkdfQVJHVU1FTlQ7CisKKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVEFUVVMsc3RhdHVzUGFyYW1zKTsKKwlpZiAocmVzPT0wKQorCQlfTUNJU1RSX2NvbnZyZXR1cm4odHlwZSxzdGF0dXNQYXJhbXMuZHdSZXR1cm4sbHBzdHJSZXR1cm5TdHJpbmcsdVJldHVybkxlbmd0aCx1RGV2VHlwLHRpbWVmKTsKKwlyZXR1cm4gcmVzOworfQorI3VuZGVmIElURU0xCisjdW5kZWYgSVRFTTIKKyN1bmRlZiBJVEVNMworCisvKiBzZXQgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gcmVzcGVjdGl2ZSBNQ0kgZHJpdmVycworICogQXJndW1lbnRzOgorICoJImRvb3Igb3BlbiIJZWplY3QgbWVkaWEgb3Igc29tZXN1Y2gKKyAqCSJkb29yIGNsb3NlIglsb2FkIG1lZGlhCisgKgkidGltZSBmb3JtYXQgPHRpbWVmb3JtYXRuYW1lPiIJIm1zIiAibWlsbGlzZWNvbmRzIiAibXNmIiAiaG1zZiIgCisgKgkJCQkJInRtc2YiICJTTVBURSAyNCIgIlNNUFRFIDI1IiAiU01QVEUgMzAiCisgKgkJCQkJIlNNUFRFIGRyb3AgMzAiCisgKgkiYXVkaW8gW2FsbHxsZWZ0fHJpZ2h0XSBbb258b2ZmXSIgc2V0cyBzcGVjaWZpZWQgYXVkaW9jaGFubmVsIG9uIG9yIG9mZgorICoJInZpZGVvIFtvbnxvZmZdIgkJc2V0cyB2aWRlbyBvbi9vZmYKKyAqIFdhdmVmb3JtIGF1ZGlvOgorICoJImZvcm1hdHRhZyBwY20iCQlzZXRzIGZvcm1hdCB0byBwY20KKyAqCSJmb3JtYXR0YWcgPG5yPiIJc2V0cyBpbnRlZ2VyIGZvcm1hdHRhZyB2YWx1ZQorICoJImFueSBpbnB1dCIJCWFjY2VwdCBpbnB1dCBmcm9tIGFueSBrbm93biBzb3VyY2UKKyAqCSJhbnkgb3V0cHV0IgkJb3V0cHV0IHRvIGFueSBrbm93biBkZXN0aW5hdGlvbgorICoJImlucHV0IDxucj4iCQlpbnB1dCBmcm9tIHNvdXJjZSA8bnI+CisgKgkib3V0cHV0IDxucj4iCQlvdXRwdXQgdG8gZGVzdGluYXRpb24gPG5yPgorICoJImNoYW5uZWxzIDxucj4iCQlzZXRzIG5yIG9mIGNoYW5uZWxzIAorICoJImJ5dGVzcGVyc2VjIDxucj4iCXNldHMgYXZlcmFnZSBieXRlcyBwZXIgc2Vjb25kCisgKgkic2FtcGxlc3BlcnNlYyA8bnI+IglzZXRzIGF2ZXJhZ2Ugc2FtcGxlcyBwZXIgc2Vjb25kICgxIHNhbXBsZSBjYW4KKyAqCQkJCWJlIDIgYnl0ZXMhKSAKKyAqCSJhbGlnbm1lbnQgPG5yPiIJc2V0cyB0aGUgYmxvY2thbGlnbm1lbnQgdG8gPG5yPgorICoJImJpdHNwZXJzYW1wbGUgPG5yPiIJc2V0cyB0aGUgbnIgb2YgYml0cyBwZXIgc2FtcGxlCisgKiBTZXF1ZW5jZXI6CisgKgkibWFzdGVyIFttaWRpfGZpbGV8c21wdGV8bm9uZV0iIHNldHMgdGhlIG1pZGkgbWFzdGVyIGRldmljZQorICoJInNsYXZlIFttaWRpfGZpbGV8c21wdGV8bm9uZV0iIHNldHMgdGhlIG1pZGkgbWFzdGVyIGRldmljZQorICoJInBvcnQgbWFwcGVyIgkJbWlkaW91dHB1dCB0byBwb3J0bWFwcGVyCisgKgkicG9ydCA8bnI+IgkJbWlkaW91dHB1dCB0byBzcGVjaWZpZWQgcG9ydAorICoJInRlbXBvIDxucj4iCQl0ZW1wbyBvZiB0cmFjayAoZGVwZW5kcyBvbiB0aW1lZm9ybWF0L2RpdnR5cGUpCisgKgkib2Zmc2V0IDxucj4iCQlzdGFydCBvZmZzZXQ/CisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX1NldChfTUNJU1RSX1BST1RPXykgeworCXVuaW9uCXsKKwkJTUNJX1NFVF9QQVJNUwkJc2V0UGFyYW1zOworCQlNQ0lfV0FWRV9TRVRfUEFSTVMJd2F2ZXNldFBhcmFtczsKKwkJTUNJX1NFUV9TRVRfUEFSTVMJc2Vxc2V0UGFyYW1zOworCX0gVTsKKwlpbnQJaSxyZXM7CisKKwlVLnNldFBhcmFtcy5kd0NhbGxiYWNrID0gMDsKKwlpID0gMDsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJRkxBRzIoImRvb3IiLCJvcGVuIixNQ0lfU0VUX0RPT1JfT1BFTik7CisJCUZMQUcyKCJkb29yIiwiY2xvc2VkIixNQ0lfU0VUX0RPT1JfQ0xPU0VEKTsKKworCQlpZiAoCSFTVFJDTVAoa2V5d29yZHNbaV0sInRpbWUiKSAmJiAKKwkJCShpKzI8bnJvZmtleXdvcmRzKSAmJgorCQkJIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJmb3JtYXQiKQorCQkpIHsKKwkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9USU1FX0ZPUk1BVDsKKworCQkJLyogRklYTUU6aXMgdGhpcyBhIHNob3J0Y3V0IGZvciBtaWxsaXNlY29uZHMgb3IKKwkJCSAqCSBtaW51dGVzOnNlY29uZHM/ICovCisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzJdLCJtcyIpKQorCQkJCVUuc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOworCisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzJdLCJtaWxsaXNlY29uZHMiKSkKKwkJCQlVLnNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sIm1zZiIpKQorCQkJCVUuc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTVNGOworCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsyXSwiaG1zIikpCisJCQkJVS5zZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9ITVM7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzJdLCJmcmFtZXMiKSkKKwkJCQlVLnNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX0ZSQU1FUzsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sInRyYWNrIikpCisJCQkJVS5zZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX1ZEX0ZPUk1BVF9UUkFDSzsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sImJ5dGVzIikpCisJCQkJVS5zZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9CWVRFUzsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sInNhbXBsZXMiKSkKKwkJCQlVLnNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NBTVBMRVM7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzJdLCJ0bXNmIikpCisJCQkJVS5zZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9UTVNGOworCQkJaWYgKAkhU1RSQ01QKGtleXdvcmRzW2krMl0sInNvbmciKSAmJiAKKwkJCQkoaSszPG5yb2ZrZXl3b3JkcykgJiYKKwkJCQkhU1RSQ01QKGtleXdvcmRzW2krM10sInBvaW50ZXIiKQorCQkJKQorCQkJCVUuc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9TRVFfRk9STUFUX1NPTkdQVFI7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzJdLCJzbXB0ZSIpICYmIChpKzM8bnJvZmtleXdvcmRzKSkgeworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krM10sIjI0IikpCisJCQkJCVUuc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjQ7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSszXSwiMjUiKSkKKwkJCQkJVS5zZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8yNTsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzNdLCIzMCIpKQorCQkJCQlVLnNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzMwOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krM10sImRyb3AiKSAmJiAoaSs0PG5yb2ZrZXl3b3JkcykgJiYgIVNUUkNNUChrZXl3b3Jkc1tpKzRdLCIzMCIpKSB7CisJCQkJCVUuc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMzBEUk9QOworCQkJCQlpKys7CisJCQkJfQorCQkJCWkrKzsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCX0KKwkJCWkrPTM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwiYXVkaW8iKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9BVURJTzsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImFsbCIpKQorCQkJCVUuc2V0UGFyYW1zLmR3QXVkaW8gPSBNQ0lfU0VUX0FVRElPX0FMTDsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImxlZnQiKSkKKwkJCQlVLnNldFBhcmFtcy5kd0F1ZGlvID0gTUNJX1NFVF9BVURJT19MRUZUOworCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwicmlnaHQiKSkKKwkJCQlVLnNldFBhcmFtcy5kd0F1ZGlvID0gTUNJX1NFVF9BVURJT19SSUdIVDsKKwkJCWkrPTI7CisJCQljb250aW51ZTsKKwkJfQorCQlGTEFHMSgidmlkZW8iLE1DSV9TRVRfVklERU8pOworCQlGTEFHMSgib24iLE1DSV9TRVRfT04pOworCQlGTEFHMSgib2ZmIixNQ0lfU0VUX09GRik7CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOgorCQkJRkxBRzIoImFueSIsImlucHV0IixNQ0lfV0FWRV9TRVRfQU5ZSU5QVVQpOworCQkJRkxBRzIoImFueSIsIm91dHB1dCIsTUNJX1dBVkVfU0VUX0FOWU9VVFBVVCk7CisKKwkJCWlmICgJIVNUUkNNUChrZXl3b3Jkc1tpXSwiZm9ybWF0dGFnIikgJiYgCisJCQkJKGkrMTxucm9ma2V5d29yZHMpICYmCisJCQkJIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJwY20iKQorCQkJKSB7CisJCQkJZHdGbGFncyB8PSBNQ0lfV0FWRV9TRVRfRk9STUFUVEFHOworCQkJCVUud2F2ZXNldFBhcmFtcy53Rm9ybWF0VGFnID0gV0FWRV9GT1JNQVRfUENNOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIDxrZXl3b3JkPiA8aW50ZWdlcj4gKi8KKyNkZWZpbmUgV0lJKHN0cixmbGFnLGVsZW1lbnQpIFwKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLHN0cikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7XAorCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlZCIsJihVLndhdmVzZXRQYXJhbXMuIGVsZW1lbnQgKSk7XAorCQkJCWR3RmxhZ3MgfD0gZmxhZztcCisJCQkJaSs9MjtcCisJCQkJY29udGludWU7XAorCQkJfQorCQkJV0lJKCJmb3JtYXR0YWciLE1DSV9XQVZFX1NFVF9GT1JNQVRUQUcsd0Zvcm1hdFRhZyk7CisJCQlXSUkoImNoYW5uZWxzIixNQ0lfV0FWRV9TRVRfQ0hBTk5FTFMsbkNoYW5uZWxzKTsKKwkJCVdJSSgiYnl0ZXNwZXJzZWMiLE1DSV9XQVZFX1NFVF9BVkdCWVRFU1BFUlNFQyxuQXZnQnl0ZXNQZXJTZWMpOworCQkJV0lJKCJzYW1wbGVzcGVyc2VjIixNQ0lfV0FWRV9TRVRfU0FNUExFU1BFUlNFQyxuU2FtcGxlc1BlclNlYyk7CisJCQlXSUkoImFsaWdubWVudCIsTUNJX1dBVkVfU0VUX0JMT0NLQUxJR04sbkJsb2NrQWxpZ24pOworCQkJV0lJKCJiaXRzcGVyc2FtcGxlIixNQ0lfV0FWRV9TRVRfQklUU1BFUlNBTVBMRSx3Qml0c1BlclNhbXBsZSk7CisJCQlXSUkoImlucHV0IixNQ0lfV0FWRV9JTlBVVCx3SW5wdXQpOworCQkJV0lJKCJvdXRwdXQiLE1DSV9XQVZFX09VVFBVVCx3T3V0cHV0KTsKKyN1bmRlZiBXSUkKKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjoKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJtYXN0ZXIiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9TRVFfU0VUX01BU1RFUjsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJtaWRpIikpCisJCQkJCVUuc2Vxc2V0UGFyYW1zLmR3TWFzdGVyID0gTUNJX1NFUV9NSURJOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImZpbGUiKSkKKwkJCQkJVS5zZXFzZXRQYXJhbXMuZHdNYXN0ZXIgPSBNQ0lfU0VRX0ZJTEU7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwic21wdGUiKSkKKwkJCQkJVS5zZXFzZXRQYXJhbXMuZHdNYXN0ZXIgPSBNQ0lfU0VRX1NNUFRFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm5vbmUiKSkKKwkJCQkJVS5zZXFzZXRQYXJhbXMuZHdNYXN0ZXIgPSBNQ0lfU0VRX05PTkU7CisJCQkJaSs9MjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJzbGF2ZSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCWR3RmxhZ3MgfD0gTUNJX1NFUV9TRVRfU0xBVkU7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwibWlkaSIpKQorCQkJCQlVLnNlcXNldFBhcmFtcy5kd01hc3RlciA9IE1DSV9TRVFfTUlESTsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJmaWxlIikpCisJCQkJCVUuc2Vxc2V0UGFyYW1zLmR3TWFzdGVyID0gTUNJX1NFUV9GSUxFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sInNtcHRlIikpCisJCQkJCVUuc2Vxc2V0UGFyYW1zLmR3TWFzdGVyID0gTUNJX1NFUV9TTVBURTsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJub25lIikpCisJCQkJCVUuc2Vxc2V0UGFyYW1zLmR3TWFzdGVyID0gTUNJX1NFUV9OT05FOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoCSFTVFJDTVAoa2V5d29yZHNbaV0sInBvcnQiKSAmJiAKKwkJCQkoaSsxPG5yb2ZrZXl3b3JkcykgJiYKKwkJCQkhU1RSQ01QKGtleXdvcmRzW2krMV0sIm1hcHBlciIpCisJCQkpIHsKKwkJCQlVLnNlcXNldFBhcmFtcy5kd1BvcnQ9LTE7LyogRklYTUU6bm90IHN1cmUqLworCQkJCWR3RmxhZ3MgfD0gTUNJX1NFUV9TRVRfUE9SVDsKKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorI2RlZmluZSBTSUkoc3RyLGZsYWcsZWxlbWVudCkgXAorCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sc3RyKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHtcCisJCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJihVLnNlcXNldFBhcmFtcy4gZWxlbWVudCApKTtcCisJCQkJZHdGbGFncyB8PSBmbGFnO1wKKwkJCQlpKz0yO1wKKwkJCQljb250aW51ZTtcCisJCQl9CisJCQlTSUkoInRlbXBvIixNQ0lfU0VRX1NFVF9URU1QTyxkd1RlbXBvKTsKKwkJCVNJSSgicG9ydCIsTUNJX1NFUV9TRVRfUE9SVCxkd1BvcnQpOworCQkJU0lJKCJvZmZzZXQiLE1DSV9TRVFfU0VUX1BPUlQsZHdPZmZzZXQpOworCQl9CisJCWkrKzsKKwl9CisJaWYgKCFkd0ZsYWdzKQorCQlyZXR1cm4gTUNJRVJSX01JU1NJTkdfU1RSSU5HX0FSR1VNRU5UOworCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1NFVCxVKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBzcGVjaWZ5IGJyZWFrIGtleQorICogQXJndW1lbnRzOiAKKyAqCSJvZmYiCQlkaXNhYmxlIGJyZWFrCisgKgkib24gPGtleWlkPiIJZW5hYmxlIGJyZWFrIG9uIGtleSB3aXRoIGtleWlkCisgKiAoSSBzdHJvbmdseSBzdXNwZWN0LCB0aGF0IHRoZXJlIGlzIGFub3RoZXIgcGFyYW1ldGVyOgorICoJIndpbmRvdyA8aGFuZGxlPiIJCisgKiBidXQgSSBkb24ndCBzZWUgaXQgbWVudGlvbmVkIGluIG15IGRvY3VtZW50YXRpb24uCisgKiBSZXR1cm5zIG5vdGhpbmcuCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX0JyZWFrKF9NQ0lTVFJfUFJPVE9fKSB7CisJTUNJX0JSRUFLX1BBUk1TCWJyZWFrUGFyYW1zOworCWludAlyZXMsaTsKKworCS8qYnJlYWtQYXJhbXMuaHduZEJyZWFrID8gKi8KKwlpPTA7d2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCUZMQUcxKCJvZmYiLE1DSV9CUkVBS19PRkYpOworCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwib24iKSAmJiAobnJvZmtleXdvcmRzPmkrMSkpIHsKKwkJCWR3RmxhZ3MmPX5NQ0lfQlJFQUtfT0ZGOworCQkJZHdGbGFnc3w9TUNJX0JSRUFLX0tFWTsKKwkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlZCIsJihicmVha1BhcmFtcy5uVmlydEtleSkpOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWkrKzsKKwl9CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfQlJFQUssYnJlYWtQYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKyNkZWZpbmUgSVRFTTEoc3RyLGl0ZW0seHR5cGUpIFwKKwlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSxzdHIpKSB7XAorCQlnZGNQYXJhbXMuZHdJdGVtID0gaXRlbTtcCisJCXR5cGUgPSB4dHlwZTtcCisJCWkrKztcCisJCWNvbnRpbnVlO1wKKwl9CisjZGVmaW5lIElURU0yKHN0cjEsc3RyMixpdGVtLHh0eXBlKSBcCisJaWYgKAkhU1RSQ01QKGtleXdvcmRzW2ldLHN0cjEpICYmXAorCQkoaSsxPG5yb2ZrZXl3b3JkcykgJiZcCisJCSFTVFJDTVAoa2V5d29yZHNbaSsxXSxzdHIyKVwKKwkpIHtcCisJCWdkY1BhcmFtcy5kd0l0ZW0gPSBpdGVtO1wKKwkJdHlwZSA9IHh0eXBlO1wKKwkJaSs9MjtcCisJCWNvbnRpbnVlO1wKKwl9CisjZGVmaW5lIElURU0zKHN0cjEsc3RyMixzdHIzLGl0ZW0seHR5cGUpIFwKKwlpZiAoCSFTVFJDTVAoa2V5d29yZHNbaV0sc3RyMSkgJiZcCisJCShpKzI8bnJvZmtleXdvcmRzKSAmJlwKKwkJIVNUUkNNUChrZXl3b3Jkc1tpKzFdLHN0cjIpICYmXAorCQkhU1RSQ01QKGtleXdvcmRzW2krMl0sc3RyMylcCisJKSB7XAorCQlnZGNQYXJhbXMuZHdJdGVtID0gaXRlbTtcCisJCXR5cGUgPSB4dHlwZTtcCisJCWkrPTM7XAorCQljb250aW51ZTtcCisJfQorLyogZ2V0IGRldmljZSBjYXBhYmlsaXRpZXMgb2YgTUNJIGRyaXZlcnMKKyAqIEFyZ3VtZW50czoKKyAqIEdlbmVyaWM6CisgKgkiZGV2aWNlIHR5cGUiCXJldHVybnMgZGV2aWNlIG5hbWUgYXMgc3RyaW5nCisgKgkiaGFzIGF1ZGlvIglyZXR1cm5zIGJvb2wKKyAqCSJoYXMgdmlkZW8iCXJldHVybnMgYm9vbAorICoJInVzZXMgZmlsZXMiCXJldHVybnMgYm9vbAorICoJImNvbXBvdW5kIGRldmljZSIJcmV0dXJucyBib29sCisgKgkiY2FuIHJlY29yZCIJcmV0dXJucyBib29sCisgKgkiY2FuIHBsYXkiCXJldHVybnMgYm9vbAorICoJImNhbiBlamVjdCIJcmV0dXJucyBib29sCisgKgkiY2FuIHNhdmUiCXJldHVybnMgYm9vbAorICogQW5pbWF0aW9uOgorICoJInBhbGV0dGVzIglyZXR1cm5zIG5yIG9mIGF2YWlsYWJsZSBwYWxldHRlIGVudHJpZXMKKyAqCSJ3aW5kb3dzIglyZXR1cm5zIG5yIG9mIGF2YWlsYWJsZSB3aW5kb3dzCisgKgkiY2FuIHJldmVyc2UiCXJldHVybnMgYm9vbAorICoJImNhbiBzdHJldGNoIglyZXR1cm5zIGJvb2wKKyAqCSJzbG93IHBsYXkgcmF0ZSIJcmV0dXJucyB0aGUgc2xvdyBwbGF5cmF0ZQorICoJImZhc3QgcGxheSByYXRlIglyZXR1cm5zIHRoZSBmYXN0IHBsYXlyYXRlCisgKgkibm9ybWFsIHBsYXkgcmF0ZSIJcmV0dXJucyB0aGUgbm9ybWFsIHBsYXlyYXRlCisgKiBPdmVybGF5OgorICoJIndpbmRvd3MiCXJldHVybnMgbnIgb2YgYXZhaWxhYmxlIHdpbmRvd3MKKyAqCSJjYW4gc3RyZXRjaCIJcmV0dXJucyBib29sCisgKgkiY2FuIGZyZWV6ZSIJcmV0dXJucyBib29sCisgKiBWaWRlb2Rpc2M6CisgKgkiY2F2IgkJYXNzdW1lIENBViBkaXNjcyAoZGVmYXVsdCBpZiBubyBkaXNrIGluc2VydGVkKQorICoJImNsdiIJCWFzc3VtZSBDTFYgZGlzY3MgCisgKgkiY2FuIHJldmVyc2UiCXJldHVybnMgYm9vbAorICoJInNsb3cgcGxheSByYXRlIglyZXR1cm5zIHRoZSBzbG93IHBsYXlyYXRlCisgKgkiZmFzdCBwbGF5IHJhdGUiCXJldHVybnMgdGhlIGZhc3QgcGxheXJhdGUKKyAqCSJub3JtYWwgcGxheSByYXRlIglyZXR1cm5zIHRoZSBub3JtYWwgcGxheXJhdGUKKyAqIFdhdmVmb3JtIGF1ZGlvOgorICoJImlucHV0cyIJcmV0dXJucyBuciBvZiBpbnB1dGRldmljZXMKKyAqCSJvdXRwdXRzIglyZXR1cm5zIG5yIG9mIG91dHB1dGRldmljZXMKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfQ2FwYWJpbGl0eShfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRVRERVZDQVBTX1BBUk1TCWdkY1BhcmFtczsKKwlpbnQJdHlwZSxpLHJlczsKKworCWdkY1BhcmFtcy5kd0NhbGxiYWNrID0gMDsKKwlpZiAoIW5yb2ZrZXl3b3JkcykKKwkJcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1NUUklOR19BUkdVTUVOVDsKKwkvKiB3ZWxsICwgdGhhdHMgZGVmYXVsdCAqLworCWR3RmxhZ3MgfD0gTUNJX0dFVERFVkNBUFNfSVRFTTsKKwlnZGNQYXJhbXMuZHdJdGVtID0gMDsKKwlpPTA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCUlURU0yKCJkZXZpY2UiLCJ0eXBlIixNQ0lfR0VUREVWQ0FQU19ERVZJQ0VfVFlQRSxfTUNJU1RSX2RldnR5cGUpOworCQlJVEVNMigiaGFzIiwiYXVkaW8iLE1DSV9HRVRERVZDQVBTX0hBU19BVURJTyxfTUNJU1RSX2Jvb2wpOworCQlJVEVNMigiaGFzIiwidmlkZW8iLE1DSV9HRVRERVZDQVBTX0hBU19WSURFTyxfTUNJU1RSX2Jvb2wpOworCQlJVEVNMigidXNlcyIsImZpbGVzIixNQ0lfR0VUREVWQ0FQU19VU0VTX0ZJTEVTLF9NQ0lTVFJfYm9vbCk7CisJCUlURU0yKCJjb21wb3VuZCIsImRldmljZSIsTUNJX0dFVERFVkNBUFNfQ09NUE9VTkRfREVWSUNFLF9NQ0lTVFJfYm9vbCk7CisJCUlURU0yKCJjYW4iLCJyZWNvcmQiLE1DSV9HRVRERVZDQVBTX0NBTl9SRUNPUkQsX01DSVNUUl9ib29sKTsKKwkJSVRFTTIoImNhbiIsInBsYXkiLE1DSV9HRVRERVZDQVBTX0NBTl9QTEFZLF9NQ0lTVFJfYm9vbCk7CisJCUlURU0yKCJjYW4iLCJlamVjdCIsTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNULF9NQ0lTVFJfYm9vbCk7CisJCUlURU0yKCJjYW4iLCJzYXZlIixNQ0lfR0VUREVWQ0FQU19DQU5fU0FWRSxfTUNJU1RSX2Jvb2wpOworCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlJVEVNMSgicGFsZXR0ZXMiLE1DSV9BTklNX0dFVERFVkNBUFNfUEFMRVRURVMsX01DSVNUUl9pbnQpOworCQkJSVRFTTEoIndpbmRvd3MiLE1DSV9BTklNX0dFVERFVkNBUFNfTUFYX1dJTkRPV1MsX01DSVNUUl9pbnQpOworCQkJSVRFTTIoImNhbiIsInJldmVyc2UiLE1DSV9BTklNX0dFVERFVkNBUFNfQ0FOX1JFVkVSU0UsX01DSVNUUl9ib29sKTsKKwkJCUlURU0yKCJjYW4iLCJzdHJldGNoIixNQ0lfQU5JTV9HRVRERVZDQVBTX0NBTl9TVFJFVENILF9NQ0lTVFJfYm9vbCk7CisJCQlJVEVNMygic2xvdyIsInBsYXkiLCJyYXRlIixNQ0lfQU5JTV9HRVRERVZDQVBTX1NMT1dfUkFURSxfTUNJU1RSX2ludCk7CisJCQlJVEVNMygiZmFzdCIsInBsYXkiLCJyYXRlIixNQ0lfQU5JTV9HRVRERVZDQVBTX0ZBU1RfUkFURSxfTUNJU1RSX2ludCk7CisJCQlJVEVNMygibm9ybWFsIiwicGxheSIsInJhdGUiLE1DSV9BTklNX0dFVERFVkNBUFNfTk9STUFMX1JBVEUsX01DSVNUUl9pbnQpOworCQkJYnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfT1ZFUkxBWToKKwkJCUlURU0xKCJ3aW5kb3dzIixNQ0lfT1ZMWV9HRVRERVZDQVBTX01BWF9XSU5ET1dTLF9NQ0lTVFJfaW50KTsKKwkJCUlURU0yKCJjYW4iLCJmcmVlemUiLE1DSV9PVkxZX0dFVERFVkNBUFNfQ0FOX0ZSRUVaRSxfTUNJU1RSX2Jvb2wpOworCQkJSVRFTTIoImNhbiIsInN0cmV0Y2giLE1DSV9PVkxZX0dFVERFVkNBUFNfQ0FOX1NUUkVUQ0gsX01DSVNUUl9ib29sKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX1ZJREVPRElTQzoKKwkJCUZMQUcxKCJjYXYiLE1DSV9WRF9HRVRERVZDQVBTX0NBVik7CisJCQlGTEFHMSgiY2x2IixNQ0lfVkRfR0VUREVWQ0FQU19DTFYpOworCQkJSVRFTTIoImNhbiIsInJldmVyc2UiLE1DSV9WRF9HRVRERVZDQVBTX0NBTl9SRVZFUlNFLF9NQ0lTVFJfYm9vbCk7CisJCQlJVEVNMygic2xvdyIsInBsYXkiLCJyYXRlIixNQ0lfVkRfR0VUREVWQ0FQU19TTE9XX1JBVEUsX01DSVNUUl9pbnQpOworCQkJSVRFTTMoImZhc3QiLCJwbGF5IiwicmF0ZSIsTUNJX1ZEX0dFVERFVkNBUFNfRkFTVF9SQVRFLF9NQ0lTVFJfaW50KTsKKwkJCUlURU0zKCJub3JtYWwiLCJwbGF5IiwicmF0ZSIsTUNJX1ZEX0dFVERFVkNBUFNfTk9STUFMX1JBVEUsX01DSVNUUl9pbnQpOworCQkJYnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86CisJCQlJVEVNMSgiaW5wdXRzIixNQ0lfV0FWRV9HRVRERVZDQVBTX0lOUFVUUyxfTUNJU1RSX2ludCk7CisJCQlJVEVNMSgib3V0cHV0cyIsTUNJX1dBVkVfR0VUREVWQ0FQU19PVVRQVVRTLF9NQ0lTVFJfaW50KTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfR0VUREVWQ0FQUyxnZGNQYXJhbXMpOworCS8qIG5vIHRpbWVmb3JtYXQgbmVlZGVkICovCisJaWYgKHJlcz09MCkKKwkJX01DSVNUUl9jb252cmV0dXJuKHR5cGUsZ2RjUGFyYW1zLmR3UmV0dXJuLGxwc3RyUmV0dXJuU3RyaW5nLHVSZXR1cm5MZW5ndGgsdURldlR5cCwwKTsKKwlyZXR1cm4gcmVzOworfQorI3VuZGVmIElURU0xCisjdW5kZWYgSVRFTTIKKyN1bmRlZiBJVEVNMworLyogcmVzdW1lcyBvcGVyYXRpb24gb2YgZGV2aWNlLiBubyBhcmd1bWVudHMsIG5vIHJldHVybiB2YWx1ZXMgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX1Jlc3VtZShfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRU5FUklDX1BBUk1TCWdlblBhcmFtczsKKwlpbnQJcmVzOworCisJZ2VuUGFyYW1zLmR3Q2FsbGJhY2s9MDsKKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9SRVNVTUUsZ2VuUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBwYXVzZXMgb3BlcmF0aW9uIG9mIGRldmljZS4gbm8gYXJndW1lbnRzLCBubyByZXR1cm4gdmFsdWVzICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9QYXVzZShfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRU5FUklDX1BBUk1TCWdlblBhcmFtczsKKwlpbnQJCQlyZXM7CisJZ2VuUGFyYW1zLmR3Q2FsbGJhY2s9MDsKKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9QQVVTRSxnZW5QYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKy8qIHN0b3BzIG9wZXJhdGlvbiBvZiBkZXZpY2UuIG5vIGFyZ3VtZW50cywgbm8gcmV0dXJuIHZhbHVlcyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfU3RvcChfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRU5FUklDX1BBUk1TCWdlblBhcmFtczsKKwlpbnQJCQlyZXM7CisJZ2VuUGFyYW1zLmR3Q2FsbGJhY2s9MDsKKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVE9QLGdlblBhcmFtcyk7CisJcmV0dXJuIHJlczsKK30KKworLyogc3RhcnRzIHJlY29yZGluZy4KKyAqIEFyZ3VtZW50czoKKyAqCSJvdmVyd3JpdGUiCW92ZXJ3cml0ZSBleGlzdGluZyB0aGluZ3MKKyAqCSJpbnNlcnQiCWluc2VydCBhdCBjdXJyZW50IHBvc2l0aW9uCisgKgkidG8gPHRpbWU+IglyZWNvcmQgdXAgdG8gPHRpbWU+IChzcGVjaWZpZWQgaW4gdGltZWZvcm1hdCkKKyAqCSJmcm9tIDx0aW1lPiIJcmVjb3JkIGZyb20gPHRpbWU+IChzcGVjaWZpZWQgaW4gdGltZWZvcm1hdCkKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfUmVjb3JkKF9NQ0lTVFJfUFJPVE9fKSB7CisJaW50CQkJaSxyZXMsdGltZWYsbnJhcmdzLGosayxhWzRdOworCWNoYXIJCQkqcGFyc2VzdHI7CisJTUNJX1JFQ09SRF9QQVJNUwlyZWNvcmRQYXJhbXM7CisKKwlyZXMgPSBfTUNJU1RSX2RldGVybWluZV90aW1lZm9ybWF0KGRldix3RGV2SUQsdURldlR5cCwmdGltZWYpOworCWlmIChyZXMpIHJldHVybiByZXM7CisKKwlzd2l0Y2ggKHRpbWVmKSB7CisJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKKwljYXNlIE1DSV9GT1JNQVRfRlJBTUVTOgorCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKKwljYXNlIE1DSV9GT1JNQVRfU0FNUExFUzoKKwkJbnJhcmdzPTE7CisJCXBhcnNlc3RyPSIlZCI7CisJCWJyZWFrOworCWNhc2UgTUNJX0ZPUk1BVF9ITVM6CisJY2FzZSBNQ0lfRk9STUFUX01TRjoKKwkJcGFyc2VzdHI9IiVkOiVkOiVkIjsKKwkJbnJhcmdzPTM7CisJCWJyZWFrOworCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOgorCQlwYXJzZXN0cj0iJWQ6JWQ6JWQ6JWQiOworCQlucmFyZ3M9NDsKKwkJYnJlYWs7CisJZGVmYXVsdDpmcHJpbnRmKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmc6UExBWTp1bmtub3duIHRpbWVmb3JtYXQgJWQsIHBsZWFzZSByZXBvcnQuXG4iLHRpbWVmKTsKKwkJcGFyc2VzdHI9IiVkIjsKKwkJbnJhcmdzPTE7CisJCWJyZWFrOworCX0KKwlyZWNvcmRQYXJhbXMuZHdDYWxsYmFjayA9IDA7CisJaSA9IDA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJ0byIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJZHdGbGFncyB8PSBNQ0lfVE87CisJCQlhWzBdPWFbMV09YVsyXT1hWzNdPTA7CisJCQlqPXNzY2FuZihrZXl3b3Jkc1tpKzFdLHBhcnNlc3RyLCZhWzBdLCZhWzFdLCZhWzJdLCZhWzNdKTsKKwkJCS8qIGFkZCB1cCBhbGwgaW50ZWdlcnMgd2UgZ290LCBpZiB3ZSBoYXZlIG1vcmUgCisJCQkgKiBzaGlmdCB0aGVtLiAoV2VsbCBJIHNob3VsZCB1c2UgdGhlIG1hY3JvcyBpbiAKKwkJCSAqIG1tc3lzdGVtLmgsIHJpZ2h0KS4KKwkJCSAqLworCQkJcmVjb3JkUGFyYW1zLmR3VG89MDsKKwkJCWZvciAoaz0wO2s8ajtrKyspCisJCQkJcmVjb3JkUGFyYW1zLmR3VG8rPWFba108PCg4KihucmFyZ3MtaykpOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJmcm9tIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQlkd0ZsYWdzIHw9IE1DSV9GUk9NOworCQkJYVswXT1hWzFdPWFbMl09YVszXT0wOworCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7CisJCQkvKiBkaXRvLiAqLworCQkJcmVjb3JkUGFyYW1zLmR3RnJvbT0wOworCQkJZm9yIChrPTA7azxqO2srKykKKwkJCQlyZWNvcmRQYXJhbXMuZHdGcm9tKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKKwkJCWkrPTI7CisJCQljb250aW51ZTsKKwkJfQorCQlGTEFHMSgiaW5zZXJ0IixNQ0lfUkVDT1JEX0lOU0VSVCk7CisJCUZMQUcxKCJvdmVyd3JpdGUiLE1DSV9SRUNPUkRfT1ZFUldSSVRFKTsKKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9SRUNPUkQscmVjb3JkUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBwbGF5IG1lZGlhCisgKiBBcmd1bWVudHM6CisgKiAJInRvIDx0aW1lPiIJcGxheSB1cCB0byA8dGltZT4gKHNwZWNpZmllZCBpbiBzZXQgdGltZWZvcm1hdCkKKyAqIAkiZnJvbSA8dGltZT4iCXBsYXkgZnJvbSA8dGltZT4gKHNwZWNpZmllZCBpbiBzZXQgdGltZWZvcm1hdCkKKyAqIEFuaW1hdGlvbjoKKyAqCSJzbG93IgkJcGxheSBzbG93CisgKgkiZmFzdCIJCXBsYXkgZmFzdCAKKyAqCSJzY2FuIgkJcGxheSBhcyBmYXN0IGFzIHBvc3NpYmxlICh3aXRoIGF1ZGlvIGRpc2FibGVkIHBlcmhhcHMpCisgKgkicmV2ZXJzZSIJcGxheSByZXZlcnNlCisgKgkic3BlZWQgPGZwcz4iCXBsYXkgd2l0aCBzcGVjaWZpZWQgZnJhbWVzIHBlciBzZWNvbmQKKyAqIFZpZGVvZGlzYzoKKyAqCSJzbG93IgkJcGxheSBzbG93CisgKgkiZmFzdCIJCXBsYXkgZmFzdCAKKyAqCSJzY2FuIgkJcGxheSBhcyBmYXN0IGFzIHBvc3NpYmxlICh3aXRoIGF1ZGlvIGRpc2FibGVkIHBlcmhhcHMpCisgKgkicmV2ZXJzZSIJcGxheSByZXZlcnNlCisgKgkic3BlZWQgPGZwcz4iCXBsYXkgd2l0aCBzcGVjaWZpZWQgZnJhbWVzIHBlciBzZWNvbmQKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfUGxheShfTUNJU1RSX1BST1RPXykgeworCWludAkJCWkscmVzLHRpbWVmLG5yYXJncyxqLGssYVs0XTsKKwljaGFyCQkJKnBhcnNlc3RyOworCXVuaW9uIHsKKwkJTUNJX1BMQVlfUEFSTVMJCXBsYXlQYXJhbXM7CisJCU1DSV9WRF9QTEFZX1BBUk1TCXZkcGxheVBhcmFtczsKKwkJTUNJX0FOSU1fUExBWV9QQVJNUwlhbmltcGxheVBhcmFtczsKKwl9IFU7CisKKwlyZXMgPSBfTUNJU1RSX2RldGVybWluZV90aW1lZm9ybWF0KGRldix3RGV2SUQsdURldlR5cCwmdGltZWYpOworCWlmIChyZXMpIHJldHVybiByZXM7CisJc3dpdGNoICh0aW1lZikgeworCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CisJY2FzZSBNQ0lfRk9STUFUX0ZSQU1FUzoKKwljYXNlIE1DSV9GT1JNQVRfQllURVM6CisJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6CisJCW5yYXJncz0xOworCQlwYXJzZXN0cj0iJWQiOworCQlicmVhazsKKwljYXNlIE1DSV9GT1JNQVRfSE1TOgorCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6CisJCXBhcnNlc3RyPSIlZDolZDolZCI7CisJCW5yYXJncz0zOworCQlicmVhazsKKwljYXNlIE1DSV9GT1JNQVRfVE1TRjoKKwkJcGFyc2VzdHI9IiVkOiVkOiVkOiVkIjsKKwkJbnJhcmdzPTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOlBMQVk6dW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CisJCXBhcnNlc3RyPSIlZCI7CisJCW5yYXJncz0xOworCQlicmVhazsKKwl9CisJVS5wbGF5UGFyYW1zLmR3Q2FsbGJhY2s9MDsKKwlpPTA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJ0byIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJZHdGbGFncyB8PSBNQ0lfVE87CisJCQlhWzBdPWFbMV09YVsyXT1hWzNdPTA7CisJCQlqPXNzY2FuZihrZXl3b3Jkc1tpKzFdLHBhcnNlc3RyLCZhWzBdLCZhWzFdLCZhWzJdLCZhWzNdKTsKKwkJCS8qIGFkZCB1cCBhbGwgaW50ZWdlcnMgd2UgZ290LCBpZiB3ZSBoYXZlIG1vcmUgCisJCQkgKiBzaGlmdCB0aGVtLiAoV2VsbCBJIHNob3VsZCB1c2UgdGhlIG1hY3JvcyBpbiAKKwkJCSAqIG1tc3lzdGVtLmgsIHJpZ2h0KS4KKwkJCSAqLworCQkJVS5wbGF5UGFyYW1zLmR3VG89MDsKKwkJCWZvciAoaz0wO2s8ajtrKyspCisJCQkJVS5wbGF5UGFyYW1zLmR3VG8rPWFba108PCg4KihucmFyZ3MtaykpOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJmcm9tIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQlkd0ZsYWdzIHw9IE1DSV9GUk9NOworCQkJYVswXT1hWzFdPWFbMl09YVszXT0wOworCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7CisJCQkvKiBkaXRvLiAqLworCQkJVS5wbGF5UGFyYW1zLmR3RnJvbT0wOworCQkJZm9yIChrPTA7azxqO2srKykKKwkJCQlVLnBsYXlQYXJhbXMuZHdGcm9tKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKKwkJCWkrPTI7CisJCQljb250aW51ZTsKKwkJfQorCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9WSURFT0RJU0M6CisJCQlGTEFHMSgic2xvdyIsTUNJX1ZEX1BMQVlfU0xPVyk7CisJCQlGTEFHMSgiZmFzdCIsTUNJX1ZEX1BMQVlfRkFTVCk7CisJCQlGTEFHMSgic2NhbiIsTUNJX1ZEX1BMQVlfU0NBTik7CisJCQlGTEFHMSgicmV2ZXJzZSIsTUNJX1ZEX1BMQVlfUkVWRVJTRSk7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwic3BlZWQiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9WRF9QTEFZX1NQRUVEOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoVS52ZHBsYXlQYXJhbXMuZHdTcGVlZCkpOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlGTEFHMSgic2xvdyIsTUNJX0FOSU1fUExBWV9TTE9XKTsKKwkJCUZMQUcxKCJmYXN0IixNQ0lfQU5JTV9QTEFZX0ZBU1QpOworCQkJRkxBRzEoInNjYW4iLE1DSV9BTklNX1BMQVlfU0NBTik7CisJCQlGTEFHMSgicmV2ZXJzZSIsTUNJX0FOSU1fUExBWV9SRVZFUlNFKTsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJzcGVlZCIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCWR3RmxhZ3MgfD0gTUNJX0FOSU1fUExBWV9TUEVFRDsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWxkIiwmKFUuYW5pbXBsYXlQYXJhbXMuZHdTcGVlZCkpOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1BMQVksVSk7CisJcmV0dXJuIHJlczsKK30KKworLyogc2VlayB0byBhIHNwZWNpZmllZCBwb3NpdGlvbgorICogQXJndW1lbnRzOgorICoJInRvIHN0YXJ0IglzZWVrIHRvIHN0YXJ0IG9mIG1lZGl1bQorICoJInRvIGVuZCIJc2VlayB0byBlbmQgb2YgbWVkaXVtCisgKiAJInRvIDx0aW1lPiIJc2VlayB0byA8dGltZT4gc3BlY2lmaWVkIGluIGN1cnJlbnQgdGltZWZvcm1hdAorICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9TZWVrKF9NQ0lTVFJfUFJPVE9fKSB7CisJaW50CQlpLHJlcyx0aW1lZixucmFyZ3MsaixrLGFbNF07CisJY2hhcgkJKnBhcnNlc3RyOworCU1DSV9TRUVLX1BBUk1TCXNlZWtQYXJhbXM7CisKKwlyZXMgPSBfTUNJU1RSX2RldGVybWluZV90aW1lZm9ybWF0KGRldix3RGV2SUQsdURldlR5cCwmdGltZWYpOworCWlmIChyZXMpIHJldHVybiByZXM7CisJc3dpdGNoICh0aW1lZikgeworCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6CisJY2FzZSBNQ0lfRk9STUFUX0ZSQU1FUzoKKwljYXNlIE1DSV9GT1JNQVRfQllURVM6CisJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6CisJCW5yYXJncz0xOworCQlwYXJzZXN0cj0iJWQiOworCQlicmVhazsKKwljYXNlIE1DSV9GT1JNQVRfSE1TOgorCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6CisJCXBhcnNlc3RyPSIlZDolZDolZCI7CisJCW5yYXJncz0zOworCQlicmVhazsKKwljYXNlIE1DSV9GT1JNQVRfVE1TRjoKKwkJcGFyc2VzdHI9IiVkOiVkOiVkOiVkIjsKKwkJbnJhcmdzPTQ7CisJCWJyZWFrOworCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOlNFRUs6dW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CisJCXBhcnNlc3RyPSIlZCI7CisJCW5yYXJncz0xOworCQlicmVhazsKKwl9CisJc2Vla1BhcmFtcy5kd0NhbGxiYWNrPTA7CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlpZiAoCSFTVFJDTVAoa2V5d29yZHNbaV0sInRvIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJzdGFydCIpKSB7CisJCQkJZHdGbGFnc3w9TUNJX1NFRUtfVE9fU1RBUlQ7CisJCQkJc2Vla1BhcmFtcy5kd1RvPTA7CisJCQkJaSs9MjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImVuZCIpKSB7CisJCQkJZHdGbGFnc3w9TUNJX1NFRUtfVE9fRU5EOworCQkJCXNlZWtQYXJhbXMuZHdUbz0wOworCQkJCWkrPTI7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkd0ZsYWdzfD1NQ0lfVE87CisJCQlpKz0yOworCQkJYVswXT1hWzFdPWFbMl09YVszXT0wOworCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7CisJCQlzZWVrUGFyYW1zLmR3VG89MDsKKwkJCWZvciAoaz0wO2s8ajtrKyspCisJCQkJc2Vla1BhcmFtcy5kd1RvKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX1ZJREVPRElTQzoKKwkJCUZMQUcxKCJyZXZlcnNlIixNQ0lfVkRfU0VFS19SRVZFUlNFKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfU0VFSyxzZWVrUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBjbG9zZSBtZWRpYS9kcml2ZXIgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX0Nsb3NlKF9NQ0lTVFJfUFJPVE9fKSB7CisJTUNJX0dFTkVSSUNfUEFSTVMJY2xvc2VQYXJhbXM7CisJaW50CQkJcmVzOworCisJX01DSV9DQUxMX0RSSVZFUihNQ0lfQ0xPU0UsY2xvc2VQYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKy8qIHJldHVybiBpbmZvcm1hdGlvbi4KKyAqIEFyZ3VtZW50czoKKyAqCSJwcm9kdWN0IglyZXR1cm4gcHJvZHVjdCBuYW1lIChodW1hbiByZWFkYWJsZSkKKyAqCSJmaWxlIgkJcmV0dXJuIGZpbGVuYW1lCisgKiBBbmltYXRpb246CisgKgkidGV4dCIJCXJldHVybnMgdGV4dD8KKyAqIE92ZXJsYXk6CisgKgkidGV4dCIJCXJldHVybnMgdGV4dD8KKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfSW5mbyhfTUNJU1RSX1BST1RPXykgeworCU1DSV9JTkZPX1BBUk1TCWluZm9QYXJhbXM7CisJRFdPUkQJCXNmbGFnczsKKwlpbnQJCWkscmVzOworCisJc2ZsYWdzID0gZHdGbGFnczsKKwlpPTA7d2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCUZMQUcxKCJwcm9kdWN0IixNQ0lfSU5GT19QUk9EVUNUKTsKKwkJRkxBRzEoImZpbGUiLE1DSV9JTkZPX0ZJTEUpOworCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlGTEFHMSgidGV4dCIsTUNJX0FOSU1fSU5GT19URVhUKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX09WRVJMQVk6CisJCQlGTEFHMSgidGV4dCIsTUNJX09WTFlfSU5GT19URVhUKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJaWYgKGR3RmxhZ3MgPT0gc2ZsYWdzKQorCQlyZXR1cm4gTUNJRVJSX01JU1NJTkdfU1RSSU5HX0FSR1VNRU5UOworCS8qIE1DSSBkcml2ZXIgd2lsbCBmaWxsIGluIGxwc3RyUmV0dXJuLCBkd1JldFNpemUuCisJICogRklYTUU6IEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIGNvcnJlY3QgYmVoYXZpb3VyCisJICovCisJX01DSV9DQUxMX0RSSVZFUihNQ0lfSU5GTyxpbmZvUGFyYW1zKTsKKwlpZiAocmVzPT0wKQorCQlfTUNJX1NUUihpbmZvUGFyYW1zLmxwc3RyUmV0dXJuKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBxdWVyeSBNQ0kgZHJpdmVyIGl0c2VsZiBmb3IgaW5mb3JtYXRpb24KKyAqIEFyZ3VtZW50czoKKyAqCSJpbnN0YWxsbmFtZSIJcmV0dXJuIGluc3RhbGwgbmFtZSBvZiA8ZGV2aWNlPiAoc3lzdGVtLmluaSkKKyAqCSJxdWFudGl0eSIJcmV0dXJuIG5yIG9mIGluc3RhbGxlZCBkcml2ZXJzCisgKgkib3BlbiIJCW9wZW4gZHJpdmVycyBvbmx5IChhZGRpdGlvbmFsIGZsYWcpCisgKgkibmFtZSA8bnI+IglyZXR1cm4gbnIgb2YgZGV2aWNlcyB3aXRoIDxkZXZpY2V0eXA+CisgKgkibmFtZSBhbGwiCXJldHVybiBuciBvZiBhbGwgZGV2aWNlcworICoKKyAqIEZJWE1FOiBtY2lTeXNJbmZvKCkgaXMgYnJva2VuIEkgdGhpbmsuCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX1N5c2luZm8oX01DSVNUUl9QUk9UT18pIHsKKwlNQ0lfU1lTSU5GT19QQVJNUwlzeXNpbmZvUGFyYW1zOworCWludAkJCWkscmVzOworCisJc3lzaW5mb1BhcmFtcy5scHN0clJldHVybgk9IGxwc3RyUmV0dXJuU3RyaW5nOworCXN5c2luZm9QYXJhbXMuZHdSZXRTaXplCQk9IHVSZXR1cm5MZW5ndGg7CisJc3lzaW5mb1BhcmFtcy53RGV2aWNlVHlwZQk9IHVEZXZUeXA7CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlGTEFHMSgiaW5zdGFsbG5hbWUiLE1DSV9TWVNJTkZPX0lOU1RBTExOQU1FKTsKKwkJRkxBRzEoInF1YW50aXR5IixNQ0lfU1lTSU5GT19JTlNUQUxMTkFNRSk7CisJCUZMQUcxKCJvcGVuIixNQ0lfU1lTSU5GT19PUEVOKTsKKwkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sIm5hbWUiKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoc3lzaW5mb1BhcmFtcy5kd051bWJlcikpOworCQkJZHdGbGFncyB8PSBNQ0lfU1lTSU5GT19OQU1FOworCQkJaSs9MjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWkrKzsKKwl9CisJcmVzPW1jaVN5c0luZm8oZHdGbGFncywmc3lzaW5mb1BhcmFtcyk7CisJaWYgKGR3RmxhZ3MgJiBNQ0lfU1lTSU5GT19RVUFOVElUWSkgeworCQljaGFyCWJ1ZlsxMDBdOworCisJCXNwcmludGYoYnVmLCIlbGQiLCoobG9uZyopUFRSX1NFR19UT19MSU4obHBzdHJSZXR1cm5TdHJpbmcpKTsKKwkJX01DSV9TVFIoYnVmKTsKKwl9CisJLyogbm8gbmVlZCB0byBjb3B5IGFueXRoaW5nIGJhY2ssIG1jaVN5c0luZm8gZGlkIGl0IGZvciB1cyAqLworCXJldHVybiByZXM7Cit9CisKKy8qIGxvYWQgZmlsZQorICogQXJndW1lbnQ6ICI8ZmlsZW5hbWU+IgorICogT3ZlcmxheTogImF0IDxsZWZ0PiA8dG9wPiA8cmlnaHQ+IDxib3R0b20+IiBhZGRpdGlvbmFsCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX0xvYWQoX01DSVNUUl9QUk9UT18pIHsKKwl1bmlvbiB7CisJCU1DSV9MT0FEX1BBUk1TCWxvYWRQYXJhbXM7CisJCU1DSV9PVkxZX0xPQURfUEFSTVMJb3ZseWxvYWRQYXJhbXM7CisJfSBVOworCWludAkJaSxsZW4scmVzOworCWNoYXIJCSpzOworCUhBTkRMRQkJeDsKKworCWk9MDtsZW49MDsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJc3dpdGNoICh1RGV2VHlwKSB7CisJCWNhc2UgTUNJX0RFVlRZUEVfT1ZFUkxBWToKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJhdCIpICYmIChpKzQ8bnJvZmtleXdvcmRzKSkgeworCQkJCWR3RmxhZ3MgfD0gTUNJX09WTFlfUkVDVDsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWQiLCYoVS5vdmx5bG9hZFBhcmFtcy5yYy5sZWZ0KSk7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krMl0sIiVkIiwmKFUub3ZseWxvYWRQYXJhbXMucmMudG9wKSk7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krM10sIiVkIiwmKFUub3ZseWxvYWRQYXJhbXMucmMucmlnaHQpKTsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSs0XSwiJWQiLCYoVS5vdmx5bG9hZFBhcmFtcy5yYy5ib3R0b20pKTsKKwkJCQltZW1jcHkoa2V5d29yZHMraSxrZXl3b3JkcysoaSs1KSxucm9ma2V5d29yZHMtKGkrNSkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJbGVuKz1zdHJsZW4oa2V5d29yZHNbaV0pKzE7CisJCWkrKzsKKwl9CisJcz0oY2hhciopbWFsbG9jKGxlbik7CisJKnM9J1wwJzsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJc3RyY2F0KHMsa2V5d29yZHNbaV0pOworCQlpKys7CisJCWlmIChpPG5yb2ZrZXl3b3Jkcykgc3RyY2F0KHMsIiAiKTsKKwl9CisJLyogRklYTUU6IG1lc3N5LCBidXQgSSBzdHJvbmdseSBzdXNwZWN0IHdlIGhhdmUgdG8gdXNlIGEgCisJICogc2VnbWVudGVkIHBvaW50ZXIsIHNvIEkgYW0gZG9pbmcgdGhhdAorCSAqLworCXg9VVNFUl9IRUFQX0FMTE9DKGxlbik7CisJVS5sb2FkUGFyYW1zLmxwZmlsZW5hbWU9KExQU1RSKU1BS0VMT05HKHgsVVNFUl9IZWFwU2VsKTsKKwlzdHJjcHkoUFRSX1NFR19UT19MSU4oVS5sb2FkUGFyYW1zLmxwZmlsZW5hbWUpLHMpOworCWZyZWUocyk7CisJZHdGbGFncyB8PSBNQ0lfTE9BRF9GSUxFOworCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX0xPQUQsVSk7CisJVVNFUl9IRUFQX0ZSRUUoeCk7CisJcmV0dXJuIHJlczsKK30KKworLyogc2F2ZSB0byBmaWxlCisgKiBBcmd1bWVudDogIjxmaWxlbmFtZT4iCisgKiBPdmVybGF5OiAiYXQgPGxlZnQ+IDx0b3A+IDxyaWdodD4gPGJvdHRvbT4iIGFkZGl0aW9uYWwKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfU2F2ZShfTUNJU1RSX1BST1RPXykgeworCXVuaW9uIHsKKwkJTUNJX1NBVkVfUEFSTVMJc2F2ZVBhcmFtczsKKwkJTUNJX09WTFlfU0FWRV9QQVJNUwlvdmx5c2F2ZVBhcmFtczsKKwl9IFU7CisJaW50CQlpLGxlbixyZXM7CisJY2hhcgkJKnM7CisJSEFORExFCQl4OworCisJaT0wO2xlbj0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9PVkVSTEFZOgorCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sImF0IikgJiYgKGkrNDxucm9ma2V5d29yZHMpKSB7CisJCQkJZHdGbGFncyB8PSBNQ0lfT1ZMWV9SRUNUOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlZCIsJihVLm92bHlzYXZlUGFyYW1zLnJjLmxlZnQpKTsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSsyXSwiJWQiLCYoVS5vdmx5c2F2ZVBhcmFtcy5yYy50b3ApKTsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSszXSwiJWQiLCYoVS5vdmx5c2F2ZVBhcmFtcy5yYy5yaWdodCkpOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzRdLCIlZCIsJihVLm92bHlzYXZlUGFyYW1zLnJjLmJvdHRvbSkpOworCQkJCW1lbWNweShrZXl3b3JkcytpLGtleXdvcmRzKyhpKzUpLG5yb2ZrZXl3b3Jkcy0oaSs1KSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlsZW4rPXN0cmxlbihrZXl3b3Jkc1tpXSkrMTsKKwkJaSsrOworCX0KKwlzPShjaGFyKiltYWxsb2MobGVuKTsKKwkqcz0nXDAnOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlzdHJjYXQocyxrZXl3b3Jkc1tpXSk7CisJCWkrKzsKKwkJaWYgKGk8bnJvZmtleXdvcmRzKSBzdHJjYXQocywiICIpOworCX0KKwkvKiBGSVhNRTogbWVzc3ksIGJ1dCBJIHN0cm9uZ2x5IHN1c3BlY3Qgd2UgaGF2ZSB0byB1c2UgYSAKKwkgKiBzZWdtZW50ZWQgcG9pbnRlciwgc28gSSBhbSBkb2luZyB0aGF0CisJICovCisJeD1VU0VSX0hFQVBfQUxMT0MobGVuKTsKKwlVLnNhdmVQYXJhbXMubHBmaWxlbmFtZT0oTFBTVFIpTUFLRUxPTkcoeCxVU0VSX0hlYXBTZWwpOworCXN0cmNweShQVFJfU0VHX1RPX0xJTihVLnNhdmVQYXJhbXMubHBmaWxlbmFtZSkscyk7CisJZnJlZShzKTsKKwlkd0ZsYWdzIHw9IE1DSV9MT0FEX0ZJTEU7CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfU0FWRSxVKTsKKwlVU0VSX0hFQVBfRlJFRSh4KTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBwcmVwYXJlIGRldmljZSBmb3IgaW5wdXQvb3V0cHV0CisgKiAob25seSBhcHBseWFibGUgdG8gd2F2ZWZvcm0gYXVkaW8pCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX0N1ZShfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRU5FUklDX1BBUk1TCWN1ZVBhcmFtczsKKwlpbnQJCQlpLHJlczsKKworCWk9MDsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJc3dpdGNoICh1RGV2VHlwKSB7CisJCWNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86CisJCQlGTEFHMSgiaW5wdXQiLE1DSV9XQVZFX0lOUFVUKTsKKwkJCUZMQUcxKCJvdXRwdXQiLE1DSV9XQVZFX09VVFBVVCk7CisJCQlicmVhazsKKwkJfQorCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX0NVRSxjdWVQYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKy8qIGRlbGV0ZSBpbmZvcm1hdGlvbiAqLworc3RhdGljIERXT1JECitNQ0lTVFJfRGVsZXRlKF9NQ0lTVFJfUFJPVE9fKSB7CisJaW50CXRpbWVmLG5yYXJncyxpLGosayxhWzRdLHJlczsKKwljaGFyCSpwYXJzZXN0cjsKKwlNQ0lfV0FWRV9ERUxFVEVfUEFSTVMJZGVsZXRlUGFyYW1zOworCisJLyogb25seSBpbXBsZW1lbnRlZCBmb3Igd2F2ZWZvcm0gYXVkaW8gKi8KKwlpZiAodURldlR5cCAhPSBNQ0lfREVWVFlQRV9XQVZFRk9STV9BVURJTykKKwkJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsgLyogd2VsbCBpdCBmaXRzICovCisJcmVzID0gX01DSVNUUl9kZXRlcm1pbmVfdGltZWZvcm1hdChkZXYsd0RldklELHVEZXZUeXAsJnRpbWVmKTsKKwlpZiAocmVzKSByZXR1cm4gcmVzOworCXN3aXRjaCAodGltZWYpIHsKKwljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgorCWNhc2UgTUNJX0ZPUk1BVF9GUkFNRVM6CisJY2FzZSBNQ0lfRk9STUFUX0JZVEVTOgorCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgorCQlucmFyZ3M9MTsKKwkJcGFyc2VzdHI9IiVkIjsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfRk9STUFUX0hNUzoKKwljYXNlIE1DSV9GT1JNQVRfTVNGOgorCQlwYXJzZXN0cj0iJWQ6JWQ6JWQiOworCQlucmFyZ3M9MzsKKwkJYnJlYWs7CisJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6CisJCXBhcnNlc3RyPSIlZDolZDolZDolZCI7CisJCW5yYXJncz00OworCQlicmVhazsKKwlkZWZhdWx0OmZwcmludGYoc3RkbmltcCwibWNpU2VuZFN0cmluZzpERUxFVEU6dW5rbm93biB0aW1lZm9ybWF0ICVkLCBwbGVhc2UgcmVwb3J0LlxuIix0aW1lZik7CisJCXBhcnNlc3RyPSIlZCI7CisJCW5yYXJncz0xOworCQlicmVhazsKKwl9CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwidG8iKSAmJiAoaSsxPG5yb2ZrZXl3b3JkcykpIHsKKwkJCWR3RmxhZ3MgfD0gTUNJX1RPOworCQkJYVswXT1hWzFdPWFbMl09YVszXT0wOworCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7CisJCQkvKiBhZGQgdXAgYWxsIGludGVnZXJzIHdlIGdvdCwgaWYgd2UgaGF2ZSBtb3JlIAorCQkJICogc2hpZnQgdGhlbS4gKFdlbGwgSSBzaG91bGQgdXNlIHRoZSBtYWNyb3MgaW4gCisJCQkgKiBtbXN5c3RlbS5oLCByaWdodCkuCisJCQkgKi8KKwkJCWRlbGV0ZVBhcmFtcy5kd1RvPTA7CisJCQlmb3IgKGs9MDtrPGo7aysrKQorCQkJCWRlbGV0ZVBhcmFtcy5kd1RvKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKKwkJCWkrPTI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiZnJvbSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJZHdGbGFncyB8PSBNQ0lfRlJPTTsKKwkJCWFbMF09YVsxXT1hWzJdPWFbM109MDsKKwkJCWo9c3NjYW5mKGtleXdvcmRzW2krMV0scGFyc2VzdHIsJmFbMF0sJmFbMV0sJmFbMl0sJmFbM10pOworCQkJLyogZGl0by4gKi8KKwkJCWRlbGV0ZVBhcmFtcy5kd0Zyb209MDsKKwkJCWZvciAoaz0wO2s8ajtrKyspCisJCQkJZGVsZXRlUGFyYW1zLmR3RnJvbSs9YVtrXTw8KDgqKG5yYXJncy1rKSk7CisJCQlpKz0yOworCQkJY29udGludWU7CisJCX0KKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9ERUxFVEUsZGVsZXRlUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBzZW5kIGNvbW1hbmQgdG8gZGV2aWNlLiBvbmx5IGFwcGxpZXMgdG8gdmlkZW9kaXNjICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9Fc2NhcGUoX01DSVNUUl9QUk9UT18pIHsKKwlNQ0lfVkRfRVNDQVBFX1BBUk1TCWVzY2FwZVBhcmFtczsKKwlpbnQJCQlpLGxlbixyZXM7CisJY2hhcgkJKnM7CisJSEFORExFCQl4OworCisJaWYgKHVEZXZUeXAgIT0gTUNJX0RFVlRZUEVfVklERU9ESVNDKQorCQlyZXR1cm4gTUNJRVJSX1VOU1VQUE9SVEVEX0ZVTkNUSU9OOworCWk9MDtsZW49MDsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJbGVuKz1zdHJsZW4oa2V5d29yZHNbaV0pKzE7CisJCWkrKzsKKwl9CisJcz0oY2hhciopbWFsbG9jKGxlbik7CisJKnM9J1wwJzsKKwl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKKwkJc3RyY2F0KHMsa2V5d29yZHNbaV0pOworCQlpKys7CisJCWlmIChpPG5yb2ZrZXl3b3Jkcykgc3RyY2F0KHMsIiAiKTsKKwl9CisJLyogRklYTUU6IG1lc3N5LCBidXQgSSBzdHJvbmdseSBzdXNwZWN0IHdlIGhhdmUgdG8gdXNlIGEgCisJICogc2VnbWVudGVkIHBvaW50ZXIsIHNvIEkgYW0gZG9pbmcgdGhhdAorCSAqLworCXg9VVNFUl9IRUFQX0FMTE9DKGxlbik7CisJZXNjYXBlUGFyYW1zLmxwc3RyQ29tbWFuZD0oTFBTVFIpTUFLRUxPTkcoeCxVU0VSX0hlYXBTZWwpOworCXN0cmNweShQVFJfU0VHX1RPX0xJTihlc2NhcGVQYXJhbXMubHBzdHJDb21tYW5kKSxzKTsKKwlmcmVlKHMpOworCWR3RmxhZ3MgfD0gTUNJX1ZEX0VTQ0FQRV9TVFJJTkc7CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfRVNDQVBFLGVzY2FwZVBhcmFtcyk7CisJVVNFUl9IRUFQX0ZSRUUoeCk7CisJcmV0dXJuIHJlczsKK30KKworLyogdW5mcmVlemUgW3BhcnQgb2ZdIHRoZSBvdmVybGF5ZWQgdmlkZW8gCisgKiBvbmx5IGFwcGx5YWJsZSB0byBPdmVybGF5IGRldmljZXMKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfVW5mcmVlemUoX01DSVNUUl9QUk9UT18pIHsKKwlNQ0lfT1ZMWV9SRUNUX1BBUk1TCXVuZnJlZXplUGFyYW1zOworCWludAkJCWkscmVzOworCisJaWYgKHVEZXZUeXAgIT0gTUNJX0RFVlRZUEVfT1ZFUkxBWSkKKwkJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwlpPTA7d2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJhdCIpICYmIChpKzQ8bnJvZmtleXdvcmRzKSkgeworCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJih1bmZyZWV6ZVBhcmFtcy5yYy5sZWZ0KSk7CisJCQlzc2NhbmYoa2V5d29yZHNbaSsyXSwiJWxkIiwmKHVuZnJlZXplUGFyYW1zLnJjLnRvcCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krM10sIiVsZCIsJih1bmZyZWV6ZVBhcmFtcy5yYy5yaWdodCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krNF0sIiVsZCIsJih1bmZyZWV6ZVBhcmFtcy5yYy5ib3R0b20pKTsKKwkJCWR3RmxhZ3MgfD0gTUNJX09WTFlfUkVDVDsKKwkJCWkrPTU7CisJCQljb250aW51ZTsKKwkJfQorCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1VORlJFRVpFLHVuZnJlZXplUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorLyogZnJlZXplIFtwYXJ0IG9mXSB0aGUgb3ZlcmxheWVkIHZpZGVvIAorICogb25seSBhcHBseWFibGUgdG8gT3ZlcmxheSBkZXZpY2VzCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX0ZyZWV6ZShfTUNJU1RSX1BST1RPXykgeworCU1DSV9PVkxZX1JFQ1RfUEFSTVMJZnJlZXplUGFyYW1zOworCWludAkJCWkscmVzOworCisJaWYgKHVEZXZUeXAgIT0gTUNJX0RFVlRZUEVfT1ZFUkxBWSkKKwkJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwlpPTA7d2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJhdCIpICYmIChpKzQ8bnJvZmtleXdvcmRzKSkgeworCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJihmcmVlemVQYXJhbXMucmMubGVmdCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krMl0sIiVsZCIsJihmcmVlemVQYXJhbXMucmMudG9wKSk7CisJCQlzc2NhbmYoa2V5d29yZHNbaSszXSwiJWxkIiwmKGZyZWV6ZVBhcmFtcy5yYy5yaWdodCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krNF0sIiVsZCIsJihmcmVlemVQYXJhbXMucmMuYm90dG9tKSk7CisJCQlkd0ZsYWdzIHw9IE1DSV9PVkxZX1JFQ1Q7CisJCQlpKz01OworCQkJY29udGludWU7CisJCX0KKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9GUkVFWkUsZnJlZXplUGFyYW1zKTsKKwlyZXR1cm4gcmVzOworfQorCisvKiBjb3B5IHBhcnRzIG9mIGltYWdlIHRvIHNvbWV3aGVyZSBlbHNlIAorICogInNvdXJjZSBbYXQgPGxlZnQ+IDx0b3A+IDxyaWdodD4gPGJvdHRvbT5dIglzb3VyY2UgaXMgZnJhbWVidWZmZXIgW29yIHJlY3RdCisgKiAiZGVzdGluYXRpb24gW2F0IDxsZWZ0PiA8dG9wPiA8cmlnaHQ+IDxib3R0b20+XSIJZGVzdGluYXRpb24gaXMgZnJhbWVidWZmZXIgW29yIHJlY3RdCisgKiBPdmVybGF5OgorICogImZyYW1lIFthdCA8bGVmdD4gPHRvcD4gPHJpZ2h0PiA8Ym90dG9tPl0iCWZyYW1lIGlzIGZyYW1lYnVmZmVyIFtvciByZWN0XQorICogCQkJCQkJd2hlcmUgdGhlIHZpZGVvIGlucHV0IGlzIHBsYWNlZAorICogInZpZGVvIFthdCA8bGVmdD4gPHRvcD4gPHJpZ2h0PiA8Ym90dG9tPl0iCXZpZGVvIGlzIHdob2xlIHZpZGVvIFtvciByZWN0XQorICoJCQkJCQkoZGVmaW5pbmcgcGFydCBvZiBpbnB1dCB0bworICoJCQkJCQliZSBkaXNwbGF5ZWQpCisgKgorICogRklYTUU6IFRoaXMgd2hvbGUganVuayBpcyBwYXNzaW5nIG11bHRpcGxlIHJlY3RhbmdsZXMuCisgKglJIGRvbid0IGtub3cgaG93IHRvIGRvIHRoYXQgd2l0aCB0aGUgcHJlc2VudCBpbnRlcmZhY2UuCisgKgkoTWVhbnMgY29kZSBiZWxvdyBpcyBicm9rZW4pCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX1B1dChfTUNJU1RSX1BST1RPXykgeworCXVuaW9uIHsKKwkJTUNJX09WTFlfUkVDVF9QQVJNUwlvdmx5cHV0UGFyYW1zOworCQlNQ0lfQU5JTV9SRUNUX1BBUk1TCWFuaW1wdXRQYXJhbXM7CisJfSBVOworCWludAlpLHJlczsKKwlpPTA7d2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwkJCUZMQUcxKCJzb3VyY2UiLE1DSV9BTklNX1BVVF9TT1VSQ0UpOworCQkJRkxBRzEoImRlc3RpbmF0aW9uIixNQ0lfQU5JTV9QVVRfREVTVElOQVRJT04pOworCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sImF0IikgJiYgKGkrNDxucm9ma2V5d29yZHMpKSB7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJihVLmFuaW1wdXRQYXJhbXMucmMubGVmdCkpOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzJdLCIlbGQiLCYoVS5hbmltcHV0UGFyYW1zLnJjLnRvcCkpOworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzNdLCIlbGQiLCYoVS5hbmltcHV0UGFyYW1zLnJjLnJpZ2h0KSk7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krNF0sIiVsZCIsJihVLmFuaW1wdXRQYXJhbXMucmMuYm90dG9tKSk7CisJCQkJZHdGbGFncyB8PSBNQ0lfQU5JTV9SRUNUOworCQkJCWkrPTU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBNQ0lfREVWVFlQRV9PVkVSTEFZOgorCQkJRkxBRzEoInNvdXJjZSIsTUNJX09WTFlfUFVUX1NPVVJDRSk7CisJCQlGTEFHMSgiZGVzdGluYXRpb24iLE1DSV9PVkxZX1BVVF9ERVNUSU5BVElPTik7CisJCQlGTEFHMSgidmlkZW8iLE1DSV9PVkxZX1BVVF9WSURFTyk7CisJCQlGTEFHMSgiZnJhbWUiLE1DSV9PVkxZX1BVVF9GUkFNRSk7CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwiYXQiKSAmJiAoaSs0PG5yb2ZrZXl3b3JkcykpIHsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSsxXSwiJWxkIiwmKFUub3ZseXB1dFBhcmFtcy5yYy5sZWZ0KSk7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krMl0sIiVsZCIsJihVLm92bHlwdXRQYXJhbXMucmMudG9wKSk7CisJCQkJc3NjYW5mKGtleXdvcmRzW2krM10sIiVsZCIsJihVLm92bHlwdXRQYXJhbXMucmMucmlnaHQpKTsKKwkJCQlzc2NhbmYoa2V5d29yZHNbaSs0XSwiJWxkIiwmKFUub3ZseXB1dFBhcmFtcy5yYy5ib3R0b20pKTsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9PVkxZX1JFQ1Q7CisJCQkJaSs9NTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfUFVULFUpOworCXJldHVybiByZXM7Cit9CisKKy8qIHBhbGV0dGUgYmVoYXZpb3VyIGNoYW5naW5nCisgKiAoQW5pbWF0aW9uIG9ubHkpCisgKiAJIm5vcm1hbCIJcmVhbGl6ZSB0aGUgcGFsZXR0ZSBub3JtYWxseQorICogCSJiYWNrZ3JvdW5kIglyZWFsaXplIHRoZSBwYWxldHRlIGFzIGJhY2tncm91bmQgcGFsZXR0ZQorICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9SZWFsaXplKF9NQ0lTVFJfUFJPVE9fKSB7CisJTUNJX0dFTkVSSUNfUEFSTVMJcmVhbGl6ZVBhcmFtczsKKwlpbnQJCQlpLHJlczsKKworCWlmICh1RGV2VHlwICE9IE1DSV9ERVZUWVBFX0FOSU1BVElPTikKKwkJcmV0dXJuIE1DSUVSUl9VTlNVUFBPUlRFRF9GVU5DVElPTjsKKwlpPTA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCUZMQUcxKCJiYWNrZ3JvdW5kIixNQ0lfQU5JTV9SRUFMSVpFX0JLR0QpOworCQlGTEFHMSgibm9ybWFsIixNQ0lfQU5JTV9SRUFMSVpFX05PUk0pOworCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1JFQUxJWkUscmVhbGl6ZVBhcmFtcyk7CisJcmV0dXJuIHJlczsKK30KKworLyogdmlkZW9kaXNjIHNwaW5uaW5nCisgKgkidXAiCisgKgkiZG93biIKKyAqLworc3RhdGljIERXT1JECitNQ0lTVFJfU3BpbihfTUNJU1RSX1BST1RPXykgeworCU1DSV9HRU5FUklDX1BBUk1TCXNwaW5QYXJhbXM7CisJaW50CQkJaSxyZXM7CisKKwlpZiAodURldlR5cCAhPSBNQ0lfREVWVFlQRV9WSURFT0RJU0MpCisJCXJldHVybiBNQ0lFUlJfVU5TVVBQT1JURURfRlVOQ1RJT047CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlGTEFHMSgidXAiLE1DSV9WRF9TUElOX1VQKTsKKwkJRkxBRzEoImRvd24iLE1DSV9WRF9TUElOX1VQKTsKKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9TUElOLHNwaW5QYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKy8qIHN0ZXAgc2luZ2xlIGZyYW1lcworICogCSJyZXZlcnNlIglvcHRpb25hbCBmbGFnCisgKgkiYnkgPG5yPiIJZm9yIDxucj4gZnJhbWVzCisgKi8KK3N0YXRpYyBEV09SRAorTUNJU1RSX1N0ZXAoX01DSVNUUl9QUk9UT18pIHsKKwl1bmlvbgl7CisJCU1DSV9BTklNX1NURVBfUEFSTVMJYW5pbXN0ZXBQYXJhbXM7CisJCU1DSV9WRF9TVEVQX1BBUk1TCXZkc3RlcFBhcmFtczsKKwl9IFU7CisJaW50CWkscmVzOworCisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlGTEFHMSgicmV2ZXJzZSIsTUNJX0FOSU1fU1RFUF9SRVZFUlNFKTsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJieSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoVS5hbmltc3RlcFBhcmFtcy5kd0ZyYW1lcykpOworCQkJCWR3RmxhZ3MgfD0gTUNJX0FOSU1fU1RFUF9GUkFNRVM7CisJCQkJaSs9MjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX1ZJREVPRElTQzoKKwkJCUZMQUcxKCJyZXZlcnNlIixNQ0lfVkRfU1RFUF9SRVZFUlNFKTsKKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJieSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCXNzY2FuZihrZXl3b3Jkc1tpKzFdLCIlbGQiLCYoVS52ZHN0ZXBQYXJhbXMuZHdGcmFtZXMpKTsKKwkJCQlkd0ZsYWdzIHw9IE1DSV9WRF9TVEVQX0ZSQU1FUzsKKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVEVQLFUpOworCXJldHVybiByZXM7Cit9CisKKy8qIHVwZGF0ZSBhbmltYXRpb24gd2luZG93CisgKiBBcmd1bWVudHM6CisgKgkiYXQgPGxlZnQ+IDx0b3A+IDxyaWdodD4gPGJvdHRvbT4iIG9ubHkgaW4gdGhpcyByZWN0YW5nbGUKKyAqCSJoZGMiCQlkZXZpY2UgY29udGV4dAorICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9VcGRhdGUoX01DSVNUUl9QUk9UT18pIHsKKwlpbnQJCWkscmVzOworCU1DSV9BTklNX1VQREFURV9QQVJNUwl1cGRhdGVQYXJhbXM7CisKKwlpPTA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJhdCIpICYmIChpKzQ8bnJvZmtleXdvcmRzKSkgeworCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVsZCIsJih1cGRhdGVQYXJhbXMucmMubGVmdCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krMl0sIiVsZCIsJih1cGRhdGVQYXJhbXMucmMudG9wKSk7CisJCQlzc2NhbmYoa2V5d29yZHNbaSszXSwiJWxkIiwmKHVwZGF0ZVBhcmFtcy5yYy5yaWdodCkpOworCQkJc3NjYW5mKGtleXdvcmRzW2krNF0sIiVsZCIsJih1cGRhdGVQYXJhbXMucmMuYm90dG9tKSk7CisJCQlkd0ZsYWdzIHw9IE1DSV9BTklNX1JFQ1Q7CisJCQlpKz01OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaV0sImhkYyIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJZHdGbGFncyB8PSBNQ0lfQU5JTV9VUERBVEVfSERDOworCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVkIiwmKHVwZGF0ZVBhcmFtcy5oREMpKTsKKwkJCWkrPTI7CisJCQljb250aW51ZTsKKwkJfQorCQlpKys7CisJfQorCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1VQREFURSx1cGRhdGVQYXJhbXMpOworCXJldHVybiByZXM7Cit9CisKKy8qIHdoZXJlIGNvbW1hbmQgZm9yIGFuaW1hdGlvbiBhbmQgb3ZlcmxheSBkcml2ZXJzLgorICoganVzdCByZXR1cm5zIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGFzIGEgc3RyaW5nCisgKiBBcmd1bWVudHM6CisgKgkic291cmNlIgorICoJImRlc3RpbmF0aW9uIgorICogT3ZlcmxheSBzcGVjaWFsOgorICoJInZpZGVvIgorICoJImZyYW1lIgorICovCitzdGF0aWMgRFdPUkQKK01DSVNUUl9XaGVyZShfTUNJU1RSX1BST1RPXykgeworCXVuaW9uIHsKKwkJTUNJX0FOSU1fUkVDVF9QQVJNUwlhbmltd2hlcmVQYXJhbXM7CisJCU1DSV9PVkxZX1JFQ1RfUEFSTVMJb3ZseXdoZXJlUGFyYW1zOworCX0gVTsKKwlpbnQJaSxyZXM7CisKKwlpPTA7CisJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwkJCUZMQUcxKCJzb3VyY2UiLE1DSV9BTklNX1dIRVJFX1NPVVJDRSk7CisJCQlGTEFHMSgiZGVzdGluYXRpb24iLE1DSV9BTklNX1dIRVJFX0RFU1RJTkFUSU9OKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX09WRVJMQVk6CisJCQlGTEFHMSgic291cmNlIixNQ0lfT1ZMWV9XSEVSRV9TT1VSQ0UpOworCQkJRkxBRzEoImRlc3RpbmF0aW9uIixNQ0lfT1ZMWV9XSEVSRV9ERVNUSU5BVElPTik7CisJCQlGTEFHMSgidmlkZW8iLE1DSV9PVkxZX1dIRVJFX1ZJREVPKTsKKwkJCUZMQUcxKCJmcmFtZSIsTUNJX09WTFlfV0hFUkVfRlJBTUUpOworCQkJYnJlYWs7CisJCX0KKwkJaSsrOworCX0KKwlfTUNJX0NBTExfRFJJVkVSKE1DSV9XSEVSRSxVKTsKKwlpZiAocmVzPT0wKSB7CisJCWNoYXIJYnVmWzEwMF07CisJCXN3aXRjaCAodURldlR5cCkgeworCQljYXNlIE1DSV9ERVZUWVBFX0FOSU1BVElPTjoKKwkJCXNwcmludGYoYnVmLCIlZCAlZCAlZCAlZCIsCisJCQkJVS5hbmltd2hlcmVQYXJhbXMucmMubGVmdCwKKwkJCQlVLmFuaW13aGVyZVBhcmFtcy5yYy50b3AsCisJCQkJVS5hbmltd2hlcmVQYXJhbXMucmMucmlnaHQsCisJCQkJVS5hbmltd2hlcmVQYXJhbXMucmMuYm90dG9tCisJCQkpOworCQkJYnJlYWs7CisJCWNhc2UgTUNJX0RFVlRZUEVfT1ZFUkxBWToKKwkJCXNwcmludGYoYnVmLCIlZCAlZCAlZCAlZCIsCisJCQkJVS5vdmx5d2hlcmVQYXJhbXMucmMubGVmdCwKKwkJCQlVLm92bHl3aGVyZVBhcmFtcy5yYy50b3AsCisJCQkJVS5vdmx5d2hlcmVQYXJhbXMucmMucmlnaHQsCisJCQkJVS5vdmx5d2hlcmVQYXJhbXMucmMuYm90dG9tCisJCQkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6c3RyY3B5KGJ1ZiwiMCAwIDAgMCIpO2JyZWFrOworCQl9CisJCV9NQ0lfU1RSKGJ1Zik7CisJfQorCXJldHVybglyZXM7Cit9CisKK3N0YXRpYyBEV09SRAorTUNJU1RSX1dpbmRvdyhfTUNJU1RSX1BST1RPXykgeworCWludAlpLHJlczsKKwljaGFyCSpzOworCXVuaW9uIAl7CisJCU1DSV9BTklNX1dJTkRPV19QQVJNUwlhbmltd2luZG93UGFyYW1zOworCQlNQ0lfT1ZMWV9XSU5ET1dfUEFSTVMJb3ZseXdpbmRvd1BhcmFtczsKKwl9IFU7CisKKwlzPU5VTEw7CisJaT0wOworCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgeworCQlzd2l0Y2ggKHVEZXZUeXApIHsKKwkJY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwiaGFuZGxlIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQkJZHdGbGFncyB8PSBNQ0lfQU5JTV9XSU5ET1dfSFdORDsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJkZWZhdWx0IikpIAorCQkJCQlVLmFuaW13aW5kb3dQYXJhbXMuaFduZCA9IE1DSV9PVkxZX1dJTkRPV19ERUZBVUxUOworCQkJCWVsc2UKKwkJCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVkIiwmKFUuYW5pbXdpbmRvd1BhcmFtcy5oV25kKSk7CisJCQkJaSs9MjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJzdGF0ZSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCWR3RmxhZ3MgfD0gTUNJX0FOSU1fV0lORE9XX1NUQVRFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImhpZGUiKSkKKwkJCQkJVS5hbmltd2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfSElERTsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJpY29uaWMiKSkKKwkJCQkJVS5hbmltd2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV01JTk5PQUNUSVZFOyAvKiBjb3JyZWN0PyAqLworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1pbmltaXplZCIpKQorCQkJCQlVLmFuaW13aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XTUlOSU1JWkVEOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1heGltaXplZCIpKQorCQkJCQlVLmFuaW13aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XTUFYSU1JWkVEOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1pbmltaXplIikpCisJCQkJCVUuYW5pbXdpbmRvd1BhcmFtcy5uQ21kU2hvdyA9IFNXX01JTklNSVpFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm5vcm1hbCIpKQorCQkJCQlVLmFuaW13aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19OT1JNQUw7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwic2hvdyIpKQorCQkJCQlVLmFuaW13aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm5vIikgJiYgKGkrMjxucm9ma2V5d29yZHMpKSB7CisJCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sImFjdGl2ZSIpKQorCQkJCQkJVS5hbmltd2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV05PQUNUSVZBVEU7CisJCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sImFjdGlvbiIpKQorCQkJCQkJVS5hbmltd2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV05BOy8qIGNvcnJlY3Q/Ki8KKwkJCQkJaSsrOworCQkJCX0KKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogdGV4dCBpcyBlbmNsb3NlZCBpbiAiIC4uLiAiIGFzIGl0IHNlZW1zICovCisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwidGV4dCIpKSB7CisJCQkJY2hhcgkqdDsKKwkJCQlpbnQJbGVuLGosazsKKworCQkJCWlmIChrZXl3b3Jkc1tpKzFdWzBdIT0nIicpIHsKKwkJCQkJaSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZHdGbGFncyB8PSBNQ0lfQU5JTV9XSU5ET1dfVEVYVDsKKwkJCQlsZW4JPSBzdHJsZW4oa2V5d29yZHNbaSsxXSkrMTsKKwkJCQlqCT0gaSsyOworCQkJCXdoaWxlIChqPG5yb2ZrZXl3b3JkcykgeworCQkJCQlsZW4gKz0gc3RybGVuKGtleXdvcmRzW2pdKSsxOworCQkJCQlpZiAoc3RyY2hyKGtleXdvcmRzW2pdLCciJykpCisJCQkJCQlicmVhazsKKwkJCQkJaisrOworCQkJCX0KKwkJCQlzPShjaGFyKiltYWxsb2MobGVuKTsKKwkJCQlzdHJjcHkocyxrZXl3b3Jkc1tpKzFdKzEpOworCQkJCWs9ajtqPWkrMjsKKwkJCQl3aGlsZSAoajw9aykgeworCQkJCQlzdHJjYXQocywiICIpOworCQkJCQlzdHJjYXQocyxrZXl3b3Jkc1tqXSk7CisJCQkJfQorCQkJCWlmICgodD1zdHJjaHIocywnIicpKSkgKnQ9J1wwJzsKKwkJCQkvKiBGSVhNRTogc2VnbWVudGVkIHBvaW50ZXI/ICovCisJCQkJVS5hbmltd2luZG93UGFyYW1zLmxwc3RyVGV4dCA9IHM7CisJCQkJaT1rKzE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlGTEFHMSgic3RyZXRjaCIsTUNJX0FOSU1fV0lORE9XX0VOQUJMRV9TVFJFVENIKTsKKwkJCWJyZWFrOworCQljYXNlIE1DSV9ERVZUWVBFX09WRVJMQVk6CisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwiaGFuZGxlIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7CisJCQkJZHdGbGFncyB8PSBNQ0lfT1ZMWV9XSU5ET1dfSFdORDsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJkZWZhdWx0IikpIAorCQkJCQlVLm92bHl3aW5kb3dQYXJhbXMuaFduZCA9IE1DSV9PVkxZX1dJTkRPV19ERUZBVUxUOworCQkJCWVsc2UKKwkJCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVkIiwmKFUub3ZseXdpbmRvd1BhcmFtcy5oV25kKSk7CisJCQkJaSs9MjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJzdGF0ZSIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgeworCQkJCWR3RmxhZ3MgfD0gTUNJX09WTFlfV0lORE9XX1NUQVRFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sImhpZGUiKSkKKwkJCQkJVS5vdmx5d2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfSElERTsKKwkJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpKzFdLCJpY29uaWMiKSkKKwkJCQkJVS5vdmx5d2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV01JTk5PQUNUSVZFOyAvKiBjb3JyZWN0PyAqLworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1pbmltaXplZCIpKQorCQkJCQlVLm92bHl3aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XTUlOSU1JWkVEOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1heGltaXplZCIpKQorCQkJCQlVLm92bHl3aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XTUFYSU1JWkVEOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm1pbmltaXplIikpCisJCQkJCVUub3ZseXdpbmRvd1BhcmFtcy5uQ21kU2hvdyA9IFNXX01JTklNSVpFOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm5vcm1hbCIpKQorCQkJCQlVLm92bHl3aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19OT1JNQUw7CisJCQkJaWYgKCFTVFJDTVAoa2V5d29yZHNbaSsxXSwic2hvdyIpKQorCQkJCQlVLm92bHl3aW5kb3dQYXJhbXMubkNtZFNob3cgPSBTV19TSE9XOworCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMV0sIm5vIikgJiYgKGkrMjxucm9ma2V5d29yZHMpKSB7CisJCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sImFjdGl2ZSIpKQorCQkJCQkJVS5vdmx5d2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV05PQUNUSVZBVEU7CisJCQkJCWlmICghU1RSQ01QKGtleXdvcmRzW2krMl0sImFjdGlvbiIpKQorCQkJCQkJVS5vdmx5d2luZG93UGFyYW1zLm5DbWRTaG93ID0gU1dfU0hPV05BOy8qIGNvcnJlY3Q/Ki8KKwkJCQkJaSsrOworCQkJCX0KKwkJCQlpKz0yOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogdGV4dCBpcyBlbmNsb3NlZCBpbiAiIC4uLiAiIGFzIGl0IHNlZW1zICovCisJCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwidGV4dCIpKSB7CisJCQkJY2hhcgkqdDsKKwkJCQlpbnQJbGVuLGosazsKKworCQkJCWlmIChrZXl3b3Jkc1tpKzFdWzBdIT0nIicpIHsKKwkJCQkJaSsrOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJZHdGbGFncyB8PSBNQ0lfT1ZMWV9XSU5ET1dfVEVYVDsKKwkJCQlsZW4JPSBzdHJsZW4oa2V5d29yZHNbaSsxXSkrMTsKKwkJCQlqCT0gaSsyOworCQkJCXdoaWxlIChqPG5yb2ZrZXl3b3JkcykgeworCQkJCQlsZW4gKz0gc3RybGVuKGtleXdvcmRzW2pdKSsxOworCQkJCQlpZiAoc3RyY2hyKGtleXdvcmRzW2pdLCciJykpCisJCQkJCQlicmVhazsKKwkJCQkJaisrOworCQkJCX0KKwkJCQlzPShjaGFyKiltYWxsb2MobGVuKTsKKwkJCQlzdHJjcHkocyxrZXl3b3Jkc1tpKzFdKzEpOworCQkJCWs9ajtqPWkrMjsKKwkJCQl3aGlsZSAoajw9aykgeworCQkJCQlzdHJjYXQocywiICIpOworCQkJCQlzdHJjYXQocyxrZXl3b3Jkc1tqXSk7CisJCQkJfQorCQkJCWlmICgodD1zdHJjaHIocywnIicpKSkgKnQ9J1wwJzsKKwkJCQkvKiBGSVhNRTogc2VnbWVudGVkIHBvaW50ZXI/ICovCisJCQkJVS5vdmx5d2luZG93UGFyYW1zLmxwc3RyVGV4dCA9IHM7CisJCQkJaT1rKzE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlGTEFHMSgic3RyZXRjaCIsTUNJX09WTFlfV0lORE9XX0VOQUJMRV9TVFJFVENIKTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwl9CisJX01DSV9DQUxMX0RSSVZFUihNQ0lfV0lORE9XLFUpOworCWlmIChzKSBmcmVlKHMpOworCXJldHVybiByZXM7Cit9CisKK3N0cnVjdAlfTUNJU1RSX2NtZHRhYmxlIHsKKwljaGFyCSpjbWQ7CisJRFdPUkQJKCpmdW4pKF9NQ0lTVFJfUFJPVE9fKTsKK30gTUNJU1RSX2NtZHRhYmxlW109eworCXsiYnJlYWsiLAlNQ0lTVFJfQnJlYWt9LAorCXsiY2FwYWJpbGl0eSIsCU1DSVNUUl9DYXBhYmlsaXR5fSwKKwl7ImNsb3NlIiwJTUNJU1RSX0Nsb3NlfSwKKwl7ImN1ZSIsCQlNQ0lTVFJfQ3VlfSwKKwl7ImRlbGV0ZSIsCU1DSVNUUl9EZWxldGV9LAorCXsiZXNjYXBlIiwJTUNJU1RSX0VzY2FwZX0sCisJeyJmcmVlemUiLAlNQ0lTVFJfRnJlZXplfSwKKwl7ImluZm8iLAlNQ0lTVFJfSW5mb30sCisJeyJsb2FkIiwJTUNJU1RSX0xvYWR9LAorCXsib3BlbiIsCU1DSVNUUl9PcGVufSwKKwl7InBhdXNlIiwJTUNJU1RSX1BhdXNlfSwKKwl7InBsYXkiLAlNQ0lTVFJfUGxheX0sCisJeyJwdXQiLAkJTUNJU1RSX1B1dH0sCisJeyJyZWFsaXplIiwJTUNJU1RSX1JlYWxpemV9LAorCXsicmVjb3JkIiwJTUNJU1RSX1JlY29yZH0sCisJeyJyZXN1bWUiLAlNQ0lTVFJfUmVzdW1lfSwKKwl7InNhdmUiLAlNQ0lTVFJfU2F2ZX0sCisJeyJzZWVrIiwJTUNJU1RSX1NlZWt9LAorCXsic2V0IiwJCU1DSVNUUl9TZXR9LAorCXsic3BpbiIsCU1DSVNUUl9TcGlufSwKKwl7InN0YXR1cyIsCU1DSVNUUl9TdGF0dXN9LAorCXsic3RlcCIsCU1DSVNUUl9TdGVwfSwKKwl7InN0b3AiLAlNQ0lTVFJfU3RvcH0sCisJeyJzeXNpbmZvIiwJTUNJU1RSX1N5c2luZm99LAorCXsidW5mcmVlemUiLAlNQ0lTVFJfVW5mcmVlemV9LAorCXsidXBkYXRlIiwJTUNJU1RSX1VwZGF0ZX0sCisJeyJ3aGVyZSIsCU1DSVNUUl9XaGVyZX0sCisJeyJ3aW5kb3ciLAlNQ0lTVFJfV2luZG93fSwKKwl7TlVMTCwJCU5VTEx9Cit9OworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqIAkJCQltY2lTZW5kU3RyaW5nCQkJW01NU1lTVEVNLjcwMl0KKyovCisvKiBUaGUgdXNlcmNvZGUgc2VuZHMgYSBzdHJpbmcgd2l0aCBhIGNvbW1hbmQgKGFuZCBmbGFncykgZXhwcmVzc2VkIGluIAorICogd29yZHMgaW4gaXQuLi4gV2UgZG8gb3VyIGJlc3QgdG8gY2FsbCBhcHJvYmlhdGUgZHJpdmVycywKKyAqIGFuZCByZXR1cm4gYSBlcnJvcmNvZGUgQU5EIGEgcmVhZGFibGUgc3RyaW5nIChpZiBscHN0clJTIT1OVUxMKQorICogSW5mbyBnYXRoZXJlZCBieSB3YXRjaGluZyBjb29sMTM0LmV4ZSBhbmQgZnJvbSBCb3JsYW5kJ3MgbWNpc3Ryd2guaGxwCisgKi8KKy8qIEZJWE1FOiAiYWxsIiBpcyBhIHZhbGlkIGRldmljZXR5cGUgYW5kIHdlIHNob3VsZCBhY2Nlc3MgYWxsIGRldmljZXMgaWYKKyAqIGl0IGlzIHVzZWQuIChpbWFnaW5lICJjbG9zZSBhbGwiKS4gTm90IGltcGxlbWVudGVkIHlldC4KKyAqLworRFdPUkQgbWNpU2VuZFN0cmluZyAoTFBDU1RSIGxwc3RyQ29tbWFuZCwgTFBTVFIgbHBzdHJSZXR1cm5TdHJpbmcsIAorCVVJTlQgdVJldHVybkxlbmd0aCwgSFdORCBod25kQ2FsbGJhY2spCit7CisJY2hhcgkqY21kLCpkZXYsKmFyZ3MsKiprZXl3b3JkczsKKwlXT1JECXVEZXZUeXAsd0RldklEOworCURXT1JECWR3RmxhZ3M7CisJaW50CXJlcyxpLG5yb2ZrZXl3b3JkczsKKworCWRwcmludGZfbWNpKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmcoJyVzJywgJXAsICVkLCAlWClcbiIsIGxwc3RyQ29tbWFuZCwgCisJCWxwc3RyUmV0dXJuU3RyaW5nLCB1UmV0dXJuTGVuZ3RoLCBod25kQ2FsbGJhY2sKKwkpOworCS8qIGZvcm1hdCBpcyA8Y29tbWFuZD4gPGRldmljZT4gPG9wdGFyZ3M+ICovCisJY21kPXN0cmR1cChscHN0ckNvbW1hbmQpOworCWRldj1zdHJjaHIoY21kLCcgJyk7CisJaWYgKGRldj09TlVMTCkgeworCQlmcmVlKGNtZCk7CisJCXJldHVybiBNQ0lFUlJfTUlTU0lOR19ERVZJQ0VfTkFNRTsKKwl9CisJKmRldisrPSdcMCc7CisJYXJncz1zdHJjaHIoZGV2LCcgJyk7CisJaWYgKGFyZ3MhPU5VTEwpICphcmdzKys9J1wwJzsKKwlBbnNpVXBwZXIoZGV2KTsKKwlpZiAoYXJncyE9TlVMTCkgeworCQljaGFyCSpzOworCQlpPTE7LyogbnJvZmtleXdvcmRzID0gbnJvZnNwYWNlcysxICovCisJCXM9YXJnczsKKwkJd2hpbGUgKChzPXN0cmNocihzLCcgJykpIT1OVUxMKSBpKysscysrOworCQlrZXl3b3Jkcz0oY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKihpKzIpKTsKKwkJbnJvZmtleXdvcmRzPWk7CisJCXM9YXJncztpPTA7CisJCXdoaWxlIChzICYmIGk8bnJvZmtleXdvcmRzKSB7CisJCQlrZXl3b3Jkc1tpKytdPXM7CisJCQlzPXN0cmNocihzLCcgJyk7CisJCQlpZiAocykgKnMrKz0nXDAnOworCQl9CisJCWtleXdvcmRzW2ldPU5VTEw7CisJfSBlbHNlIHsKKwkJbnJvZmtleXdvcmRzPTA7CisJCWtleXdvcmRzPShjaGFyKiopbWFsbG9jKHNpemVvZihjaGFyKikpOworCX0KKwlkd0ZsYWdzID0gMDsgLyogZGVmYXVsdCBmbGFncyAqLworCWZvciAoaT0wO2k8bnJvZmtleXdvcmRzOykgeworCQlpZiAoIVNUUkNNUChrZXl3b3Jkc1tpXSwid2FpdCIpKSB7CisJCQlkd0ZsYWdzIHw9IE1DSV9XQUlUOworCQkJbWVtY3B5KGtleXdvcmRzK2ksa2V5d29yZHMrKGkrMSksbnJvZmtleXdvcmRzLWktMSk7CisJCQlucm9ma2V5d29yZHMtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghU1RSQ01QKGtleXdvcmRzW2ldLCJub3RpZnkiKSkgeworCQkJLyogaG93IHNob3VsZCB3ZSBjYWxsYmFjaz8gIEkgZG9uJ3Qga25vdy4gKi8KKwkJCS8qZHdGbGFncyB8PSBNQ0lfTk9USUZZOyovCisJCQltZW1jcHkoa2V5d29yZHMraSxrZXl3b3JkcysoaSsxKSxucm9ma2V5d29yZHMtaS0xKTsKKwkJCW5yb2ZrZXl3b3Jkcy0tOworCQkJY29udGludWU7CisJCX0KKwkJaSsrOworCX0KKworIAkvKiBkZXRlcm1pbmUgd0RldklEIGFuZCB1RGV2VHlwIGZvciBhbGwgY29tbWFuZHMgZXhjZXB0ICJvcGVuIiAqLworIAlpZiAoU1RSQ01QKGNtZCwib3BlbiIpIT0wKSB7CisJCXdEZXZJRD0wOworCQl3aGlsZSAoMSkgeworCQkJU0VHUFRSCWRuYW1lOworCisJCQlkbmFtZT0oU0VHUFRSKW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckFsaWFzOworCQkJaWYgKGRuYW1lPT1OVUxMKSAKKwkJCQlkbmFtZT0oU0VHUFRSKW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckRldmljZVR5cGU7CisJCQlpZiAoIVNUUkNNUChQVFJfU0VHX1RPX0xJTihkbmFtZSksZGV2KSkKKwkJCQlicmVhazsKKwkJCWlmICgrK3dEZXZJRCA+PSBNQVhNQ0lEUklWRVJTKSB7CisJCQkJZHByaW50Zl9tY2koc3RkZGViLCBfX0ZJTEVfXyI6bWNpU2VuZFN0cmluZzpNQVhNQ0lEUklWRVJTIHJlYWNoZWQhXG4iKTsKKwkJCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CisJCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKKwkJCX0KKwkJfQorCQl1RGV2VHlwPW1jaURydlt3RGV2SURdLndUeXBlOworCX0KKworIAlmb3IgKGk9MDtNQ0lTVFJfY21kdGFibGVbaV0uY21kIT1OVUxMO2krKykgeworIAkJaWYgKCFTVFJDTVAoTUNJU1RSX2NtZHRhYmxlW2ldLmNtZCxjbWQpKSB7CisgCQkJcmVzPU1DSVNUUl9jbWR0YWJsZVtpXS5mdW4oCisgCQkJCXdEZXZJRCx1RGV2VHlwLGxwc3RyUmV0dXJuU3RyaW5nLAorIAkJCQl1UmV0dXJuTGVuZ3RoLGRldixrZXl3b3Jkcyxucm9ma2V5d29yZHMsCisgCQkJCWR3RmxhZ3MKKyAJCQkpOworIAkJCWJyZWFrOworIAkJfQorIAl9CisgCWlmIChNQ0lTVFJfY21kdGFibGVbaV0uY21kIT1OVUxMKSB7CisgCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CisgCQlyZXR1cm4JcmVzOworIAl9CisJZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nKCclcycsICVwLCAldSwgJVgpIC8vIHVuaW1wbGVtZW50ZWQsIHBsZWFzZSByZXBvcnQuXG4iLCBscHN0ckNvbW1hbmQsIAorCQlscHN0clJldHVyblN0cmluZywgdVJldHVybkxlbmd0aCwgaHduZENhbGxiYWNrCisJKTsKKwlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7CisJcmV0dXJuIE1DSUVSUl9NSVNTSU5HX0NPTU1BTkRfU1RSSU5HOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tdWx0aW1lZGlhL21tc3lzdGVtLmMgYi9tdWx0aW1lZGlhL21tc3lzdGVtLmMKaW5kZXggNzgyN2MxZC4uYjJiYzBlMSAxMDA2NDQKLS0tIGEvbXVsdGltZWRpYS9tbXN5c3RlbS5jCisrKyBiL211bHRpbWVkaWEvbW1zeXN0ZW0uYwpAQCAtMjgsMTEgKzI4LDcgQEAKIHN0YXRpYyBpbnQJSW5zdGFsbGVkTGlzdExlbjsKIHN0YXRpYyBMUFNUUglscEluc3RhbGxOYW1lcyA9IE5VTEw7CiAKLXN0YXRpYyBNQ0lfT1BFTl9EUklWRVJfUEFSTVMJbWNpRHJ2W01BWE1DSURSSVZFUlNdOwotLyogRklYTUU6IEkgbmVlZCB0byByZW1lbWJlciB0aGUgYWxpYXNuYW1lIG9mIGEgc3BlYy4gZHJpdmVyLiAKLSAqICAgICAgICBhbmQgdGhpcyBpcyB0aGUgZWFzaWVzdCB3YXkuICpzaWdoKgotICovCi1zdGF0aWMgTUNJX09QRU5fUEFSTVMJCW1jaU9wZW5EcnZbTUFYTUNJRFJJVkVSU107CitNQ0lfT1BFTl9EUklWRVJfUEFSTVMJbWNpRHJ2W01BWE1DSURSSVZFUlNdOwogCiBVSU5UIG1pZGlHZXRFcnJvclRleHQoVUlOVCB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVCB1U2l6ZSk7CiBVSU5UIHdhdmVHZXRFcnJvclRleHQoVUlOVCB1RXJyb3IsIExQU1RSIGxwVGV4dCwgVUlOVCB1U2l6ZSk7CkBAIC03OTgsNzc3ICs3OTQsNiBAQAogCXJldHVybiAwOwogfQogCi0vKiBzb21lb25lIHdhcyBqdXN0IHNob3J0IG9mIGEgY3Jpc2lzIHNlZWluZyBtZSBwdXR0aW5nIHh4eCBsaW5lcyBvZiBjb2RlCi0gKiBpbiBhIHNpbmdsZSBkZWZpbmUuIFdlbGwuIFdoYXQgZG9lcyB0aGUgY29kZSBob3BlIGZvciBpZiBub3QgZm9yIHRoZQotICogY2FyZSBvZiB0aGUgb3B0aW1pemVyPyAoU3RvbGVuIGJ5IFRlcnJ5IFByYXRjaGV0dCwgb2sgOykKLSAqLwotI2RlZmluZSBfTUNJX1NUUihzKSBkbyB7XAotCWludCBfX2xfXztcCi0JZHByaW50Zl9tY2koc3RkZGViLCItPnJldHVybnMgXCIlc1wiIixzKTtcCi0JaWYgKGxwc3RyUmV0dXJuU3RyaW5nKSB7XAotCQlfX2xfXz1zdHJsZW4ocyk7XAotCQlpZihfX2xfXz51UmV0dXJuTGVuZ3RoKSB7XAotCQkJc3RybmNweShscHN0clJldHVyblN0cmluZyxzLHVSZXR1cm5MZW5ndGgtMSk7XAotCQkJbHBzdHJSZXR1cm5TdHJpbmdbdVJldHVybkxlbmd0aC0xXT0nXDAnO1wKLQkJfSBlbHNlXAotCQkJc3RyY3B5KGxwc3RyUmV0dXJuU3RyaW5nLHMpO1wKLQkJZHByaW50Zl9tY2koc3RkZGViLCItLT5cIiVzXCJcbiIsbHBzdHJSZXR1cm5TdHJpbmcpO1wKLQl9XAotfSB3aGlsZSgwKQotLyogY2FsbGluZyBEcml2ZXJQcm9jLiBXZSBuZWVkIHRvIHBhc3MgdGhlIHN0cnVjdCBhcyBTRUdNRU5URUQgUE9JTlRFUi4gKi8KLSNkZWZpbmUgX01DSV9DQUxMX0RSSVZFUihjbWQscGFyYW1zKSB7XAotCURXT1JECXhwYXJhbXM7XAotCXhwYXJhbXM9TUFLRV9TRUdQVFIoJnBhcmFtcyk7XAotCXN3aXRjaCh1RGV2VHlwKSB7XAotCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86XAotCQlyZXM9Q0RBVURJT19Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLCB4cGFyYW1zKTtcCi0JCWJyZWFrO1wKLQljYXNlIE1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOlwKLQkJcmVzPVdBVkVfRHJpdmVyUHJvYyhtY2lEcnZbd0RldklEXS53RGV2aWNlSUQsMCxjbWQsZHdGbGFncyx4cGFyYW1zKTtcCi0JCWJyZWFrO1wKLQljYXNlIE1DSV9ERVZUWVBFX1NFUVVFTkNFUjpcCi0JCXJlcz1NSURJX0RyaXZlclByb2MobWNpRHJ2W3dEZXZJRF0ud0RldmljZUlELDAsY21kLGR3RmxhZ3MseHBhcmFtcyk7XAotCQlicmVhaztcCi0JY2FzZSBNQ0lfREVWVFlQRV9BTklNQVRJT046XAotCQlyZXM9QU5JTV9Ecml2ZXJQcm9jKG1jaURydlt3RGV2SURdLndEZXZpY2VJRCwwLGNtZCxkd0ZsYWdzLHhwYXJhbXMpO1wKLQkJYnJlYWs7XAotCWNhc2UgTUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzpcCi0JCWRwcmludGZfbWNpKHN0ZGRlYiwiX01DSV9DQUxMX0RSSVZFUiAvL05vIERJR0lUQUxfVklERU8geWV0ICFcbiIpO1wKLQkJcmVzPU1DSUVSUl9ERVZJQ0VfTk9UX0lOU1RBTExFRDtcCi0JCWJyZWFrO1wKLQlkZWZhdWx0OlwKLQkJZHByaW50Zl9tY2koc3RkZGViLCJfTUNJX0NBTExfRFJJVkVSIC8vSW52YWxpZCBEZXZpY2UgTmFtZSAnJXMnICFcbiIsZGV2KTtcCi0JCXJlcz1NQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTtcCi0JCWJyZWFrO1wKLQl9XAotfQotLyogeWVhaCwgSSBrbm93IHRoaXMgaXMgQkFELiBidXQgd2UgaGF2ZSB0byBkbyB0aGF0IGZvciBNQ0lfT1BFTl9QQVJNUyAKLSAqIHN0cmluZ3MuCi0gKi8KLSNkZWZpbmUJX01DSV9TVFJEVVBfVE9fU0VHKGRlc3Qsc291cmNlKSB7XAotCUhBTkRMRQl4O1wKLQl4PVVTRVJfSEVBUF9BTExPQyhzdHJsZW4oc291cmNlKSk7XAotCWRlc3Q9KExQU1RSKU1BS0VMT05HKHgsVVNFUl9IZWFwU2VsKTtcCi0Jc3RyY3B5KFBUUl9TRUdfVE9fTElOKGRlc3QpLHNvdXJjZSk7XAotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSogCQkJCW1jaVNlbmRTdHJpbmcJCQlbTU1TWVNURU0uNzAyXQotKi8KLS8qIFdlbGwsIGl0J3MgZWFzeS4gVGhlIHVzZXJjb2RlIHNlbmRzIGEgc3RyaW5nIHdpdGggYSBjb21tYW5kIChhbmQgZmxhZ3MpCi0gKiBleHByZXNzZWQgaW4gd29yZHMgaW4gaXQuLi4gV2UgZG8gb3VyIGJlc3QgdG8gY2FsbCBhcHByb2JpYXRlIGRyaXZlcnMsCi0gKiBhbmQgcmV0dXJuIGEgZXJyb3Jjb2RlIEFORCBhIHJlYWRhYmxlIHN0cmluZyAoaWYgbHBzdHJSUyE9TlVMTCkKLSAqIEluZm8gdGFrZW4gYnkgd2F0Y2hpbmcgY29vbDEzNC5leGUgYW5kIGZyb20gQm9ybGFuZCdzIG1jaXN0cndoLmhscAotICovCi1EV09SRCBtY2lTZW5kU3RyaW5nIChMUENTVFIgbHBzdHJDb21tYW5kLCBMUFNUUiBscHN0clJldHVyblN0cmluZywgCi0JVUlOVCB1UmV0dXJuTGVuZ3RoLCBIV05EIGh3bmRDYWxsYmFjaykKLXsKLQljaGFyCSpjbWQsKmRldiwqYXJncywqKmtleXdvcmRzOwotCVdPUkQJdURldlR5cCx3RGV2SUQ7Ci0JRFdPUkQJZHdGbGFnczsKLQlpbnQJdHJhY2ssaSxucm9ma2V5d29yZHMscmVzLHRpbWVmOwotCi0JZHByaW50Zl9tY2koc3RkbmltcCwibWNpU2VuZFN0cmluZygnJXMnLCAlcCwgJWQsICVYKVxuIiwgbHBzdHJDb21tYW5kLCAKLQkJbHBzdHJSZXR1cm5TdHJpbmcsIHVSZXR1cm5MZW5ndGgsIGh3bmRDYWxsYmFjawotCSk7Ci0JLyogZm9ybWF0IGlzIDxjb21tYW5kPiA8ZGV2aWNlPiA8b3B0YXJncz4gKi8KLQljbWQ9c3RyZHVwKGxwc3RyQ29tbWFuZCk7Ci0JZGV2PXN0cmNocihjbWQsJyAnKTsKLQlpZiAoZGV2PT1OVUxMKSB7Ci0JCWZyZWUoY21kKTsKLQkJcmV0dXJuIE1DSUVSUl9NSVNTSU5HX0RFVklDRV9OQU1FOwotCX0KLQkqZGV2Kys9J1wwJzsKLQlhcmdzPXN0cmNocihkZXYsJyAnKTsKLQlpZiAoYXJncyE9TlVMTCkgKmFyZ3MrKz0nXDAnOwotCUFuc2lVcHBlcihkZXYpOwotCUFuc2lVcHBlcihjbWQpOwotCWlmIChhcmdzIT1OVUxMKSB7Ci0JCWNoYXIJKnM7Ci0JCUFuc2lVcHBlcihhcmdzKTsKLQkJaT0xOy8qIG5yb2ZrZXl3b3JkcyA9IG5yb2ZzcGFjZXMrMSAqLwotCQlzPWFyZ3M7Ci0JCXdoaWxlICgocz1zdHJjaHIocywnICcpKSE9TlVMTCkgaSsrLHMrKzsKLQkJa2V5d29yZHM9KGNoYXIqKiltYWxsb2Moc2l6ZW9mKGNoYXIqKSooaSsyKSk7Ci0JCW5yb2ZrZXl3b3Jkcz1pOwotCQlzPWFyZ3M7aT0wOwotCQl3aGlsZSAocyAmJiBpPG5yb2ZrZXl3b3JkcykgewotCQkJa2V5d29yZHNbaSsrXT1zOwotCQkJcz1zdHJjaHIocywnICcpOwotCQkJaWYgKHMpICpzKys9J1wwJzsKLQkJfQotCQlrZXl3b3Jkc1tpXT1OVUxMOwotCX0gZWxzZSB7Ci0JCW5yb2ZrZXl3b3Jkcz0wOwotCQlrZXl3b3Jkcz0oY2hhcioqKW1hbGxvYyhzaXplb2YoY2hhciopKTsKLQl9Ci0JZHdGbGFncyA9IDA7IC8qIGRlZmF1bHQgZmxhZ3MgKi8KLQlpPTA7Ci0Jd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7Ci0JCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJXQUlUIikpIHsKLQkJCWR3RmxhZ3MgfD0gTUNJX1dBSVQ7Ci0JCQlpKys7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiTk9USUZZIikpIHsKLQkJCS8qIGhvdyBzaG91bGQgd2UgY2FsbGJhY2s/ICBJIGRvbid0IGtub3cuICovCi0JCQkvKmR3RmxhZ3MgfD0gTUNJX05PVElGWTsqLwotCQkJaSsrOwotCQkJY29udGludWU7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sIlRSQUNLIikpIHsKLQkJCWlmIChpKzE8bnJvZmtleXdvcmRzKSB7Ci0JCQkJc3NjYW5mKGtleXdvcmRzW2krMV0sIiVkIiwmdHJhY2spOwotCQkJCWR3RmxhZ3MgfD0gTUNJX1RSQUNLOwotCQkJCWkrKzsKLQkJCQkvKkZBTExUSFJPVUdIKi8KLQkJCX0KLQkJCWkrKzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWkrKzsKLQl9Ci0JaWYgKCFzdHJjbXAoY21kLCJPUEVOIikpIHsKLQkJY2hhcgkqczsKLQkJTUNJX09QRU5fUEFSTVMJb3BlblBhcmFtczsKLQotCQlvcGVuUGFyYW1zLmxwc3RyRWxlbWVudE5hbWUgPSBOVUxMOwotCQlzPXN0cmNocihkZXYsJyEnKTsKLQkJaWYgKHMhPU5VTEwpIHsKLQkJCSpzKys9J1wwJzsKLQkJCV9NQ0lfU1RSRFVQX1RPX1NFRyhvcGVuUGFyYW1zLmxwc3RyRWxlbWVudE5hbWUscyk7Ci0JCX0KLQkJaWYgKCFzdHJjbXAoZGV2LCJDREFVRElPIikpIHsKLQkJCXVEZXZUeXA9TUNJX0RFVlRZUEVfQ0RfQVVESU87Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChkZXYsIldBVkVBVURJTyIpKSB7Ci0JCQl1RGV2VHlwPU1DSV9ERVZUWVBFX1dBVkVGT1JNX0FVRElPOwotCQl9IGVsc2UgaWYgKCFzdHJjbXAoZGV2LCJTRVFVRU5DRVIiKSkgewotCQkJdURldlR5cD1NQ0lfREVWVFlQRV9TRVFVRU5DRVI7Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChkZXYsIkFOSU1BVElPTjEiKSkgewotCQkJdURldlR5cD1NQ0lfREVWVFlQRV9BTklNQVRJT047Ci0JCX0gZWxzZSBpZiAoIXN0cmNtcChkZXYsIkFWSVZJREVPIikpIHsKLQkJCXVEZXZUeXA9TUNJX0RFVlRZUEVfRElHSVRBTF9WSURFTzsKLQkJfSBlbHNlIHsKLQkJCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKLQkJCXJldHVybiBNQ0lFUlJfSU5WQUxJRF9ERVZJQ0VfTkFNRTsKLQkJfQotCQl3RGV2SUQ9MDsKLQkJd2hpbGUobWNpRHJ2W3dEZXZJRF0ud1R5cGUpIHsKLQkJCWlmICgrK3dEZXZJRD49TUFYTUNJRFJJVkVSUykgewotCQkJCWRwcmludGZfbWNpKHN0ZGRlYiwgIk1DSV9PUEVOIC8vIE1BWE1DSURSSVZFUlMgcmVhY2hlZCAhXG4iKTsKLQkJCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7Ci0JCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJCX0KLQkJfQotCQltY2lEcnZbd0RldklEXS53VHlwZQkJPSB1RGV2VHlwOwotCQltY2lEcnZbd0RldklEXS53RGV2aWNlSUQJPSB3RGV2SUQ7Ci0JCW9wZW5QYXJhbXMuZHdDYWxsYmFjawkJPSAwOwotCQlvcGVuUGFyYW1zLndEZXZpY2VJRAkJPSB3RGV2SUQ7Ci0JCS8qIGFsbCBzdHJpbmdzIG11c3QgYmUgY29waWVkICovCi0JCV9NQ0lfU1RSRFVQX1RPX1NFRyhvcGVuUGFyYW1zLmxwc3RyRGV2aWNlVHlwZSxkZXYpOwotCQlvcGVuUGFyYW1zLmxwc3RyQWxpYXMJCT0gTlVMTDsKLQkJZHdGbGFncyB8PSBNQ0lfT1BFTl9UWVBFOwotCQlpPTA7Ci0JCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgewotCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sIlNIQVJFQUJMRSIpKSB7Ci0JCQkJZHdGbGFnc3w9TUNJX09QRU5fU0hBUkVBQkxFOwotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJBTElBUyIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgewotCQkJCWR3RmxhZ3N8PU1DSV9PUEVOX0FMSUFTOwotCQkJCV9NQ0lfU1RSRFVQX1RPX1NFRyhvcGVuUGFyYW1zLmxwc3RyQWxpYXMsa2V5d29yZHNbaV0pOwotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiRUxFTUVOVCIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgewotCQkJCWR3RmxhZ3N8PU1DSV9PUEVOX0VMRU1FTlQ7Ci0JCQkJX01DSV9TVFJEVVBfVE9fU0VHKG9wZW5QYXJhbXMubHBzdHJFbGVtZW50TmFtZSxrZXl3b3Jkc1tpXSk7Ci0JCQkJaSs9MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9PUEVOLG9wZW5QYXJhbXMpOwotCQlpZiAocmVzPT0wKQotCQkJbWVtY3B5KCZtY2lPcGVuRHJ2W3dEZXZJRF0sJm9wZW5QYXJhbXMsc2l6ZW9mKE1DSV9PUEVOX1BBUk1TKSk7Ci0JCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JLyogYWxsIG90aGVyIGNvbW1hbmRzIHVzZSB0aGUgYWxpYXMgc2V0IGluIE1DSV9PUEVOIG9yIChpZiBub3Qgc2V0KSAKLQkgKiB0aGUgZGV2aWNldHlwZQotCSAqLwotCXdEZXZJRD0wOwotCXdoaWxlKDEpIHsKLQkJU0VHUFRSCWRuYW1lOwotCQlkbmFtZT0oU0VHUFRSKW1jaU9wZW5EcnZbd0RldklEXS5scHN0ckFsaWFzOwotCQlpZiAoZG5hbWU9PU5VTEwpIAotCQkJZG5hbWU9KFNFR1BUUiltY2lPcGVuRHJ2W3dEZXZJRF0ubHBzdHJEZXZpY2VUeXBlOwotCQlpZiAoIXN0cmNhc2VjbXAoUFRSX1NFR19UT19MSU4oZG5hbWUpLGRldikpCi0JCQlicmVhazsKLQkJaWYgKCsrd0RldklEID49IE1BWE1DSURSSVZFUlMpIHsKLQkJCWRwcmludGZfbWNpKHN0ZGRlYiwgIm1jaVNlbmRTdHJpbmcgLy8gTUFYTUNJRFJJVkVSUyByZWFjaGVkICFcbiIpOwotCQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQkJcmV0dXJuIE1DSUVSUl9JTlRFUk5BTDsKLQkJfQotCX0KLQl1RGV2VHlwPW1jaURydlt3RGV2SURdLndUeXBlOwotCi0JaWYgKCFzdHJjbXAoY21kLCJTVEFUVVMiKSkgewotCQlNQ0lfU1RBVFVTX1BBUk1TIHN0YXR1c1BhcmFtczsKLQotCQlpZiAoYXJncz09TlVMTCkgewotCQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQkJcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1NUUklOR19BUkdVTUVOVDsKLQkJfQotCQlzdGF0dXNQYXJhbXMuZHdDYWxsYmFjayA9IDA7Ci0JCWlmIChkd0ZsYWdzICYgTUNJX1RSQUNLKQotCQkJc3RhdHVzUGFyYW1zLmR3VHJhY2sgPSB0cmFjazsKLQkJZHdGbGFncyB8PSBNQ0lfU1RBVFVTX0lURU07Ci0JCS8qIHdlIG5lZWQgdGhhdCBsYXRlciBmb3IgcHJpbnRpbmcuLi4gKi8KLQkJc3RhdHVzUGFyYW1zLmR3SXRlbSA9IE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ7Ci0JCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1NUQVRVUyxzdGF0dXNQYXJhbXMpOwotCQl0aW1lZj1zdGF0dXNQYXJhbXMuZHdSZXR1cm47Ci0JCXN0YXR1c1BhcmFtcy5kd1JldHVybj0wOwotCQlzdGF0dXNQYXJhbXMuZHdJdGVtPTA7Ci0JCWk9MDsKLQkJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIkNVUlJFTlQiKSAmJgotCQkJCShpKzE8bnJvZmtleXdvcmRzKSAmJgotCQkJCSFzdHJjbXAoa2V5d29yZHNbaSsxXSwiVFJBQ0siKQotCQkJKSB7Ci0JCQkJc3RhdHVzUGFyYW1zLmR3SXRlbT1NQ0lfU1RBVFVTX0NVUlJFTlRfVFJBQ0s7Ci0JCQkJaSs9MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICgJIXN0cmNtcChrZXl3b3Jkc1tpXSwiVElNRSIpICYmCi0JCQkJKGkrMTxucm9ma2V5d29yZHMpICYmCi0JCQkJIXN0cmNtcChrZXl3b3Jkc1tpKzFdLCJGT1JNQVQiKQotCQkJKSB7Ci0JCQkJc3RhdHVzUGFyYW1zLmR3SXRlbT1NQ0lfU1RBVFVTX1RJTUVfRk9STUFUOwotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiUkVBRFkiKSkgewotCQkJCXN0YXR1c1BhcmFtcy5kd0l0ZW09TUNJX1NUQVRVU19SRUFEWTsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiTU9ERSIpKSB7Ci0JCQkJc3RhdHVzUGFyYW1zLmR3SXRlbT1NQ0lfU1RBVFVTX01PREU7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKAkhc3RyY21wKGtleXdvcmRzW2ldLCJOVU1CRVIiKSAmJiAKLQkJCQkoaSsyPG5yb2ZrZXl3b3JkcykgJiYKLQkJCQkhc3RyY21wKGtleXdvcmRzW2krMV0sIk9GIikgJiYKLQkJCQkhc3RyY21wKGtleXdvcmRzW2krMl0sIlRSQUNLUyIpCi0JCQkpIHsKLQkJCQlzdGF0dXNQYXJhbXMuZHdJdGVtID0gTUNJX1NUQVRVU19OVU1CRVJfT0ZfVFJBQ0tTOwotCQkJCWkrPTM7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiTEVOR1RIIikpIHsKLQkJCQlzdGF0dXNQYXJhbXMuZHdJdGVtID0gTUNJX1NUQVRVU19MRU5HVEg7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sIlBPU0lUSU9OIikpIHsKLQkJCQlzdGF0dXNQYXJhbXMuZHdJdGVtID0gTUNJX1NUQVRVU19QT1NJVElPTjsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIk1FRElBIikgJiYgCi0JCQkJKGkrMTxucm9ma2V5d29yZHMpICYmCi0JCQkJIXN0cmNtcChrZXl3b3Jkc1tpKzFdLCJQUkVTRU5UIikKLQkJCSkgewotCQkJCXN0YXR1c1BhcmFtcy5kd0l0ZW0gPSBNQ0lfU1RBVFVTX01FRElBX1BSRVNFTlQ7Ci0JCQkJaSs9MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVEFUVVMsc3RhdHVzUGFyYW1zKTsKLQkJaWYgKHJlcz09MCkgewotCQkJc3dpdGNoIChzdGF0dXNQYXJhbXMuZHdJdGVtKSB7Ci0JCQljYXNlIE1DSV9TVEFUVVNfTU9ERToKLQkJCQlzd2l0Y2ggKHN0YXR1c1BhcmFtcy5kd1JldHVybikgewotCQkJCWNhc2UgTUNJX01PREVfTk9UX1JFQURZOl9NQ0lfU1RSKCJub3QgcmVhZHkiKTticmVhazsKLQkJCQljYXNlIE1DSV9NT0RFX1NUT1A6X01DSV9TVFIoInN0b3BwZWQiKTticmVhazsKLQkJCQljYXNlIE1DSV9NT0RFX1BMQVk6X01DSV9TVFIoInBsYXlpbmciKTticmVhazsKLQkJCQljYXNlIE1DSV9NT0RFX1JFQ09SRDpfTUNJX1NUUigicmVjb3JkaW5nIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfTU9ERV9TRUVLOl9NQ0lfU1RSKCJzZWVraW5nIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfTU9ERV9QQVVTRTpfTUNJX1NUUigicGF1c2VkIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfTU9ERV9PUEVOOl9NQ0lfU1RSKCJvcGVuIik7YnJlYWs7Ci0JCQkJZGVmYXVsdDpicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1DSV9TVEFUVVNfTUVESUFfUFJFU0VOVDoKLQkJCQlpZiAoc3RhdHVzUGFyYW1zLmR3UmV0dXJuKQotCQkJCQlfTUNJX1NUUigidHJ1ZSIpOwotCQkJCWVsc2UKLQkJCQkJX01DSV9TVFIoImZhbHNlIik7Ci0JCQkJYnJlYWs7Ci0JCQljYXNlIE1DSV9TVEFUVVNfTlVNQkVSX09GX1RSQUNLUzoKLQkJCWNhc2UgTUNJX1NUQVRVU19DVVJSRU5UX1RSQUNLOgotCQkJewljaGFyCWJ1ZlsxNl07Ci0JCQkJc3ByaW50ZihidWYsIiVsZCIsc3RhdHVzUGFyYW1zLmR3UmV0dXJuKTsKLQkJCQlfTUNJX1NUUihidWYpOwotCQkJCWJyZWFrOwotCQkJfQotCQkJY2FzZSBNQ0lfU1RBVFVTX1BPU0lUSU9OOgotCQkJY2FzZSBNQ0lfU1RBVFVTX0xFTkdUSDoKLQkJCXsJY2hhcglidWZbMTAwXTsKLQkJCQlzd2l0Y2ggKHRpbWVmKSB7Ci0JCQkJY2FzZSBNQ0lfRk9STUFUX01JTExJU0VDT05EUzoKLQkJCQljYXNlIE1DSV9GT1JNQVRfRlJBTUVTOgotCQkJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKLQkJCQljYXNlIE1DSV9GT1JNQVRfU0FNUExFUzoKLQkJCQkJc3ByaW50ZihidWYsIiVsZCIsc3RhdHVzUGFyYW1zLmR3UmV0dXJuKTsKLQkJCQkJX01DSV9TVFIoYnVmKTsKLQkJCQkJYnJlYWs7Ci0JCQkJY2FzZSBNQ0lfRk9STUFUX0hNUzoKLQkJCQkJLyogd2VsbCwgdGhlIG1hY3JvcyBoYXZlIHRoZSBzYW1lIGNvbnRlbnQqLwotCQkJCQkvKkZBTExUUkhPVUdIKi8KLQkJCQljYXNlIE1DSV9GT1JNQVRfTVNGOgotCQkJCQlzcHJpbnRmKGJ1ZiwiJWQ6JWQ6JWQiLAotCQkJCQkJTUNJX0hNU19IT1VSKHN0YXR1c1BhcmFtcy5kd1JldHVybiksCi0JCQkJCQlNQ0lfSE1TX01JTlVURShzdGF0dXNQYXJhbXMuZHdSZXR1cm4pLAotCQkJCQkJTUNJX0hNU19TRUNPTkQoc3RhdHVzUGFyYW1zLmR3UmV0dXJuKQotCQkJCQkpOwotCQkJCQlfTUNJX1NUUihidWYpOwotCQkJCQlicmVhazsKLQkJCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKLQkJCQkJc3ByaW50ZihidWYsIiVkOiVkOiVkOiVkIiwKLQkJCQkJCU1DSV9UTVNGX1RSQUNLKHN0YXR1c1BhcmFtcy5kd1JldHVybiksCi0JCQkJCQlNQ0lfVE1TRl9NSU5VVEUoc3RhdHVzUGFyYW1zLmR3UmV0dXJuKSwKLQkJCQkJCU1DSV9UTVNGX1NFQ09ORChzdGF0dXNQYXJhbXMuZHdSZXR1cm4pLAotCQkJCQkJTUNJX1RNU0ZfRlJBTUUoc3RhdHVzUGFyYW1zLmR3UmV0dXJuKQotCQkJCQkpOwotCQkJCQlfTUNJX1NUUihidWYpOwotCQkJCQlicmVhazsKLQkJCQlkZWZhdWx0OgotCQkJCQlmcHJpbnRmKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmc6U1RBVFVTOm1pc3NpbmcgdGltZWZvcm1hdCBmb3IgJWQsIHJlcG9ydC5cbiIsdGltZWYpOwotCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCQljYXNlIE1DSV9TVEFUVVNfVElNRV9GT1JNQVQ6Ci0JCQkJc3dpdGNoICh0aW1lZikgewotCQkJCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6X01DSV9TVFIoIm1pbGxpc2Vjb25kcyIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0ZPUk1BVF9GUkFNRVM6X01DSV9TVFIoImZyYW1lcyIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzpfTUNJX1NUUigiYnl0ZXMiKTticmVhazsKLQkJCQljYXNlIE1DSV9GT1JNQVRfU0FNUExFUzpfTUNJX1NUUigic2FtcGxlcyIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0ZPUk1BVF9ITVM6X01DSV9TVFIoImhtcyIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6X01DSV9TVFIoIm1zZiIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0ZPUk1BVF9UTVNGOl9NQ0lfU1RSKCJ0bXNmIik7YnJlYWs7Ci0JCQkJZGVmYXVsdDoKLQkJCQkJZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOlNUQVRVUzptaXNzaW5nIHRpbWVmb3JtYXQgZm9yICVkLCByZXBvcnQuXG4iLHRpbWVmKTsKLQkJCQkJYnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJZGVmYXVsdDoKLQkJCQlmcHJpbnRmKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmc6U1RBVFVTOm1pc3NpbmcgcmVzdWx0IGZvciAlbGQsIHJlcG9ydC5cbiIsc3RhdHVzUGFyYW1zLmR3SXRlbSk7Ci0JCQkJYnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoIXN0cmNtcChjbWQsIlNFVCIpKSB7Ci0JCU1DSV9TRVRfUEFSTVMJc2V0UGFyYW1zOwotCi0JCWlmIChhcmdzPT1OVUxMKSB7Ci0JCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7Ci0JCQlyZXR1cm4gTUNJRVJSX01JU1NJTkdfU1RSSU5HX0FSR1VNRU5UOwotCQl9Ci0JCXNldFBhcmFtcy5kd0NhbGxiYWNrID0gMDsKLQkJaT0wOwotCQl3aGlsZSAoaTxucm9ma2V5d29yZHMpIHsKLQkJCWlmICghc3RyY21wKGtleXdvcmRzW2ldLCJET09SIikgJiYgaSsxPG5yb2ZrZXl3b3JkcykgewotCQkJCWlmICghc3RyY21wKGtleXdvcmRzW2krMV0sIk9QRU4iKSkKLQkJCQkJZHdGbGFncyB8PSBNQ0lfU0VUX0RPT1JfT1BFTjsKLQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzFdLCJDTE9TRUQiKSkKLQkJCQkJZHdGbGFncyB8PSBNQ0lfU0VUX0RPT1JfQ0xPU0VEOwotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIlRJTUUiKSAmJiAKLQkJCQkoaSsyPG5yb2ZrZXl3b3JkcykgJiYKLQkJCQkhc3RyY21wKGtleXdvcmRzW2krMV0sIkZPUk1BVCIpCi0JCQkpIHsKLQkJCQlkd0ZsYWdzIHw9IE1DSV9TRVRfVElNRV9GT1JNQVQ7Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsyXSwiTVMiKSkKLQkJCQkJc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfTVNGOwotCQkJCWlmICghc3RyY21wKGtleXdvcmRzW2krMl0sIk1JTExJU0VDT05EUyIpKQotCQkJCQlzZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM7Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsyXSwiTVNGIikpCi0JCQkJCXNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX01TRjsKLQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzJdLCJITVMiKSkgLyogdW50ZXN0ZWQgKi8KLQkJCQkJc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfSE1TOwotCQkJCWlmICghc3RyY21wKGtleXdvcmRzW2krMl0sIkZSQU1FUyIpKSAvKiB1bnRlc3RlZCAqLwotCQkJCQlzZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9GUkFNRVM7Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsyXSwiQllURVMiKSkgLyogdW50ZXN0ZWQgKi8KLQkJCQkJc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfQllURVM7Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsyXSwiU0FNUExFUyIpKSAvKiB1bnRlc3RlZCAqLwotCQkJCQlzZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TQU1QTEVTOwotCQkJCWlmICghc3RyY21wKGtleXdvcmRzW2krMl0sIlRNU0YiKSkgLyogdW50ZXN0ZWQgKi8KLQkJCQkJc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfVE1TRjsKLQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzJdLCJTTVBURSIpICYmIChpKzM8bnJvZmtleXdvcmRzKSkgewotCQkJCQkvKiBhbGwgdW50ZXN0ZWQgKi8KLQkJCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSszXSwiMjQiKSkKLQkJCQkJCXNldFBhcmFtcy5kd1RpbWVGb3JtYXQgPSBNQ0lfRk9STUFUX1NNUFRFXzI0OwotCQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzNdLCIyNSIpKQotCQkJCQkJc2V0UGFyYW1zLmR3VGltZUZvcm1hdCA9IE1DSV9GT1JNQVRfU01QVEVfMjU7Ci0JCQkJCWlmICghc3RyY21wKGtleXdvcmRzW2krM10sIjMwIikpCi0JCQkJCQlzZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMDsKLQkJCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSszXSwiMzBEUk9QIikpCi0JCQkJCQlzZXRQYXJhbXMuZHdUaW1lRm9ybWF0ID0gTUNJX0ZPUk1BVF9TTVBURV8zMERST1A7Ci0JCQkJCWkrKzsKLQkJCQkJLypGQUxMVEhST1VHSCovCi0JCQkJfQotCQkJCWkrPTM7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChhcmdzLCJBVURJTyIpICYmIChpKzE8bnJvZmtleXdvcmRzKSkgewotCQkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9BVURJTzsKLQkJCQkvKiBJJ20gbm90IHN1cmUgaWYgdGhvc2UgYmVsb25nIHRvIHRoZSBmbGFncy4uLgotCQkJCSAqIHRoZXkgY291bGQgYmVsb25nIHRvIHNldFBhcmFtcy5kd0F1ZGlvCi0JCQkJICovCi0JCQkJaWYgKCFzdHJjbXAoYXJncywiQUxMIikpCi0JCQkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9BVURJT19BTEw7Ci0JCQkJaWYgKCFzdHJjbXAoYXJncywiTEVGVCIpKQotCQkJCQlkd0ZsYWdzIHw9IE1DSV9TRVRfQVVESU9fTEVGVDsKLQkJCQlpZiAoIXN0cmNtcChhcmdzLCJSSUdIVCIpKQotCQkJCQlkd0ZsYWdzIHw9IE1DSV9TRVRfQVVESU9fUklHSFQ7Ci0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFzdHJjbXAoYXJncywiVklERU8iKSkgewotCQkJCS8qIGhvdyB0byBoYW5kbGUgdGhvc2U/ICovCi0JCQkJaSsrOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKCFzdHJjbXAoYXJncywiT04iKSkgewotCQkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9PTjsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChhcmdzLCJPRkYiKSkgewotCQkJCWR3RmxhZ3MgfD0gTUNJX1NFVF9PTjsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJX01DSV9DQUxMX0RSSVZFUihNQ0lfU0VULHNldFBhcmFtcyk7Ci0JCWlmIChyZXM9PTApIHsgLyogZG9lcyBzZXQgcmV0dXJuIGRhdGE/ICovIH0KLQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoIXN0cmNtcChjbWQsIkNBUEFCSUxJVFkiKSkgewotCQlNQ0lfR0VUREVWQ0FQU19QQVJNUwlnZGNQYXJhbXM7Ci0KLQkJZ2RjUGFyYW1zLmR3Q2FsbGJhY2sgPSAwOwotCQlpZiAoYXJncz09TlVMTCkgewotCQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQkJcmV0dXJuIE1DSUVSUl9NSVNTSU5HX1NUUklOR19BUkdVTUVOVDsKLQkJfQotCQlkd0ZsYWdzIHw9IE1DSV9HRVRERVZDQVBTX0lURU07Ci0JCWdkY1BhcmFtcy5kd0l0ZW0gPSAwOwotCQlpPTA7Ci0JCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgewotCQkJaWYgKAkhc3RyY21wKGtleXdvcmRzW2ldLCJERVZJQ0UiKSAmJiAKLQkJCQkoaSsxPG5yb2ZrZXl3b3JkcykgJiYKLQkJCQkhc3RyY21wKGtleXdvcmRzW2krMV0sIlRZUEUiKQotCQkJKSB7Ci0JCQkJZ2RjUGFyYW1zLmR3SXRlbSA9IE1DSV9HRVRERVZDQVBTX0RFVklDRV9UWVBFOwkKLQkJCQlpKz0yOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKAkhc3RyY21wKGtleXdvcmRzW2ldLCJIQVMiKSAmJgotCQkJCShpKzE8bnJvZmtleXdvcmRzKSAmJgotCQkJCSFzdHJjbXAoa2V5d29yZHNbaSsxXSwiQVVESU8iKQotCQkJKSB7Ci0JCQkJZ2RjUGFyYW1zLmR3SXRlbSA9IE1DSV9HRVRERVZDQVBTX0hBU19BVURJTzsJCi0JCQkJaSs9MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICgJIXN0cmNtcChrZXl3b3Jkc1tpXSwiSEFTIikgJiYKLQkJCQkoaSsxPG5yb2ZrZXl3b3JkcykgJiYKLQkJCQkhc3RyY21wKGtleXdvcmRzW2krMV0sIlZJREVPIikKLQkJCSkgewotCQkJCWdkY1BhcmFtcy5kd0l0ZW0gPSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU87CQotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIlVTRVMiKSAmJgotCQkJCShpKzE8bnJvZmtleXdvcmRzKSAmJgotCQkJCSFzdHJjbXAoa2V5d29yZHNbaSsxXSwiRklMRVMiKQotCQkJKSB7Ci0JCQkJZ2RjUGFyYW1zLmR3SXRlbSA9IE1DSV9HRVRERVZDQVBTX0hBU19WSURFTzsJCi0JCQkJaSs9MjsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWlmICgJIXN0cmNtcChrZXl3b3Jkc1tpXSwiQ09NUE9VTkQiKSAmJgotCQkJCShpKzE8bnJvZmtleXdvcmRzKSAmJgotCQkJCSFzdHJjbXAoa2V5d29yZHNbaSsxXSwiREVWSUNFIikKLQkJCSkgewotCQkJCWdkY1BhcmFtcy5kd0l0ZW0gPSBNQ0lfR0VUREVWQ0FQU19DT01QT1VORF9ERVZJQ0U7CQotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiQ0FOIikgJiYgKGkrMTxucm9ma2V5d29yZHMpKSB7Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsxXSwiUkVDT1JEIikpCi0JCQkJCWdkY1BhcmFtcy5kd0l0ZW0gPSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOwkKLQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzFdLCJQTEFZIikpCi0JCQkJCWdkY1BhcmFtcy5kd0l0ZW0gPSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWTsJCi0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsxXSwiRUpFQ1QiKSkKLQkJCQkJZ2RjUGFyYW1zLmR3SXRlbSA9IE1DSV9HRVRERVZDQVBTX0NBTl9FSkVDVDsJCi0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsxXSwiU0FWRSIpKQotCQkJCQlnZGNQYXJhbXMuZHdJdGVtID0gTUNJX0dFVERFVkNBUFNfQ0FOX1NBVkU7CQotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpKys7Ci0JCX0KLQkJcmVzPS0xOwotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9HRVRERVZDQVBTLGdkY1BhcmFtcyk7Ci0JCWZwcmludGYoc3RkZXJyLCJHRVRERVZDQVBTIHJldHVybmVkIHJlcz0lZFxuIixyZXMpOwotCQlpZiAocmVzPT0wKSB7Ci0JCQlzd2l0Y2ggKGdkY1BhcmFtcy5kd0l0ZW0pIHsKLQkJCWNhc2UgTUNJX0dFVERFVkNBUFNfREVWSUNFX1RZUEU6Ci0JCQkJc3dpdGNoIChnZGNQYXJhbXMuZHdSZXR1cm4pIHsKLQkJCQljYXNlIE1DSV9ERVZUWVBFX1ZDUjpfTUNJX1NUUigidmNyIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9WSURFT0RJU0M6X01DSV9TVFIoInZpZGVvZGlzYyIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0RFVlRZUEVfQ0RfQVVESU86X01DSV9TVFIoImNkIGF1ZGlvIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9PVkVSTEFZOl9NQ0lfU1RSKCJvdmVybGF5Iik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9EQVQ6X01DSV9TVFIoImRhdCIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0RFVlRZUEVfU0NBTk5FUjpfTUNJX1NUUigic2Nhbm5lciIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0RFVlRZUEVfQU5JTUFUSU9OOl9NQ0lfU1RSKCJhbmltYXRpb24iKTticmVhazsKLQkJCQljYXNlIE1DSV9ERVZUWVBFX0RJR0lUQUxfVklERU86X01DSV9TVFIoImRpZ2l0YWwgdmlkZW8iKTticmVhazsKLQkJCQljYXNlIE1DSV9ERVZUWVBFX09USEVSOl9NQ0lfU1RSKCJvdGhlciIpO2JyZWFrOwotCQkJCWNhc2UgTUNJX0RFVlRZUEVfV0FWRUZPUk1fQVVESU86X01DSV9TVFIoIndhdmVmb3JtIGF1ZGlvIik7YnJlYWs7Ci0JCQkJY2FzZSBNQ0lfREVWVFlQRV9TRVFVRU5DRVI6X01DSV9TVFIoInNlcXVlbmNlciIpO2JyZWFrOwotCQkJCWRlZmF1bHQ6ZnByaW50ZihzdGRuaW1wLCJtY2lTZW5kU3RyaW5nOkdFVENBUFNfREVWVFlQRTp1bmtub3duIHR5cGUgJWxkLCByZXBvcnQuXG4iLGdkY1BhcmFtcy5kd1JldHVybik7YnJlYWs7Ci0JCQkJfQotCQkJCWJyZWFrOwotCQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUExBWToKLQkJCWNhc2UgTUNJX0dFVERFVkNBUFNfQ0FOX0VKRUNUOgotCQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fUkVDT1JEOgotCQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19DQU5fU0FWRToKLQkJCWNhc2UgTUNJX0dFVERFVkNBUFNfSEFTX0FVRElPOgotCQkJY2FzZSBNQ0lfR0VUREVWQ0FQU19IQVNfVklERU86Ci0JCQljYXNlIE1DSV9HRVRERVZDQVBTX0NPTVBPVU5EX0RFVklDRToKLQkJCWNhc2UgTUNJX0dFVERFVkNBUFNfVVNFU19GSUxFUzoKLQkJCQkvKiB3ZWxsLCBpcyB0aGlzIHJpZ2h0PyBubyBleGFtcGxlIGhlcmUgKi8KLQkJCQlpZiAoZ2RjUGFyYW1zLmR3UmV0dXJuKQotCQkJCQlfTUNJX1NUUigidHJ1ZSIpOwotCQkJCWVsc2UKLQkJCQkJX01DSV9TVFIoImZhbHNlIik7Ci0JCQkJYnJlYWs7Ci0JCQlkZWZhdWx0OmZwcmludGYoc3RkbmltcCwibWNpU2VuZFN0cmluZzpHRVRERVZDQVBTOnVua25vd24gdHlwZSAlbGQsIHJlcG9ydC5cbiIsZ2RjUGFyYW1zLmR3SXRlbSk7YnJlYWs7Ci0JCQl9Ci0JCX0KLQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoIXN0cmNtcChjbWQsIlBBVVNFIikpIHsKLQkJTUNJX0dFTkVSSUNfUEFSTVMJZ2VuUGFyYW1zOwotCQlnZW5QYXJhbXMuZHdDYWxsYmFjaz0wOwotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9QQVVTRSxnZW5QYXJhbXMpOwotCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmICghc3RyY21wKGNtZCwiUExBWSIpKSB7Ci0JCWludAlucmFyZ3MsaixrLGFbNF07Ci0JCWNoYXIJKnBhcnNlc3RyOwotCQlNQ0lfUExBWV9QQVJNUwkJcGxheVBhcmFtczsKLQkJTUNJX1NUQVRVU19QQVJNUwlzdGF0dXNQYXJhbXM7Ci0KLQkJc3RhdHVzUGFyYW1zLmR3Q2FsbGJhY2s9MDsKLQkJc3RhdHVzUGFyYW1zLmR3SXRlbT1NQ0lfU1RBVFVTX1RJTUVfRk9STUFUOwotCQlkd0ZsYWdzIHw9IE1DSV9TVEFUVVNfSVRFTTsKLQkJX01DSV9DQUxMX0RSSVZFUihNQ0lfU1RBVFVTLHN0YXR1c1BhcmFtcyk7Ci0JCWR3RmxhZ3MgJj0gfk1DSV9TVEFUVVNfSVRFTTsKLQkJdGltZWY9c3RhdHVzUGFyYW1zLmR3UmV0dXJuOwotCQlzd2l0Y2ggKHRpbWVmKSB7Ci0JCWNhc2UgTUNJX0ZPUk1BVF9NSUxMSVNFQ09ORFM6Ci0JCWNhc2UgTUNJX0ZPUk1BVF9GUkFNRVM6Ci0JCWNhc2UgTUNJX0ZPUk1BVF9CWVRFUzoKLQkJY2FzZSBNQ0lfRk9STUFUX1NBTVBMRVM6Ci0JCQlucmFyZ3M9MTsKLQkJCXBhcnNlc3RyPSIlZCI7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfRk9STUFUX0hNUzoKLQkJY2FzZSBNQ0lfRk9STUFUX01TRjoKLQkJCXBhcnNlc3RyPSIlZDolZDolZCI7Ci0JCQlucmFyZ3M9MzsKLQkJCWJyZWFrOwotCQljYXNlIE1DSV9GT1JNQVRfVE1TRjoKLQkJCXBhcnNlc3RyPSIlZDolZDolZDolZCI7Ci0JCQlucmFyZ3M9NDsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OmZwcmludGYoc3RkbmltcCwibWNpU2VuZFN0cmluZzpQTEFZOnVua25vd24gdGltZWZvcm1hdCAlZCwgcGxlYXNlIHJlcG9ydC5cbiIsdGltZWYpOwotCQkJcGFyc2VzdHI9IiVkIjsKLQkJCW5yYXJncz0xOwotCQkJYnJlYWs7Ci0JCX0KLQkJcGxheVBhcmFtcy5kd0NhbGxiYWNrPTA7Ci0JCWk9MDsKLQkJd2hpbGUgKGk8bnJvZmtleXdvcmRzKSB7Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIlRPIikgJiYKLQkJCQkoaSsxPG5yb2ZrZXl3b3JkcykKLQkJCSkgewotCQkJCWR3RmxhZ3MgfD0gTUNJX1RPOwotCQkJCWFbMF09YVsxXT1hWzJdPWFbM109MDsKLQkJCQlqPXNzY2FuZihrZXl3b3Jkc1tpKzFdLHBhcnNlc3RyLCZhWzBdLCZhWzFdLCZhWzJdLCZhWzNdKTsKLQkJCQkvKiBhZGQgdXAgYWxsIGludGVnZXJzIHdlIGdvdCwgaWYgd2UgaGF2ZSBtb3JlIAotCQkJCSAqIHNoaWZ0IHRoZW0uIChXZWxsIEkgc2hvdWxkIHVzZSB0aGUgbWFjcm9zIGluIAotCQkJCSAqIG1tc3lzdGVtLmgsIHJpZ2h0KS4KLQkJCQkgKi8KLQkJCQlwbGF5UGFyYW1zLmR3VG89MDsKLQkJCQlmb3IgKGs9MDtrPGo7aysrKQotCQkJCQlwbGF5UGFyYW1zLmR3VG8rPWFba108PCg4KihucmFyZ3MtaykpOwotCQkJCWkrPTI7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoCSFzdHJjbXAoa2V5d29yZHNbaV0sIkZST00iKSAmJgotCQkJCShpKzE8bnJvZmtleXdvcmRzKQotCQkJKSB7Ci0JCQkJZHdGbGFncyB8PSBNQ0lfRlJPTTsKLQkJCQlhWzBdPWFbMV09YVsyXT1hWzNdPTA7Ci0JCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7Ci0JCQkJLyogZGl0by4gKi8KLQkJCQlwbGF5UGFyYW1zLmR3RnJvbT0wOwotCQkJCWZvciAoaz0wO2s8ajtrKyspCi0JCQkJCXBsYXlQYXJhbXMuZHdGcm9tKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKLQkJCQlpKz0yOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaSsrOwotCQl9Ci0JCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1BMQVkscGxheVBhcmFtcyk7Ci0JCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKCFzdHJjbXAoY21kLCJTVE9QIikpIHsKLQkJTUNJX0dFTkVSSUNfUEFSTVMJZ2VuUGFyYW1zOwotCQlnZW5QYXJhbXMuZHdDYWxsYmFjaz0wOwotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9TVE9QLGdlblBhcmFtcyk7Ci0JCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKLQkJcmV0dXJuIHJlczsKLQl9Ci0JaWYgKCFzdHJjbXAoY21kLCJTRUVLIikpIHsKLQkJaW50CW5yYXJncyxqLGssYVs0XTsKLQkJY2hhcgkqcGFyc2VzdHI7Ci0JCU1DSV9TVEFUVVNfUEFSTVMJc3RhdHVzUGFyYW1zOwotCQlNQ0lfU0VFS19QQVJNUwlzZWVrUGFyYW1zOwotCi0JCXN0YXR1c1BhcmFtcy5kd0NhbGxiYWNrPTA7Ci0JCXN0YXR1c1BhcmFtcy5kd0l0ZW09TUNJX1NUQVRVU19USU1FX0ZPUk1BVDsKLQkJZHdGbGFncyB8PSBNQ0lfU1RBVFVTX0lURU07Ci0JCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX1NUQVRVUyxzdGF0dXNQYXJhbXMpOwotCQlkd0ZsYWdzICY9IH5NQ0lfU1RBVFVTX0lURU07Ci0JCXRpbWVmPXN0YXR1c1BhcmFtcy5kd1JldHVybjsKLQkJc3dpdGNoICh0aW1lZikgewotCQljYXNlIE1DSV9GT1JNQVRfTUlMTElTRUNPTkRTOgotCQljYXNlIE1DSV9GT1JNQVRfRlJBTUVTOgotCQljYXNlIE1DSV9GT1JNQVRfQllURVM6Ci0JCWNhc2UgTUNJX0ZPUk1BVF9TQU1QTEVTOgotCQkJbnJhcmdzPTE7Ci0JCQlwYXJzZXN0cj0iJWQiOwotCQkJYnJlYWs7Ci0JCWNhc2UgTUNJX0ZPUk1BVF9ITVM6Ci0JCWNhc2UgTUNJX0ZPUk1BVF9NU0Y6Ci0JCQlwYXJzZXN0cj0iJWQ6JWQ6JWQiOwotCQkJbnJhcmdzPTM7Ci0JCQlicmVhazsKLQkJY2FzZSBNQ0lfRk9STUFUX1RNU0Y6Ci0JCQlwYXJzZXN0cj0iJWQ6JWQ6JWQ6JWQiOwotCQkJbnJhcmdzPTQ7Ci0JCQlicmVhazsKLQkJZGVmYXVsdDpmcHJpbnRmKHN0ZG5pbXAsIm1jaVNlbmRTdHJpbmc6U0VFSzp1bmtub3duIHRpbWVmb3JtYXQgJWQsIHBsZWFzZSByZXBvcnQuXG4iLHRpbWVmKTsKLQkJCXBhcnNlc3RyPSIlZCI7Ci0JCQlucmFyZ3M9MTsKLQkJCWJyZWFrOwotCQl9Ci0JCXNlZWtQYXJhbXMuZHdDYWxsYmFjaz0wOwotCQlpPTA7Ci0JCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgewotCQkJaWYgKAkhc3RyY21wKGtleXdvcmRzW2ldLCJUTyIpICYmCi0JCQkJKGkrMTxucm9ma2V5d29yZHMpCi0JCQkpIHsKLQkJCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpKzFdLCJTVEFSVCIpKSB7Ci0JCQkJCWR3RmxhZ3M9TUNJX1NFRUtfVE9fU1RBUlQ7Ci0JCQkJCXNlZWtQYXJhbXMuZHdUbz0wOwotCQkJCQlpKz0yOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaSsxXSwiRU5EIikpIHsKLQkJCQkJZHdGbGFncz1NQ0lfU0VFS19UT19FTkQ7Ci0JCQkJCXNlZWtQYXJhbXMuZHdUbz0wOwotCQkJCQlpKz0yOwotCQkJCQljb250aW51ZTsKLQkJCQl9Ci0JCQkJZHdGbGFncz1NQ0lfVE87Ci0JCQkJaSs9MjsKLQkJCQlhWzBdPWFbMV09YVsyXT1hWzNdPTA7Ci0JCQkJaj1zc2NhbmYoa2V5d29yZHNbaSsxXSxwYXJzZXN0ciwmYVswXSwmYVsxXSwmYVsyXSwmYVszXSk7Ci0JCQkJc2Vla1BhcmFtcy5kd1RvPTA7Ci0JCQkJZm9yIChrPTA7azxqO2srKykKLQkJCQkJc2Vla1BhcmFtcy5kd1RvKz1hW2tdPDwoOCoobnJhcmdzLWspKTsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlfTUNJX0NBTExfRFJJVkVSKE1DSV9TRUVLLHNlZWtQYXJhbXMpOwotCQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7Ci0JCXJldHVybiByZXM7Ci0JfQotCWlmICghc3RyY21wKGNtZCwiQ0xPU0UiKSkgewotCQlNQ0lfR0VORVJJQ19QQVJNUwljbG9zZVBhcmFtczsKLQotCQljbG9zZVBhcmFtcy5kd0NhbGxiYWNrPTA7Ci0JCV9NQ0lfQ0FMTF9EUklWRVIoTUNJX0NMT1NFLGNsb3NlUGFyYW1zKTsKLQkJZnJlZShrZXl3b3Jkcyk7ZnJlZShjbWQpOwotCQlyZXR1cm4gcmVzOwotCX0KLQlpZiAoIXN0cmNtcChjbWQsIklORk8iKSkgewotCQlNQ0lfSU5GT19QQVJNUwlpbmZvUGFyYW1zOwotCi0JCWR3RmxhZ3M9LTE7Ci0JCXdoaWxlIChpPG5yb2ZrZXl3b3JkcykgewotCQkJaWYgKCFzdHJjbXAoa2V5d29yZHNbaV0sIlBST0RVQ1QiKSkgewotCQkJCWR3RmxhZ3M9TUNJX0lORk9fUFJPRFVDVDsKLQkJCQlpKys7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAoIXN0cmNtcChrZXl3b3Jkc1tpXSwiRklMRSIpKSB7Ci0JCQkJZHdGbGFncz1NQ0lfSU5GT19GSUxFOwotCQkJCWkrKzsKLQkJCQljb250aW51ZTsKLQkJCX0KLQkJCWkrKzsKLQkJfQotCQlpZiAoZHdGbGFncz09LTEpIHsKLQkJCWZyZWUoa2V5d29yZHMpO2ZyZWUoY21kKTsKLQkJCXJldHVybiBNQ0lFUlJfTUlTU0lOR19TVFJJTkdfQVJHVU1FTlQ7Ci0JCX0KLQkJX01DSV9DQUxMX0RSSVZFUihNQ0lfSU5GTyxpbmZvUGFyYW1zKTsKLQkJaWYgKHJlcz09MCkgewotCQkJX01DSV9TVFIoaW5mb1BhcmFtcy5scHN0clJldHVybik7Ci0JCX0KLQkJZnJlZShjbWQpO2ZyZWUoa2V5d29yZHMpOwotCQlyZXR1cm4gcmVzOwotCX0KLQlmcHJpbnRmKHN0ZG5pbXAsICJtY2lTZW5kU3RyaW5nKCclcycsICVwLCAldSwgJVgpIC8vIHVuaW1wbGVtZW50ZWQsIHBsZWFzZSByZXBvcnQuXG4iLCBscHN0ckNvbW1hbmQsIAotCQlscHN0clJldHVyblN0cmluZywgdVJldHVybkxlbmd0aCwgaHduZENhbGxiYWNrCi0JKTsKLQlmcmVlKGtleXdvcmRzKTtmcmVlKGNtZCk7Ci0JcmV0dXJuIE1DSUVSUl9NSVNTSU5HX0NPTU1BTkRfU1RSSU5HOwotfQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogCQkJCW1jaVNldFlpZWxkUHJvYwkJW01NU1lTVEVNLjcxNF0KICovCmRpZmYgLS1naXQgYS9vYmplY3RzL01ha2VmaWxlLmluIGIvb2JqZWN0cy9NYWtlZmlsZS5pbgppbmRleCA2NTljN2NlLi45YTlhNmFmIDEwMDY0NAotLS0gYS9vYmplY3RzL01ha2VmaWxlLmluCisrKyBiL29iamVjdHMvTWFrZWZpbGUuaW4KQEAgLTI5LDcgKzI5LDcgQEAKIAltdiB0bXBfbWFrZSBNYWtlZmlsZQogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gdG1wX21ha2UKKwlybSAtZiAqLm8gXCMqXCMgKn4gKi5iYWsgdG1wX21ha2UKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9vYmplY3RzL2JpdGJsdC5jIGIvb2JqZWN0cy9iaXRibHQuYwppbmRleCAzODA3NGRiLi5hYjhkYWY5IDEwMDY0NAotLS0gYS9vYmplY3RzL2JpdGJsdC5jCisrKyBiL29iamVjdHMvYml0Ymx0LmMKQEAgLTEzMDIsMyArMTMwMiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkY0RzdCwgeERzdCwgeURzdCwgd2lkdGhEc3QsIGhlaWdodERzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGNTcmMsIHhTcmMsIHlTcmMsIHdpZHRoU3JjLCBoZWlnaHRTcmMsIHJvcCApOwogfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiAgICAgICAgICAgRmFzdFdpbmRvd0ZyYW1lICAgIChHREkuNDAwKQorICovCitXT1JECitGYXN0V2luZG93RnJhbWUoV09SRCB4MSxEV09SRCB4MixXT1JEIHgzLFdPUkQgeDQsRFdPUkQgeDUpIHsKKwlkcHJpbnRmX2dkaShzdGRuaW1wLCJGYXN0V2luZG93RnJhbWUgKCUwNHgsICUwOGx4LCAlMDR4LCAlMDR4LCAlMDhseCkgLy8gdW5pbXBsZW1lbnRlZCFcbiIseDEseDIseDMseDQseDUpOworCXJldHVybiAweEZGRkY7IC8qIGZhaWxlZD8gKi8KK30KZGlmZiAtLWdpdCBhL29iamVjdHMvZm9udC5jIGIvb2JqZWN0cy9mb250LmMKaW5kZXggMjAwYjYwNS4uYmJlYjYzNCAxMDA2NDQKLS0tIGEvb2JqZWN0cy9mb250LmMKKysrIGIvb2JqZWN0cy9mb250LmMKQEAgLTc4LDcgKzc4LDcgQEAKICAgICBGb250TmFtZXNbMF0ueDExID0gc3RyZHVwKCB0ZW1wICk7CiAKICAgfSBlbHNlIHsKLSAgICBGb250TmFtZXNbMF0ud2luZG93ID0gTlVMTDsgRm9udE5hbWVzWzBdLngxMSA9ICJiaXRzdHJlYW0tY291cmllciI7CisgICAgRm9udE5hbWVzWzBdLndpbmRvdyA9IE5VTEw7IEZvbnROYW1lc1swXS54MTEgPSAiKi1oZWx2ZXRpY2EiOwogICAgIEZvbnROYW1lc1sxXS53aW5kb3cgPSAibXMgc2FucyBzZXJpZiI7IEZvbnROYW1lc1sxXS54MTEgPSAiKi1oZWx2ZXRpY2EiOwogICAgIEZvbnROYW1lc1syXS53aW5kb3cgPSAibXMgc2VyaWYiOyBGb250TmFtZXNbMl0ueDExID0gIiotdGltZXMiOwogICAgIEZvbnROYW1lc1szXS53aW5kb3cgPSAiZml4ZWRzeXMiOyBGb250TmFtZXNbM10ueDExID0gIiotZml4ZWQiOwpAQCAtMzEzLDcgKzMxMyw4IEBACiB7CiAgICAgTE9HRk9OVCBsb2dmb250ID0geyBoZWlnaHQsIHdpZHRoLCBlc2MsIG9yaWVudCwgd2VpZ2h0LCBpdGFsaWMsIHVuZGVybGluZSwKIAkJICAgIHN0cmlrZW91dCwgY2hhcnNldCwgb3V0cHJlcywgY2xpcHByZXMsIHF1YWxpdHksIHBpdGNoLCB9OwotICAgIHN0cm5jcHkoIGxvZ2ZvbnQubGZGYWNlTmFtZSwgbmFtZSwgTEZfRkFDRVNJWkUgKTsKKyAgICBpZiAobmFtZSkgc3RybmNweSggbG9nZm9udC5sZkZhY2VOYW1lLCBuYW1lLCBMRl9GQUNFU0laRSApOworICAgIGVsc2UgbG9nZm9udC5sZkZhY2VOYW1lWzBdID0gJ1wwJzsKICAgICByZXR1cm4gQ3JlYXRlRm9udEluZGlyZWN0KCAmbG9nZm9udCApOwogfQogCmRpZmYgLS1naXQgYS9vYmplY3RzL29lbWJpdG1hcC5jIGIvb2JqZWN0cy9vZW1iaXRtYXAuYwppbmRleCA2YmIyNTgxLi5lY2Q0MGI0IDEwMDY0NAotLS0gYS9vYmplY3RzL29lbWJpdG1hcC5jCisrKyBiL29iamVjdHMvb2VtYml0bWFwLmMKQEAgLTM1LDE2ICszNSwxMSBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX2RuYXJyb3dkIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3VwYXJyb3dkIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3Jlc3RvcmVkIgotI2luY2x1ZGUgImJpdG1hcHMvb2JtX3pvb21kIgotI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JlZHVjZWQiCiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fcmVzdG9yZSIKLSNpbmNsdWRlICJiaXRtYXBzL29ibV96b29tIgotI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JlZHVjZSIKICNpbmNsdWRlICJiaXRtYXBzL29ibV9sZmFycm93IgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JnYXJyb3ciCiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fZG5hcnJvdyIKICNpbmNsdWRlICJiaXRtYXBzL29ibV91cGFycm93IgotI2luY2x1ZGUgImJpdG1hcHMvb2JtX2Nsb3NlIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX29sZF9yZXN0b3JlIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX29sZF96b29tIgogI2luY2x1ZGUgImJpdG1hcHMvb2JtX29sZF9yZWR1Y2UiCkBAIC01OSw2ICs1NCwyMSBAQAogI2luY2x1ZGUgImJpdG1hcHMvb2JtX3NpemUiCiAjaW5jbHVkZSAiYml0bWFwcy9vYm1fb2xkX2Nsb3NlIgogCisjaWZuZGVmIFdJTl85NV9MT09LCisjaW5jbHVkZSAiYml0bWFwcy9vYm1fem9vbWQiCisjaW5jbHVkZSAiYml0bWFwcy9vYm1fcmVkdWNlZCIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV96b29tIgorI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JlZHVjZSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9jbG9zZSIKKyNlbHNlCisjaW5jbHVkZSAiYml0bWFwcy9vYm1fem9vbWRfOTUiCisjaW5jbHVkZSAiYml0bWFwcy9vYm1fcmVkdWNlZF85NSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV96b29tXzk1IgorI2luY2x1ZGUgImJpdG1hcHMvb2JtX3JlZHVjZV85NSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9jbG9zZV85NSIKKyNpbmNsdWRlICJiaXRtYXBzL29ibV9jbG9zZWRfOTUiCisjZW5kaWYgIC8qIFdJTl85NV9MT09LICovCisKICNkZWZpbmUgT0JNX0ZJUlNUICBPQk1fQ0RST00gICAgICAvKiBGaXJzdCBPRU0gYml0bWFwICovCiAjZGVmaW5lIE9CTV9MQVNUICAgT0JNX09MRF9DTE9TRSAgIC8qIExhc3QgT0VNIGJpdG1hcCAqLwogCkBAIC04NiwxMyArOTYsMjIgQEAKICAgICB7IG9ibV96b29tZCwgVFJVRSB9LCAgICAgICAgLyogT0JNX1pPT01EICovCiAgICAgeyBvYm1fcmVkdWNlZCwgVFJVRSB9LCAgICAgIC8qIE9CTV9SRURVQ0VEICovCiAgICAgeyBvYm1fcmVzdG9yZSwgVFJVRSB9LCAgICAgIC8qIE9CTV9SRVNUT1JFICovCisjaWZkZWYgV0lOXzk1X0xPT0sKKyAgICB7IG9ibV96b29tXzk1LCBUUlVFIH0sICAgICAgLyogT0JNX1pPT00gKi8KKyAgICB7IG9ibV9yZWR1Y2VfOTUsIFRSVUUgfSwgICAgLyogT0JNX1JFRFVDRSAqLworI2Vsc2UKICAgICB7IG9ibV96b29tLCBUUlVFIH0sICAgICAgICAgLyogT0JNX1pPT00gKi8KICAgICB7IG9ibV9yZWR1Y2UsIFRSVUUgfSwgICAgICAgLyogT0JNX1JFRFVDRSAqLworI2VuZGlmCiAgICAgeyBvYm1fbGZhcnJvdywgVFJVRSB9LCAgICAgIC8qIE9CTV9MRkFSUk9XICovCiAgICAgeyBvYm1fcmdhcnJvdywgVFJVRSB9LCAgICAgIC8qIE9CTV9SR0FSUk9XICovCiAgICAgeyBvYm1fZG5hcnJvdywgVFJVRSB9LCAgICAgIC8qIE9CTV9ETkFSUk9XICovCiAgICAgeyBvYm1fdXBhcnJvdywgVFJVRSB9LCAgICAgIC8qIE9CTV9VUEFSUk9XICovCisjaWZkZWYgV0lOXzk1X0xPT0sKKyAgICB7IG9ibV9jbG9zZV85NSwgVFJVRSB9LCAgICAgLyogT0JNX0NMT1NFICovCisjZWxzZQogICAgIHsgb2JtX2Nsb3NlLCBUUlVFIH0sICAgICAgICAvKiBPQk1fQ0xPU0UgKi8KKyNlbmRpZgogICAgIHsgb2JtX29sZF9yZXN0b3JlLCBGQUxTRSB9LCAvKiBPQk1fT0xEX1JFU1RPUkUgKi8KICAgICB7IG9ibV9vbGRfem9vbSwgRkFMU0UgfSwgICAgLyogT0JNX09MRF9aT09NICovCiAgICAgeyBvYm1fb2xkX3JlZHVjZSwgRkFMU0UgfSwgIC8qIE9CTV9PTERfUkVEVUNFICovCkBAIC0xNjMsNiArMTgyLDcgQEAKICAgICB7ICJidXR0b25fZmFjZSIsICAgICAgUEFMRVRURUlOREVYKENPTE9SX0JUTkZBQ0UpIH0sCiAgICAgeyAiYnV0dG9uX3NoYWRvdyIsICAgIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5TSEFET1cpIH0sCiAgICAgeyAiYnV0dG9uX2hpZ2hsaWdodCIsIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5ISUdITElHSFQpIH0sCisgICAgeyAiYnV0dG9uX2VkZ2UiLCAgICAgIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5ISUdITElHSFQpIH0sCiAgICAgeyAiYnV0dG9uX3RleHQiLCAgICAgIFBBTEVUVEVJTkRFWChDT0xPUl9CVE5URVhUKSB9LAogICAgIHsgIndpbmRvd19mcmFtZSIsICAgICBQQUxFVFRFSU5ERVgoQ09MT1JfV0lORE9XRlJBTUUpIH0KIH07CmRpZmYgLS1naXQgYS9yYy9DaGFuZ2VMb2cgYi9yYy9DaGFuZ2VMb2cKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODgzNWYuLjAwMDAwMDAKLS0tIGEvcmMvQ2hhbmdlTG9nCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TdW4gU2VwICAyNSAxMjowMDowMCBQRFQgMTk5NAk8bWFydGluQG9zaXJpcy5jcy5jc3VmcmVzbm8uZWR1PgotCi0JKiBbcmMvcmMueV0gW3JjL3JjLmhdIFtyYy9yYy5sXSBbcmMvd2luZXJjLmNdCi0JRmlsZXMgY3JlYXRlZApkaWZmIC0tZ2l0IGEvcmMvTWFrZWZpbGUuaW4gYi9yYy9NYWtlZmlsZS5pbgppbmRleCA5MmJjNWY4Li42M2M0MmQwIDEwMDY0NAotLS0gYS9yYy9NYWtlZmlsZS5pbgorKysgYi9yYy9NYWtlZmlsZS5pbgpAQCAtMzQsOCArMzQsOCBAQAogCSQoQ09NUElMRSkgLWMgLW8gJCoubyAkPAogCiBjbGVhbjoKLQlybSAtZiAqLm8gXCMqXCMgKn4gbGV4Lnl5LmMgc3lzcmVzLnRtcCBzeXNyZXMucmN0IHdpbmVyYyB5LnRhYi5jIFwKLQl5LnRhYi5oIHN5c3Jlcy5jIHN5c3Jlcy5oIHRtcF9tYWtlCisJcm0gLWYgKi5vIFwjKlwjICp+ICouYmFrIHRtcF9tYWtlCisJcm0gLWYgbGV4Lnl5LmMgc3lzcmVzLnRtcCBzeXNyZXMucmN0IHdpbmVyYyB5LnRhYi5jIHkudGFiLmggc3lzcmVzLmMgc3lzcmVzLmgKIAogZGlzdGNsZWFuOiBjbGVhbgogCXJtIC1mIE1ha2VmaWxlCmRpZmYgLS1naXQgYS9yYy9yYy5oIGIvcmMvcmMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA2NGM2MC4uMDAwMDAwMAotLS0gYS9yYy9yYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA2ICswLDAgQEAKLS8qCi0gKgotICogQ29weXJpZ2h0ICBNYXJ0aW4gdm9uIExvZXdpcywgMTk5NAotICoKLSAqLwotCi0vKiByZXNvdXJjZSB0eXBlcyAqLwotZW51bSBydCB7YWNjLGJtcCxjdXIsZGxnLGZudCxpY28sbWVuLHJkdCxzdHJ9OwotLyogZ2VuZXJpYyByZXNvdXJjZQotICAgQnl0ZXMgY2FuIGJlIGluc2VydGVkIGF0IGFyYml0cmFyeSBwb3NpdGlvbnMsIHRoZSBkYXRhIGZpZWxkIChyZXMpIAotICAgZ3Jvd3MgYXMgcmVxdWlyZWQuIEFzIHRoZSBkaWFsb2cgaGVhZGVyIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgCi0gICBjb250cm9scywgdGhpcyBudW1iZXIgaXMgZ2VuZXJhdGVkIGluIG51bV9lbnRyaWVzLiBJZiBuX3R5cGUgaWYgMCwKLSAgIHRoZSByZXNvdXJjZSBuYW1lIGlzIGlfbmFtZSwgYW5kIHNfbmFtZSBvdGhlcndpc2UuIFRvcCBsZXZlbAotICAgcmVzb3VyY2VzIGFyZSBsaW5rZWQgdmlhIG5leHQuIEFsbCBnZW5fcmVzIG9iamVjdHMgYXJlIGxpbmtlZCB2aWEKLSAgIGdfcHJldiwgZ19uZXh0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuIHNwYWNlIGlzIHRoZSBsZW5ndGggb2YgcmVzLAotICAgc2l6ZSBpcyB0aGUgdXNlZCBwYXJ0IG9mIHJlcy4KLSAgIEFzIG1vc3QgYmlzb24gcnVsZXMgYXJlIHJpZ2h0IHJlY3Vyc2l2ZSwgbmV3IGl0ZW1zIGFyZSB1c3VhbGx5IAotICAgaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZwotKi8gICAKLXR5cGVkZWYgc3RydWN0IGdlbl9yZXN7Ci0JaW50IHNpemUsc3BhY2U7Ci0JaW50IG51bV9lbnRyaWVzOwotCWVudW0gcnQgdHlwZTsKLQl1bmlvbnsKLQkJaW50IGlfbmFtZTsKLQkJY2hhciogc19uYW1lOwotCX1uOwotCWludCBuX3R5cGU7IC8qMCAtIGludGVnZXIsIDEgPSBzdHJpbmcqLwotCXN0cnVjdCBnZW5fcmVzICpuZXh0OwotCXN0cnVjdCBnZW5fcmVzICpnX3ByZXYsKmdfbmV4dDsKLQl1bnNpZ25lZCBjaGFyIHJlc1swXTsKLX0gZ2VuX3JlczsKLQotLyogY29udHJvbC9kaWFsb2cgc3R5bGUuIG9yIGNvbGxlY3RzIHN0eWxlcywgYW5kIGNvbGxlY3RzIE5PVCBzdHlsZXMgKi8KLXR5cGVkZWYgc3RydWN0IHJjX3N0eWxlewotCWludCBhbmQsIG9yOwotfXJjX3N0eWxlOwotCi0vKiBjcmVhdGUgYSBuZXcgcmVzb3VyY2UgKi8KLWdlbl9yZXMgKm5ld19yZXModm9pZCk7Ci0vKiBkb3VibGUgdGhlIHNwYWNlIG9mIHRoZSByZXNvdXJjZSAqLwotZ2VuX3JlcyogZ3JvdyhnZW5fcmVzKik7Ci0vKiBpbnNlcnQgYnl0ZSBhcnJheSBhdCB0aGUgYmVnaW5uaW5nLCBpbmNyZWFzZSBjb3VudCAqLwotZ2VuX3JlcyogaW5zZXJ0X2F0X2JlZ2lubmluZyhnZW5fcmVzKixjaGFyKixpbnQpOwotLyogaW5zZXJ0IGJ5dGUgYXJyYXkgYXQgb2Zmc2V0ICovCi1nZW5fcmVzKiBpbnNlcnRfYnl0ZXMoZ2VuX3JlcyosY2hhciosaW50LGludCk7Ci0vKiBkZWxldGUgYnl0ZXMgYXQgb2Zmc2V0ICovCi1nZW5fcmVzKiBkZWxldGVfYnl0ZXMoZ2VuX3JlcyosaW50LGludCk7Ci0vKiBjcmVhdGUgYSBuZXcgc3R5bGUgKi8KLXJjX3N0eWxlKiBuZXdfc3R5bGUodm9pZCk7Ci0vKiBjb252ZXJ0IFx0IHRvIHRhYiBldGMuICovCi1jaGFyKiBwYXJzZV9jX3N0cmluZyhjaGFyKik7Ci0vKiBnZXQgdGhlIHJlc291cmNlcyB0eXBlLCBjb252ZXJ0IGRsZyB0byAiRElBTE9HIiBhbmQgc28gb24gKi8KLWNoYXIqIGdldF90eXBlbmFtZShnZW5fcmVzKik7Ci0KLWdlbl9yZXMqIGFkZF9hY2NlbGVyYXRvcihpbnQsaW50LGludCxnZW5fcmVzKik7Ci1nZW5fcmVzKiBhZGRfc3RyaW5nX2FjY2VsZXJhdG9yKGNoYXIqLGludCxpbnQsZ2VuX3JlcyopOwotZ2VuX3JlcyogYWRkX2FzY2lpX2FjY2VsZXJhdG9yKGludCxpbnQsaW50LGdlbl9yZXMqKTsKLWdlbl9yZXMqIGFkZF92a19hY2NlbGVyYXRvcihpbnQsaW50LGludCxnZW5fcmVzKik7Ci0KLWdlbl9yZXMqIG5ld19kaWFsb2codm9pZCk7Ci1nZW5fcmVzKiBkaWFsb2dfc3R5bGUocmNfc3R5bGUqLGdlbl9yZXMqKTsKLWludCBkaWFsb2dfZ2V0X21lbnUoZ2VuX3JlcyopOwotaW50IGRpYWxvZ19nZXRfY2xhc3MoZ2VuX3JlcyopOwotaW50IGRpYWxvZ19nZXRfY2FwdGlvbihnZW5fcmVzKik7Ci1pbnQgZGlhbG9nX2dldF9mb250c2l6ZShnZW5fcmVzKik7Ci1nZW5fcmVzKiBkaWFsb2dfY2FwdGlvbihjaGFyKixnZW5fcmVzKik7Ci1nZW5fcmVzKiBkaWFsb2dfZm9udChzaG9ydCxjaGFyKixnZW5fcmVzKik7Ci1nZW5fcmVzKiBkaWFsb2dfY2xhc3MoY2hhciosZ2VuX3JlcyopOwotZ2VuX3JlcyogZGlhbG9nX21lbnUoY2hhciosZ2VuX3JlcyopOwotZ2VuX3JlcyogY3JlYXRlX2NvbnRyb2xfZGVzYyhpbnQsaW50LGludCxpbnQsaW50LHJjX3N0eWxlKik7Ci1nZW5fcmVzKiBsYWJlbF9jb250cm9sX2Rlc2MoY2hhciosZ2VuX3JlcyopOwotZ2VuX3JlcyogY3JlYXRlX2dlbmVyaWNfY29udHJvbChjaGFyKixpbnQsY2hhcioscmNfc3R5bGUqLGludCxpbnQsaW50LGludCk7Ci1nZW5fcmVzKiBhZGRfY29udHJvbChpbnQsaW50LGdlbl9yZXMqLGdlbl9yZXMqKTsKLWdlbl9yZXMqIGFkZF9pY29uKGNoYXIqLGludCxpbnQsaW50LGdlbl9yZXMqLGdlbl9yZXMqKTsKLWdlbl9yZXMqIGFkZF9nZW5lcmljX2NvbnRyb2woZ2VuX3JlcyosZ2VuX3JlcyopOwotZ2VuX3JlcyogbWFrZV9kaWFsb2coZ2VuX3JlcyosaW50LGludCxpbnQsaW50LGdlbl9yZXMqKTsKLQotZ2VuX3JlcyAqaGV4X3RvX3JhdyhjaGFyKixnZW5fcmVzKik7Ci1nZW5fcmVzICptYWtlX2JpdG1hcChnZW5fcmVzKik7Ci1nZW5fcmVzICptYWtlX2ljb24oZ2VuX3JlcyopOwotZ2VuX3JlcyAqbWFrZV9jdXJzb3IoZ2VuX3JlcyopOwotZ2VuX3JlcyAqbG9hZF9maWxlKGNoYXIqKTsKLQotZ2VuX3JlcyAqYWRkX21lbnVpdGVtKGNoYXIqLGludCxpbnQsZ2VuX3JlcyopOwotZ2VuX3JlcyAqYWRkX3BvcHVwKGNoYXIqLHNob3J0LGdlbl9yZXMqLGdlbl9yZXMqKTsKLWdlbl9yZXMgKm1ha2VfbWVudShnZW5fcmVzKik7Ci0KLWdlbl9yZXMgKmFkZF9yZXNvdXJjZShnZW5fcmVzKixnZW5fcmVzKik7Ci0KLXZvaWQgY3JlYXRlX291dHB1dChnZW5fcmVzKik7Ci12b2lkIHNldF9vdXRfZmlsZShjaGFyKik7Ci0KLSNkZWZpbmUgQ1RfQlVUVE9OIAkweDgwCi0jZGVmaW5lIENUX0VESVQgCTB4ODEKLSNkZWZpbmUgQ1RfU1RBVElDIAkweDgyCi0jZGVmaW5lIENUX0xJU1RCT1gJMHg4MwotI2RlZmluZSBDVF9TQ1JPTExCQVIgMHg4NAotI2RlZmluZSBDVF9DT01CT0JPWAkweDg1Ci0KLWV4dGVybiBpbnQgdmVyYm9zZTsKLQotI2lmZGVmIF9fc3VuX18KLSNkZWZpbmUgc3RydG91bCBzdHJ0b2wKLSNlbmRpZgotCmRpZmYgLS1naXQgYS9yYy9yYy5sIGIvcmMvcmMubApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc3MzgyMC4uMDAwMDAwMAotLS0gYS9yYy9yYy5sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotJXsKLS8qCi0gKgotICogQ29weXJpZ2h0ICBNYXJ0aW4gdm9uIExvZXdpcywgMTk5NAotICoKLSAqLwotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiB2b24gTG9ld2lzLCAxOTk0IjsKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSAicmMuaCIKLSNpbmNsdWRlICJyYy50YWIuaCIKLSV9Ci0lJQotQUNDRUxFUkFUT1JTCXJldHVybiBBQ0NFTEVSQVRPUlM7Ci1BTFQJCXJldHVybiBBTFQ7Ci1BU0NJSQkJcmV0dXJuIEFTQ0lJOwotQkVHSU4JCXJldHVybiB0QkVHSU47Ci1CSVRNQVAJCXJldHVybiB0QklUTUFQOwotQ0FQVElPTgkJcmV0dXJuIENBUFRJT047Ci1DSEVDS0JPWAlyZXR1cm4gQ0hFQ0tCT1g7Ci1DSEVDS0VECQlyZXR1cm4gQ0hFQ0tFRDsKLUNMQVNTCQlyZXR1cm4gQ0xBU1M7Ci1DT01CT0JPWAlyZXR1cm4gQ09NQk9CT1g7Ci1DT05UUk9MCQlyZXR1cm4gQ09OVFJPTDsKLUNURVhUCQlyZXR1cm4gQ1RFWFQ7Ci1DVVJTT1IJCXJldHVybiBDVVJTT1I7Ci1ERUZQVVNIQlVUVE9OCXJldHVybiBERUZQVVNIQlVUVE9OOwotRElBTE9HCQlyZXR1cm4gRElBTE9HOwotRElTQ0FSREFCTEUJcmV0dXJuIERJU0NBUkRBQkxFOwotRURJVFRFWFQJcmV0dXJuIEVESVRURVhUOwotRU5ECQlyZXR1cm4gdEVORDsKLUZJWEVECQlyZXR1cm4gRklYRUQ7Ci1GT05UCQlyZXR1cm4gRk9OVDsKLUdSQVlFRAkJcmV0dXJuIEdSQVlFRDsKLUdST1VQQk9YCXJldHVybiBHUk9VUEJPWDsKLUhFTFAJCXJldHVybiBIRUxQOwotSUNPTgkJcmV0dXJuIElDT047Ci1JTkFDVElWRQlyZXR1cm4gSU5BQ1RJVkU7Ci1MSVNUQk9YCQlyZXR1cm4gTElTVEJPWDsKLUxURVhUCQlyZXR1cm4gTFRFWFQ7Ci1NRU5VCQlyZXR1cm4gTUVOVTsKLU1FTlVCQVJCUkVBSwlyZXR1cm4gTUVOVUJBUkJSRUFLOwotTUVOVUJSRUFLCXJldHVybiBNRU5VQlJFQUs7Ci1NRU5VSVRFTQlyZXR1cm4gTUVOVUlURU07Ci1NT1ZFQUJMRQlyZXR1cm4gTU9WRUFCTEU7Ci1MT0FET05DQUxMCXJldHVybiBMT0FET05DQUxMOwotTk9JTlZFUlQJcmV0dXJuIE5PSU5WRVJUOwotTk9UCQkJcmV0dXJuIE5PVDsKLU5VTUJFUgkJcmV0dXJuIE5VTUJFUjsKLVBPUFVQCQlyZXR1cm4gUE9QVVA7Ci1QUkVMT0FECQlyZXR1cm4gUFJFTE9BRDsKLVBVU0hCVVRUT04JcmV0dXJuIFBVU0hCVVRUT047Ci1QVVJFCQlyZXR1cm4gUFVSRTsKLVJBRElPQlVUVE9OCXJldHVybiBSQURJT0JVVFRPTjsKLVJDREFUQQkJcmV0dXJuIFJDREFUQTsKLVJURVhUCQlyZXR1cm4gUlRFWFQ7Ci1TQ1JPTExCQVIJcmV0dXJuIFNDUk9MTEJBUjsKLVNISUZUCQlyZXR1cm4gU0hJRlQ7Ci1TRVBBUkFUT1IJcmV0dXJuIFNFUEFSQVRPUjsKLVNUUklORwkJcmV0dXJuIFNUUklORzsKLVNUUklOR1RBQkxFCXJldHVybiBTVFJJTkdUQUJMRTsKLVNUWUxFCQlyZXR1cm4gU1RZTEU7Ci1WRVJTSU9OSU5GTwlyZXR1cm4gVkVSU0lPTklORk87Ci1WSVJUS0VZCQlyZXR1cm4gVklSVEtFWTsKLVx7CQkJcmV0dXJuIHRCRUdJTjsKLVx9CQkJcmV0dXJuIHRFTkQ7Ci1bKy1dP1swLTldKwl5eWx2YWwubnVtPWF0b2koeXl0ZXh0KTtyZXR1cm4gTlVNQkVSOwotMHhbMC05QS1GYS1mXStMPwl5eWx2YWwubnVtPXN0cnRvdWwoeXl0ZXh0LDAsMTYpO3JldHVybiBOVU1CRVI7Ci1bQS1aYS16XVtBLVphLXpfMC05XSoJeXlsdmFsLnN0cj1zdHJkdXAoeXl0ZXh0KTtyZXR1cm4gSURFTlQ7Ci1cIlteIl0qXCIJeXlsdmFsLnN0cj1wYXJzZV9jX3N0cmluZyh5eXRleHQpO3JldHVybiBTVFJJTkc7Ci1cJ1teJ10qXCcgICB5eWx2YWwuc3RyPXN0cmR1cCh5eXRleHQrMSk7cmV0dXJuIFNJTkdMRV9RVU9URUQ7Ci1bIFx0XG5ccl0JCTsKLS4JCQlyZXR1cm4geXl0ZXh0WzBdOwpkaWZmIC0tZ2l0IGEvcmMvcmMueSBiL3JjL3JjLnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4NDRlMzkuLjAwMDAwMDAKLS0tIGEvcmMvcmMueQorKysgL2Rldi9udWxsCkBAIC0xLDIxMCArMCwwIEBACi0lewotLyoKLSAqCi0gKiBDb3B5cmlnaHQgIE1hcnRpbiB2b24gTG9ld2lzLCAxOTk0Ci0gKi8KLQotc3RhdGljIGNoYXIgQ29weXJpZ2h0W10gPSAiQ29weXJpZ2h0IE1hcnRpbiB2b24gTG9ld2lzLCAxOTk0IjsKLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSAicmMuaCIKLSNpbmNsdWRlICJ3aW5kb3dzLmgiCi0lfQotJXVuaW9uewotCWdlbl9yZXMgKnJlczsKLQljaGFyICpzdHI7Ci0JaW50IG51bTsKLQlzdHJ1Y3QgcmNfc3R5bGUgKnN0eWxlOwotfQotJXRva2VuIDxudW0+IE5VTUJFUgotJXRva2VuIDxzdHI+IFNUUklORyBTSU5HTEVfUVVPVEVEIElERU5UCi0ldG9rZW4gQUNDRUxFUkFUT1JTIEFMVCBBU0NJSSB0QkVHSU4gdEJJVE1BUCBDQVBUSU9OIENIRUNLQk9YIENIRUNLRUQgCi0ldG9rZW4gQ0xBU1MgQ09NQk9CT1ggQ09OVFJPTCBDVEVYVCBDVVJTT1IgREVGUFVTSEJVVFRPTiBESUFMT0cgCi0ldG9rZW4gRElTQ0FSREFCTEUgRURJVFRFWFQgdEVORCBGSVhFRCBGT05UIEdSQVlFRCBHUk9VUEJPWCBIRUxQIElDT04gCi0ldG9rZW4gSURFTlQgSU5BQ1RJVkUgTElTVEJPWCBMVEVYVCBNRU5VIE1FTlVCQVJCUkVBSyBNRU5VQlJFQUsgTUVOVUlURU0gCi0ldG9rZW4gTU9WRUFCTEUgTE9BRE9OQ0FMTCBOT0lOVkVSVCBOT1QgTk9UX1NVUFBPUlRFRCBQT1BVUCBQUkVMT0FEIAotJXRva2VuIFBVUkUgUFVTSEJVVFRPTiBSQURJT0JVVFRPTiBSQ0RBVEEgUlRFWFQgU0NST0xMQkFSIFNISUZUIFNFUEFSQVRPUiAKLSV0b2tlbiBTSU5HTEVfUVVPVEVEIFNUUklORyBTVFJJTkdUQUJMRSBTVFlMRSBWRVJTSU9OSU5GTyBWSVJUS0VZCi0ldHlwZSA8cmVzPiByZXNvdXJjZV9maWxlIHJlc291cmNlIHJlc291cmNlcyByZXNvdXJjZV9kZWZpbml0aW9uIGFjY2VsZXJhdG9ycwotJXR5cGUgPHJlcz4gZXZlbnRzIGJpdG1hcCBjdXJzb3IgZGlhbG9nIGRsZ19hdHRyaWJ1dGVzIGNvbnRyb2xzIAotJXR5cGUgPHJlcz4gZ2VuZXJpY19jb250cm9sIGxhYmVsZWRfY29udHJvbCBjb250cm9sX2Rlc2MgZm9udCBpY29uIAotJXR5cGUgPHJlcz4gaWNvbmluZm8gbWVudSBtZW51X2JvZHkgaXRlbV9kZWZpbml0aW9ucyByY2RhdGEgcmF3X2RhdGEgcmF3X2VsZW1lbnRzIAotJXR5cGUgPHJlcz4gc3RyaW5ndGFibGUgc3RyaW5ncyB2ZXJzaW9uaW5mbwotJXR5cGUgPG51bT4gYWNjX29wdGlvbnMgaXRlbV9vcHRpb25zCi0ldHlwZSA8c3R5bGU+IHN0eWxlIG9wdGlvbmFsX3N0eWxlCi0lJQotCi1yZXNvdXJjZV9maWxlOiByZXNvdXJjZXMge2NyZWF0ZV9vdXRwdXQoJDEpO30KLQotLypyZXNvdXJjZXMgYXJlIHB1dCBpbnRvIGEgbGlua2VkIGxpc3QqLwotcmVzb3VyY2VzOgl7JCQ9MDt9Ci0JCXxyZXNvdXJjZSByZXNvdXJjZXMgeyQkPWFkZF9yZXNvdXJjZSgkMSwkMik7fQotCQk7Ci0KLS8qIGdldCB0aGUgbmFtZSBmb3IgYSBzaW5nbGUgcmVzb3VyY2UqLwotcmVzb3VyY2U6CU5VTUJFUiByZXNvdXJjZV9kZWZpbml0aW9uCi0JCXskJD0kMjskJC0+bi5pX25hbWU9JDE7JCQtPm5fdHlwZT0wOwotCQkJaWYodmVyYm9zZSlmcHJpbnRmKHN0ZGVyciwiR290ICVzICVkXG4iLGdldF90eXBlbmFtZSgkMiksJDEpOwotCQl9Ci0JCXwgSURFTlQgcmVzb3VyY2VfZGVmaW5pdGlvbgotCQl7JCQ9JDI7JCQtPm4uc19uYW1lPSQxOyQkLT5uX3R5cGU9MTsKLQkJCWlmKHZlcmJvc2UpZnByaW50ZihzdGRlcnIsIkdvdCAlcyAlc1xuIixnZXRfdHlwZW5hbWUoJDIpLCQxKTsKLQkJfQotCi0vKiBnZXQgdGhlIHZhbHVlIGZvciBhIHNpbmdsZSByZXNvdXJjZSovCi1yZXNvdXJjZV9kZWZpbml0aW9uOglhY2NlbGVyYXRvcnMgeyQkPSQxO30KLQkJfCBiaXRtYXAgeyQkPSQxO30KLQkJfCBjdXJzb3IgeyQkPSQxO30KLQkJfCBkaWFsb2cgeyQkPSQxO30KLQkJfCBmb250IHskJD0kMTt9Ci0JCXwgaWNvbiB7JCQ9JDE7fQotCQl8IG1lbnUgeyQkPSQxO30KLQkJfCByY2RhdGEgeyQkPSQxO30KLQkJfCBzdHJpbmd0YWJsZSB7JCQ9JDE7fQotCQl8IHZlcnNpb25pbmZvIHskJD0kMTt9Ci0KLS8qIGhhdmUgdG8gdXNlIHRCRUdJTiBiZWNhdXNlIEJFR0lOIGlzIHByZWRlZmluZWQgKi8KLWFjY2VsZXJhdG9yczoJQUNDRUxFUkFUT1JTICB0QkVHSU4gIGV2ZW50cyB0RU5EIHskJD0kMzskJC0+dHlwZT1hY2M7fQotLyogdGhlIGV2ZW50cyBhcmUgY29sbGVjdGVkIGluIGEgZ2VuX3JlcywgYXMgdGhlIGFjY2VsZXJhdG9yIHJlc291cmNlIGlzIGp1c3QKLSAgIGFuIGFycmF5IG9mIGV2ZW50cyAqLwotZXZlbnRzOgkJeyQkPW5ld19yZXMoKTt9Ci0JCXwgU1RSSU5HICcsJyBOVU1CRVIgYWNjX29wdGlvbnMgIGV2ZW50cyAKLQkJCXskJD1hZGRfc3RyaW5nX2FjY2VsZXJhdG9yKCQxLCQzLCQ0LCQ1KTt9Ci0JCXwgTlVNQkVSICcsJyBOVU1CRVIgJywnIEFTQ0lJIGFjY19vcHRpb25zICBldmVudHMgCi0JCQl7JCQ9YWRkX2FzY2lpX2FjY2VsZXJhdG9yKCQxLCQzLCQ2LCQ3KTt9Ci0JCXwgTlVNQkVSICcsJyBOVU1CRVIgJywnIFZJUlRLRVkgYWNjX29wdGlvbnMgIGV2ZW50cyAKLQkJCXskJD1hZGRfdmtfYWNjZWxlcmF0b3IoJDEsJDMsJDYsJDcpO30KLWFjY19vcHRpb25zOgl7JCQ9MDt9Ci0JCXwgJywnIE5PSU5WRVJUIGFjY19vcHRpb25zIHskJD0kM3wyO30KLQkJfCAnLCcgQUxUIGFjY19vcHRpb25zICAgICAgeyQkPSQzfDE2O30KLQkJfCAnLCcgU0hJRlQgYWNjX29wdGlvbnMJICAgeyQkPSQzfDQ7fQotCQl8ICcsJyBDT05UUk9MIGFjY19vcHRpb25zICB7JCQ9JDN8ODt9Ci0KLWJpdG1hcDoJCXRCSVRNQVAgbG9hZF9hbmRfbWVtb3B0aW9uIFNUUklORyB7JCQ9bWFrZV9iaXRtYXAobG9hZF9maWxlKCQzKSk7fQotCQl8IHRCSVRNQVAgbG9hZF9hbmRfbWVtb3B0aW9uIHJhd19kYXRhIHskJD1tYWtlX2JpdG1hcCgkMyk7fQotCi0vKiBsb2FkIGFuZCBtZW1vcnkgb3B0aW9ucyBhcmUgaWdub3JlZCAqLwotbG9hZF9hbmRfbWVtb3B0aW9uOgl8IGxhbW8gbG9hZF9hbmRfbWVtb3B0aW9uCi1sYW1vOglQUkVMT0FEIHwgTE9BRE9OQ0FMTCB8IEZJWEVEIHwgTU9WRUFCTEUgfCBESVNDQVJEQUJMRSB8IFBVUkUKLQotY3Vyc29yOgkJQ1VSU09SIGxvYWRfYW5kX21lbW9wdGlvbiBTVFJJTkcgeyQkPW1ha2VfY3Vyc29yKGxvYWRfZmlsZSgkMykpO30KLQkJfENVUlNPUiBsb2FkX2FuZF9tZW1vcHRpb24gcmF3X2RhdGEgeyQkPW1ha2VfY3Vyc29yKCQzKTt9Ci0KLWRpYWxvZzoJCURJQUxPRyBsb2FkX2FuZF9tZW1vcHRpb24gTlVNQkVSICcsJyBOVU1CRVIgJywnIE5VTUJFUiAnLCcgTlVNQkVSIAotCQlkbGdfYXR0cmlidXRlcwotCQl0QkVHSU4gIGNvbnRyb2xzIHRFTkQgCi0JCXskJD1tYWtlX2RpYWxvZygkMTAsJDMsJDUsJDcsJDksJDEyKTt9Ci0KLWRsZ19hdHRyaWJ1dGVzOgl7JCQ9bmV3X2RpYWxvZygpO30KLQkJfCBTVFlMRSBzdHlsZSBkbGdfYXR0cmlidXRlcyAKLQkJICB7JCQ9ZGlhbG9nX3N0eWxlKCQyLCQzKTt9Ci0JCXwgQ0FQVElPTiBTVFJJTkcgZGxnX2F0dHJpYnV0ZXMKLQkJICB7JCQ9ZGlhbG9nX2NhcHRpb24oJDIsJDMpO30KLQkJfCBGT05UIE5VTUJFUiAnLCcgU1RSSU5HIGRsZ19hdHRyaWJ1dGVzIAotCQkgIHskJD1kaWFsb2dfZm9udCgkMiwkNCwkNSk7fQotCQl8IENMQVNTIFNUUklORyBkbGdfYXR0cmlidXRlcwotCQkgIHskJD1kaWFsb2dfY2xhc3MoJDIsJDMpO30KLQkJfCBNRU5VIFNUUklORyBkbGdfYXR0cmlidXRlcwotCQkgIHskJD1kaWFsb2dfbWVudSgkMiwkMyk7fQotCi0vKiB0aGUgY29udHJvbHMgYXJlIGNvbGxlY3RlZCBpbnRvIGEgZ2VuX3JlcywgYW5kIGZpbmFsbHkgdGhlIGRpYWxvZyBoZWFkZXIgCi0gICBpcyBwdXQgYXQgdGhlIGJlZ2lubmluZyAqLwotY29udHJvbHM6CXskJD1uZXdfcmVzKCk7fQotCQl8IENIRUNLQk9YICBsYWJlbGVkX2NvbnRyb2wgY29udHJvbHMgCi0JCSAgeyQkPWFkZF9jb250cm9sKENUX0JVVFRPTiwgQlNfQ0hFQ0tCT1gsICQyLCAkMyk7fQotCQl8IENPTUJPQk9YIGNvbnRyb2xfZGVzYyBjb250cm9scyAKLQkJICB7JCQ9YWRkX2NvbnRyb2woQ1RfQ09NQk9CT1gsIDAsICQyLCAkMyk7fQotCQl8IENPTlRST0wgZ2VuZXJpY19jb250cm9sIGNvbnRyb2xzCi0JCSAgeyQkPWFkZF9nZW5lcmljX2NvbnRyb2woJDIsICQzKTt9Ci0JCXwgQ1RFWFQgbGFiZWxlZF9jb250cm9sIGNvbnRyb2xzIAotCQkgIHskJD1hZGRfY29udHJvbChDVF9TVEFUSUMsIFNTX0NFTlRFUiwgJDIsICQzKTt9Ci0JCXwgREVGUFVTSEJVVFRPTiBsYWJlbGVkX2NvbnRyb2wgY29udHJvbHMgCi0JCSAgeyQkPWFkZF9jb250cm9sKENUX0JVVFRPTiwgQlNfREVGUFVTSEJVVFRPTiwgJDIsICQzKTt9Ci0JCXwgRURJVFRFWFQgY29udHJvbF9kZXNjIGNvbnRyb2xzIAotCQkgIHskJD1hZGRfY29udHJvbChDVF9FRElULCAwLCAkMiwgJDMpO30KLQkJfCBHUk9VUEJPWCBsYWJlbGVkX2NvbnRyb2wgY29udHJvbHMgCi0JCSAgeyQkPWFkZF9jb250cm9sKENUX0JVVFRPTiwgQlNfR1JPVVBCT1gsICQyLCAkMyk7fQotCQkvKnNwZWNpYWwgdHJlYXRtZW50IGZvciBpY29ucywgYXMgdGhlIGV4dGVudCBpcyBvcHRpb25hbCovCi0JCXwgSUNPTiBTVFJJTkcgJywnIE5VTUJFUiAnLCcgTlVNQkVSICcsJyBOVU1CRVIgaWNvbmluZm8gY29udHJvbHMKLQkJICB7JCQ9YWRkX2ljb24oJDIsICQ0LCAkNiwgJDgsICQ5LCAkMTApO30KLQkJfCBMSVNUQk9YIGNvbnRyb2xfZGVzYyBjb250cm9scyAKLQkJICB7JCQ9YWRkX2NvbnRyb2woQ1RfTElTVEJPWCwgMCwgJDIsICQzKTt9Ci0JCXwgTFRFWFQgbGFiZWxlZF9jb250cm9sIGNvbnRyb2xzIAotCQkgIHskJD1hZGRfY29udHJvbChDVF9TVEFUSUMsIFNTX0xFRlQsICQyLCAkMyk7fQotCQl8IFBVU0hCVVRUT04gbGFiZWxlZF9jb250cm9sIGNvbnRyb2xzIAotCQkgIHskJD1hZGRfY29udHJvbChDVF9CVVRUT04sIEJTX1BVU0hCVVRUT04sICQyLCAkMyk7fQotCQl8IFJBRElPQlVUVE9OIGxhYmVsZWRfY29udHJvbCBjb250cm9scyAKLQkJICB7JCQ9YWRkX2NvbnRyb2woQ1RfQlVUVE9OLCBCU19SQURJT0JVVFRPTiwgJDIsICQzKTt9Ci0JCXwgUlRFWFQgbGFiZWxlZF9jb250cm9sIGNvbnRyb2xzIAotCQkgIHskJD1hZGRfY29udHJvbChDVF9TVEFUSUMsIFNTX1JJR0hULCAkMiwgJDMpO30KLQkJfCBTQ1JPTExCQVIgY29udHJvbF9kZXNjIGNvbnRyb2xzCQkKLQkJICB7JCQ9YWRkX2NvbnRyb2woQ1RfU0NST0xMQkFSLCAwLCAkMiwgJDMpO30KLQotCi1sYWJlbGVkX2NvbnRyb2w6IFNUUklORyAnLCcgY29udHJvbF9kZXNjIHskJD1sYWJlbF9jb250cm9sX2Rlc2MoJDEsJDMpO30KLWNvbnRyb2xfZGVzYzoJTlVNQkVSICcsJyBOVU1CRVIgJywnIE5VTUJFUiAnLCcgTlVNQkVSICcsJyBOVU1CRVIgb3B0aW9uYWxfc3R5bGUgCi0JCXskJD1jcmVhdGVfY29udHJvbF9kZXNjKCQxLCQzLCQ1LCQ3LCQ5LCQxMCk7fQotCi1vcHRpb25hbF9zdHlsZTogeyQkPTA7fXwKLQkJJywnIHN0eWxlIHskJD0kMjt9Ci0KLWljb25pbmZvOgkvKnNldCBleHRlbnQgYW5kIHN0eWxlIHRvIDAgaWYgdGhleSBhcmUgbm90IHByb3ZpZGVkICovCi0JCXskJD1jcmVhdGVfY29udHJvbF9kZXNjKDAsMCwwLDAsMCwwKTt9IAotCQkvKiB4IGFuZCB5IGFyZSBvdmVyd3JpdHRlbiBsYXRlciAqLwotCQl8ICcsJyBOVU1CRVIgJywnIE5VTUJFUiBvcHRpb25hbF9zdHlsZQotICAgICAgICB7JCQ9Y3JlYXRlX2NvbnRyb2xfZGVzYygwLDAsMCwkMiwkNCwkNSk7fQotCi1nZW5lcmljX2NvbnRyb2w6CVNUUklORyAnLCcgTlVNQkVSICcsJyBTVFJJTkcgJywnIHN0eWxlICcsJyBOVU1CRVIKLQkJJywnIE5VTUJFUiAnLCcgTlVNQkVSICcsJyBOVU1CRVIKLQkJeyQkPWNyZWF0ZV9nZW5lcmljX2NvbnRyb2woJDEsJDMsJDUsJDcsJDksJDExLCQxMywkMTUpO30KLQotZm9udDoJCUZPTlQgbG9hZF9hbmRfbWVtb3B0aW9uIFNUUklORyB7JCQ9bWFrZV9mb250KGxvYWRfZmlsZSgkMykpO30KLQotaWNvbjoJCUlDT04gbG9hZF9hbmRfbWVtb3B0aW9uIFNUUklORyB7JCQ9bWFrZV9pY29uKGxvYWRfZmlsZSgkMykpO30KLQkJfCBJQ09OIGxvYWRfYW5kX21lbW9wdGlvbiByYXdfZGF0YSB7JCQ9bWFrZV9pY29uKCQzKTt9Ci0KLW1lbnU6CQlNRU5VIGxvYWRfYW5kX21lbW9wdGlvbiBtZW51X2JvZHkgeyQkPW1ha2VfbWVudSgkMyk7fQotLyogbWVudSBpdGVtcyBhcmUgY29sbGVjdGVkIGluIGEgZ2VuX3JlcyBhbmQgcHJlZml4ZWQgd2l0aCB0aGUgbWVudSBoZWFkZXIqLwotbWVudV9ib2R5Ogl0QkVHSU4gaXRlbV9kZWZpbml0aW9ucyB0RU5EIHskJD0kMjt9Ci1pdGVtX2RlZmluaXRpb25zOgl7JCQ9bmV3X3JlcygpO30KLQkJfCBNRU5VSVRFTSBTVFJJTkcgJywnIE5VTUJFUiBpdGVtX29wdGlvbnMgaXRlbV9kZWZpbml0aW9ucwotCQkgIHskJD1hZGRfbWVudWl0ZW0oJDIsJDQsJDUsJDYpO30KLQkJfCBNRU5VSVRFTSBTRVBBUkFUT1IgaXRlbV9kZWZpbml0aW9ucwotCQkgIHskJD1hZGRfbWVudWl0ZW0oIiIsMCwwLCQzKTt9Ci0JCXwgUE9QVVAgU1RSSU5HIGl0ZW1fb3B0aW9ucyBtZW51X2JvZHkgaXRlbV9kZWZpbml0aW9ucwotCQkgIHskJD1hZGRfcG9wdXAoJDIsJDMsJDQsJDUpO30KLWl0ZW1fb3B0aW9uczoJeyQkPTA7fQotCQl8ICcsJyBDSEVDS0VEIGl0ZW1fb3B0aW9ucyB7JCQ9JDN8TUZfQ0hFQ0tFRDt9Ci0JCXwgJywnIEdSQVlFRCBpdGVtX29wdGlvbnMgeyQkPSQzfE1GX0dSQVlFRDt9Ci0JCXwgJywnIEhFTFAgaXRlbV9vcHRpb25zIHskJD0kM3xNRl9IRUxQO30KLQkJfCAnLCcgSU5BQ1RJVkUgaXRlbV9vcHRpb25zIHskJD0kM3xNRl9ESVNBQkxFRDt9Ci0JCXwgJywnIE1FTlVCQVJCUkVBSyBpdGVtX29wdGlvbnMgeyQkPSQzfE1GX01FTlVCQVJCUkVBSzt9Ci0JCXwgJywnIE1FTlVCUkVBSyBpdGVtX29wdGlvbnMgeyQkPSQzfE1GX01FTlVCUkVBSzt9Ci0KLXJjZGF0YToJCVJDREFUQSBsb2FkX2FuZF9tZW1vcHRpb24gcmF3X2RhdGEgeyQkPW1ha2VfcmF3KCQzKTt9Ci0KLXJhd19kYXRhOgl0QkVHSU4gcmF3X2VsZW1lbnRzIHRFTkQgeyQkPSQyO30KLXJhd19lbGVtZW50czoJU0lOR0xFX1FVT1RFRCB7JCQ9aGV4X3RvX3JhdygkMSxuZXdfcmVzKCkpO30KLQkJfCBOVU1CRVIgeyQkPWludF90b19yYXcoJDEsbmV3X3JlcygpKTt9Ci0JCXwgU0lOR0xFX1FVT1RFRCByYXdfZWxlbWVudHMgeyQkPWhleF90b19yYXcoJDEsJDIpO30KLQkJfCBOVU1CRVIgJywnIHJhd19lbGVtZW50cyB7JCQ9aW50X3RvX3JhdygkMSwkMyk7fQotCi1zdHJpbmd0YWJsZToJU1RSSU5HVEFCTEUgbG9hZF9hbmRfbWVtb3B0aW9uIHRCRUdJTiBzdHJpbmdzIHRFTkQKLQkJCXskJD0kNDt9Ci1zdHJpbmdzOgl7JCQ9MDt9fAotCQlOVU1CRVIgU1RSSU5HIHN0cmluZ3MgeyQkPTA7fQotCi12ZXJzaW9uaW5mbzoJVkVSU0lPTklORk8gTk9UX1NVUFBPUlRFRCB7JCQ9MDt9Ci0KLS8qIE5PVCB4IHwgTk9UIHkgfCBhIHwgYiBtZWFucyAoYXxiKSYgfnggJiB+eQotICAgTk9UIGlzIHVzZWQgdG8gZGlzYWJsZSBkZWZhdWx0IHN0eWxlcyAqLwotc3R5bGU6CQlOVU1CRVIgeyQkPW5ld19zdHlsZSgpOyQkLT5vcj0kMTt9Ci0JCXwgTk9UIE5VTUJFUiB7JCQ9bmV3X3N0eWxlKCk7JCQtPmFuZD1+KCQyKTt9Ci0JCXwgJygnIHN0eWxlICcpJyB7JCQ9JDI7fQotCQl8IHN0eWxlICd8JyBzdHlsZSB7JCQ9JDE7JCQtPm9yfD0kMy0+b3I7JCQtPmFuZCY9JDMtPmFuZDt9Ci0lJQotaW50IHl5ZXJyb3IoY2hhciAqcykKLXsKLQlwdXRzKHMpOwotfQotCmRpZmYgLS1naXQgYS9yYy9zeXNyZXMucmMgYi9yYy9zeXNyZXMucmMKaW5kZXggYmMxNWM4Yy4uZWNkNzg1OSAxMDA2NDQKLS0tIGEvcmMvc3lzcmVzLnJjCisrKyBiL3JjL3N5c3Jlcy5yYwpAQCAtMzEsNyArMzEsNyBAQAogCiBTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMTMsIDE3OQogU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCi1DQVBUSU9OICJBYm91dCBYIgorQ0FQVElPTiAiQWJvdXQgJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewogIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODYsIDE2MCwgNDAsIDE0CmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfRGUucmMgYi9yYy9zeXNyZXNfRGUucmMKaW5kZXggZWUzOGFhZS4uNjIwMWE2NSAxMDA2NDQKLS0tIGEvcmMvc3lzcmVzX0RlLnJjCisrKyBiL3JjL3N5c3Jlc19EZS5yYwpAQCAtMjksNyArMjksNyBAQAogCiBTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMTMsIDE3OQogU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCi1DQVBUSU9OICIiCitDQVBUSU9OICJJbmZvIPxiZXIgJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewogIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODYsIDE2MCwgNDAsIDE0CmRpZmYgLS1naXQgYS9yYy9zeXNyZXNfTm8ucmMgYi9yYy9zeXNyZXNfTm8ucmMKaW5kZXggZWMyOWRkNi4uMzM4N2VmMSAxMDA2NDQKLS0tIGEvcmMvc3lzcmVzX05vLnJjCisrKyBiL3JjL3N5c3Jlc19Oby5yYwpAQCAtMjksNyArMjksNyBAQAogCiBTSEVMTF9BQk9VVF9NU0dCT1ggRElBTE9HIExPQURPTkNBTEwgTU9WRUFCTEUgRElTQ0FSREFCTEUgNTAsIDQ0LCAyMTMsIDE3OQogU1RZTEUgRFNfTE9DQUxFRElUIHwgRFNfTU9EQUxGUkFNRSB8IFdTX1BPUFVQIHwgV1NfVklTSUJMRSB8IFdTX0NBUFRJT04gfCBXU19TWVNNRU5VCi1DQVBUSU9OICJPbSBYIgorQ0FQVElPTiAiT20gJXMiCiBGT05UIDEwLCAiU3lzdGVtIgogewogIERFRlBVU0hCVVRUT04gIk9LIiwgMSwgODYsIDE2MCwgNDAsIDE0CmRpZmYgLS1naXQgYS90b29scy9NYWtlZmlsZS5pbiBiL3Rvb2xzL01ha2VmaWxlLmluCmluZGV4IDg5MzU5NzAuLjAxYzRiMTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL01ha2VmaWxlLmluCisrKyBiL3Rvb2xzL01ha2VmaWxlLmluCkBAIC0xOSw3ICsxOSw3IEBACiAJbXYgdG1wX21ha2UgTWFrZWZpbGUKIAogY2xlYW46Ci0Jcm0gLWYgKi5vIFwjKlwjICp+IGJ1aWxkIHRtcF9tYWtlCisJcm0gLWYgKi5vIFwjKlwjICp+ICouYmFrIGJ1aWxkIHRtcF9tYWtlCiAKIGRpc3RjbGVhbjogY2xlYW4KIAlybSBNYWtlZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYnVpbGQuYyBiL3Rvb2xzL2J1aWxkLmMKaW5kZXggNGZhYjAwMi4uY2E5ZmFjNyAxMDA2NDQKLS0tIGEvdG9vbHMvYnVpbGQuYworKysgYi90b29scy9idWlsZC5jCkBAIC05NzQsMjEgKzk3NCwxOSBAQAogICAgIHByaW50ZiggIlx0cHVzaGwgJSVlYnBcbiIgKTsKICAgICBwcmludGYoICJcdG1vdmwgJSVlc3AsJSVlYnBcbiIgKTsKIAotICAgIC8qIFJldHJpZXZlIHRoZSBvcmlnaW5hbCAzMi1iaXQgc3RhY2sgcG9pbnRlciAqLwotCi0gICAgcHJpbnRmKCAiXHRtb3ZsICIgUFJFRklYICJJRjE2MzJfT3JpZ2luYWwzMl9lc3AsICUlZWF4XG4iICk7Ci0gICAgcHJpbnRmKCAiXHRvcmwgJSVlYXgsJSVlYXhcbiIgKTsKLSAgICBwcmludGYoICJcdGplIDBmXG4iICk7Ci0KICAgICAvKiBTYXZlIHJlZ2lzdGVycyAqLwogCiAgICAgcHJpbnRmKCAiXHRwdXNobCAlJWVjeFxuIiApOwogICAgIHByaW50ZiggIlx0cHVzaGwgJSVlc2lcbiIgKTsKICAgICBwcmludGYoICJcdHB1c2hsICUlZWRpXG4iICk7CiAKLSAgICAvKiBTd2l0Y2ggdG8gdGhlIG5ldyBzdGFjayAqLworICAgIC8qIFJldHJpZXZlIHRoZSBvcmlnaW5hbCAzMi1iaXQgc3RhY2sgcG9pbnRlciBhbmQgc3dpdGNoIHRvIGl0IGlmIGFueSAqLwogCisgICAgcHJpbnRmKCAiXHRtb3ZsICIgUFJFRklYICJJRjE2MzJfT3JpZ2luYWwzMl9lc3AsICUlZWF4XG4iICk7CisgICAgcHJpbnRmKCAiXHRvcmwgJSVlYXgsJSVlYXhcbiIgKTsKKyAgICBwcmludGYoICJcdGplIDBmXG4iICk7CiAgICAgcHJpbnRmKCAiXHRtb3ZsICUlZWF4LCUlZXNwXG4iICk7CisgICAgcHJpbnRmKCAiMDpcbiIgKTsKIAogICAgIC8qIFRyYW5zZmVyIHRoZSBhcmd1bWVudHMgKi8KIApAQCAtMTAxNiwyOSArMTAxNCw4IEBACiAgICAgcHJpbnRmKCAiXHRwb3BsICUlZWRpXG4iICk7CiAgICAgcHJpbnRmKCAiXHRwb3BsICUlZXNpXG4iICk7CiAgICAgcHJpbnRmKCAiXHRwb3BsICUlZWN4XG4iICk7Ci0KICAgICBwcmludGYoICJcdHBvcGwgJSVlYnBcbiIgKTsKICAgICBwcmludGYoICJcdHJldFxuIiApOwotCi0gICAgLyogV2UgZ2V0IGhlcmUgaWYgSUYxNjMyX09yaWdpbmFsMzJfZXNwIGlzIDAsIGkuZS4gd2UgaGF2ZSBub3QgKi8KLSAgICAvKiBzd2l0Y2hlZCB0byBhbm90aGVyIDMyLWJpdCBzdGFjayB5ZXQuICovCi0KLSAgICBwcmludGYoICIwOlxuIiApOwotCi0gICAgLyogTW92ZSB0aGUgcmV0dXJuIGFkZHJlc3MgdXAgdGhlIHN0YWNrICovCi0KLSAgICBwcmludGYoICJcdG1vdmwgNCglJWVicCksJSVlYXhcbiIgKTsKLSAgICBwcmludGYoICJcdG1vdmwgJSVlYXgsMTIoJSVlYnApXG4iICk7Ci0KLSAgICAvKiBSZXN0b3JlIGVicCBhbmQgcmVtb3ZlIG9sZCByZXR1cm4gYWRkcmVzcyAqLwotCi0gICAgcHJpbnRmKCAiXHRwb3BsICUlZWJwXG4iICk7Ci0gICAgcHJpbnRmKCAiXHRhZGRsICQ0LCUlZXNwXG4iICk7Ci0KLSAgICAvKiBOb3cganVtcCB0byB0aGUgcm91dGluZSwgbGVhdmluZyB0aGUgb3JpZ2luYWwgcmV0dXJuIGFkZHJlc3MgYW5kICovCi0gICAgLyogdGhlIGFyZ3VtZW50cyBvbiB0aGUgc3RhY2suICovCi0KLSAgICBwcmludGYoICJcdHJldFxuIiApOwogfQogCiAKZGlmZiAtLWdpdCBhL3dpbmRvd3MvTWFrZWZpbGUuaW4gYi93aW5kb3dzL01ha2VmaWxlLmluCmluZGV4IGJjMWVkNjcuLjc2MjFiNmYgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvTWFrZWZpbGUuaW4KKysrIGIvd2luZG93cy9NYWtlZmlsZS5pbgpAQCAtMzIsNyArMzIsNyBAQAogCW12IHRtcF9tYWtlIE1ha2VmaWxlCiAKIGNsZWFuOgotCXJtIC1mICoubyBcIypcIyAqfiB0bXBfbWFrZQorCXJtIC1mICoubyBcIypcIyAqfiAqLmJhayB0bXBfbWFrZQogCiBkaXN0Y2xlYW46IGNsZWFuCiAJcm0gTWFrZWZpbGUKZGlmZiAtLWdpdCBhL3dpbmRvd3MvY2xhc3MuYyBiL3dpbmRvd3MvY2xhc3MuYwppbmRleCAwOTA3MWJkLi40Y2UwN2VkIDEwMDY0NAotLS0gYS93aW5kb3dzL2NsYXNzLmMKKysrIGIvd2luZG93cy9jbGFzcy5jCkBAIC0zNCw3ICszNCw3IEBACiAgICAgSENMQVNTIGNsYXNzOwogICAgIENMQVNTICogY2xhc3NQdHI7CiAKLSAgICBpZiAoIShhdG9tID0gTG9jYWxGaW5kQXRvbSggbmFtZSApKSkgcmV0dXJuIDA7CisgICAgaWYgKCEoYXRvbSA9IEdsb2JhbEZpbmRBdG9tKCBuYW1lICkpKSByZXR1cm4gMDsKIAogICAgICAgLyogRmlyc3Qgc2VhcmNoIHRhc2stc3BlY2lmaWMgY2xhc3NlcyAqLwogCkBAIC0xMjgsNyArMTI4LDcgQEAKICAgICBuZXdDbGFzcy0+d2MuY2JXbmRFeHRyYSA9IChjbGFzcy0+Y2JXbmRFeHRyYSA8IDApID8gMCA6IGNsYXNzLT5jYlduZEV4dHJhOwogICAgIG5ld0NsYXNzLT53Yy5jYkNsc0V4dHJhID0gY2xhc3NFeHRyYTsKIAotICAgIG5ld0NsYXNzLT5hdG9tTmFtZSA9IExvY2FsQWRkQXRvbSggY2xhc3MtPmxwc3pDbGFzc05hbWUgKTsKKyAgICBuZXdDbGFzcy0+YXRvbU5hbWUgPSBHbG9iYWxBZGRBdG9tKCBjbGFzcy0+bHBzekNsYXNzTmFtZSApOwogICAgIG5ld0NsYXNzLT53Yy5scHN6Q2xhc3NOYW1lID0gMDsKIAogICAgIGlmIChuZXdDbGFzcy0+d2Muc3R5bGUgJiBDU19DTEFTU0RDKQpAQCAtMTg5LDggKzE4OSw3IEBACiAgICAgICAvKiBEZWxldGUgdGhlIGNsYXNzICovCiAgICAgaWYgKGNsYXNzUHRyLT5oZGNlKSBEQ0VfRnJlZURDRSggY2xhc3NQdHItPmhkY2UgKTsKICAgICBpZiAoY2xhc3NQdHItPndjLmhickJhY2tncm91bmQpIERlbGV0ZU9iamVjdCggY2xhc3NQdHItPndjLmhickJhY2tncm91bmQgKTsKLSAgICAvKmlmIChjbGFzc1B0ci0+d2Muc3R5bGUgJiBDU19HTE9CQUxDTEFTUykqLyBMb2NhbERlbGV0ZUF0b20oIGNsYXNzUHRyLT5hdG9tTmFtZSApOwotICAgIC8qZWxzZSBEZWxldGVBdG9tKCBjbGFzc1B0ci0+YXRvbU5hbWUgKTsqLworICAgIEdsb2JhbERlbGV0ZUF0b20oIGNsYXNzUHRyLT5hdG9tTmFtZSApOwogICAgIGlmIChISVdPUkQoY2xhc3NQdHItPndjLmxwc3pNZW51TmFtZSkpCiAJVVNFUl9IRUFQX0ZSRUUoIExPV09SRChjbGFzc1B0ci0+d2MubHBzek1lbnVOYW1lKSApOwogICAgIFVTRVJfSEVBUF9GUkVFKCBjbGFzcyApOwpAQCAtMjcwLDcgKzI2OSw3IEBACiAgICAgaWYgKCEod25kUHRyID0gV0lOX0ZpbmRXbmRQdHIoaHduZCkpKSByZXR1cm4gMDsKICAgICBpZiAoIShjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0cih3bmRQdHItPmhDbGFzcykpKSByZXR1cm4gMDsKICAgICAKLSAgICByZXR1cm4gTG9jYWxHZXRBdG9tTmFtZShjbGFzc1B0ci0+YXRvbU5hbWUsIGxwQ2xhc3NOYW1lLCBtYXhDb3VudCk7CisgICAgcmV0dXJuIEdsb2JhbEdldEF0b21OYW1lKGNsYXNzUHRyLT5hdG9tTmFtZSwgbHBDbGFzc05hbWUsIG1heENvdW50KTsKIH0KIAogCkBAIC0zMTUsNyArMzE0LDcgQEAKIAogICAgIHBDbGFzc0VudHJ5LT5oSW5zdCA9IGNsYXNzUHRyLT53Yy5oSW5zdGFuY2U7CiAgICAgcENsYXNzRW50cnktPndOZXh0ID0gY2xhc3NQdHItPmhOZXh0OwotICAgIExvY2FsR2V0QXRvbU5hbWUoIGNsYXNzUHRyLT5hdG9tTmFtZSwgcENsYXNzRW50cnktPnN6Q2xhc3NOYW1lLAorICAgIEdsb2JhbEdldEF0b21OYW1lKCBjbGFzc1B0ci0+YXRvbU5hbWUsIHBDbGFzc0VudHJ5LT5zekNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHBDbGFzc0VudHJ5LT5zekNsYXNzTmFtZSkgKTsKICAgICByZXR1cm4gVFJVRTsKIH0KZGlmZiAtLWdpdCBhL3dpbmRvd3MvbWFwcGluZy5jIGIvd2luZG93cy9tYXBwaW5nLmMKaW5kZXggOTNhNmYzNy4uNzRiOTFmMyAxMDA2NDQKLS0tIGEvd2luZG93cy9tYXBwaW5nLmMKKysrIGIvd2luZG93cy9tYXBwaW5nLmMKQEAgLTQsNiArNCw3IEBACiAgKiBDb3B5cmlnaHQgMTk5MyBBbGV4YW5kcmUgSnVsbGlhcmQKICAqLwogCisjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgImdkaS5oIgogI2luY2x1ZGUgIm1ldGFmaWxlLmgiCiAjaW5jbHVkZSAic3RkZGVidWcuaCIKQEAgLTI0LDEyICsyNSwxMiBAQAogCSAgICAgICAgICAoZGMtPncuZGV2Q2Fwcy0+dmVydFJlcyAqIGRjLT53LlduZEV4dFkpOwogICAgIGlmICh4ZGltID4geWRpbSkKICAgICB7Ci0JZGMtPncuVnBvcnRFeHRYID0gZGMtPncuVnBvcnRFeHRYICogeWRpbSAvIHhkaW07CisJZGMtPncuVnBvcnRFeHRYID0gZGMtPncuVnBvcnRFeHRYICogZmFicyggeWRpbSAvIHhkaW0gKTsKIAlpZiAoIWRjLT53LlZwb3J0RXh0WCkgZGMtPncuVnBvcnRFeHRYID0gMTsKICAgICB9CiAgICAgZWxzZQogICAgIHsKLQlkYy0+dy5WcG9ydEV4dFkgPSBkYy0+dy5WcG9ydEV4dFkgKiB4ZGltIC8geWRpbTsKKwlkYy0+dy5WcG9ydEV4dFkgPSBkYy0+dy5WcG9ydEV4dFkgKiBmYWJzKCB4ZGltIC8geWRpbSApOwogCWlmICghZGMtPncuVnBvcnRFeHRZKSBkYy0+dy5WcG9ydEV4dFkgPSAxOwogICAgIH0JCiB9CmRpZmYgLS1naXQgYS93aW5kb3dzL21lc3NhZ2UuYyBiL3dpbmRvd3MvbWVzc2FnZS5jCmluZGV4IDA0NTdlMzYuLjcyY2I5YWIgMTAwNjQ0Ci0tLSBhL3dpbmRvd3MvbWVzc2FnZS5jCisrKyBiL3dpbmRvd3MvbWVzc2FnZS5jCkBAIC0yOCwxNSArMjgsNiBAQAogI2RlZmluZSBNQVhfUVVFVUVfU0laRSAgIDEyMCAgLyogTWF4LiBzaXplIG9mIGEgbWVzc2FnZSBxdWV1ZSAqLwogCiAKLS8qIHVzZWQgZm9yIHBhc3NpbmcgbWVzc2FnZSBpbmZvcm1hdGlvbiB3aGVuIHNlbmRpbmcgbWVzc2FnZSAqLyAKLXR5cGVkZWYgc3RydWN0IHsKLSAgICBMT05HIGxQYXJhbTsKLSAgICBXT1JEIHdQYXJhbTsKLSAgICBXT1JEIHdNc2c7Ci0gICAgV09SRCBoV25kOwotfSBtc2dzdHJ1Y3Q7Ci0KLQogZXh0ZXJuIEJPT0wgVElNRVJfQ2hlY2tUaW1lciggTE9ORyAqbmV4dCwgTVNHICptc2csCiAJCQkgICAgICBIV05EIGh3bmQsIEJPT0wgcmVtb3ZlICk7ICAvKiB0aW1lci5jICovCiAKQEAgLTE0Niw4ICsxMzcsOCBAQAogewogICAgIGludCBpLCBwb3MgPSBtc2dRdWV1ZS0+bmV4dE1lc3NhZ2U7CiAKLSAgICBkcHJpbnRmX21zZyhzdGRkZWIsIk1TR19GaW5kTXNnOiBod25kPTB4JTA0eCwgcHJvYz0lZFxuIiwKLQkJaHduZCwgY3Vycl9wcm9jX2lkeCk7CisgICAgZHByaW50Zl9tc2coc3RkZGViLCJNU0dfRmluZE1zZzogaHduZD0weCUwNHhcblxuIiwgaHduZCApOworCiAgICAgaWYgKCFtc2dRdWV1ZS0+bXNnQ291bnQpIHJldHVybiAtMTsKICAgICBpZiAoIWh3bmQgJiYgIWZpcnN0ICYmICFsYXN0KSByZXR1cm4gcG9zOwogICAgICAgICAKQEAgLTQzNiw2ICs0MjcsNyBAQAogCiAgICAgZm9yIChpID0gMDsgaSA8IHN5c01zZ1F1ZXVlLT5tc2dDb3VudDsgaSsrLCBwb3MrKykKICAgICB7CisgICAgICAgIGlmIChwb3MgPj0gc3lzTXNnUXVldWUtPnF1ZXVlU2l6ZSkgcG9zID0gMDsKIAkqbXNnID0gc3lzTXNnUXVldWUtPm1lc3NhZ2VzW3Bvc10ubXNnOwogCiAgICAgICAgICAgLyogVHJhbnNsYXRlIG1lc3NhZ2UgKi8KQEAgLTQ1NSw3ICs0NDcsOCBAQAogICAgICAgICBpZiAoaHduZCAmJiAobXNnLT5od25kICE9IGh3bmQpKSBjb250aW51ZTsKICAgICAgICAgaWYgKChmaXJzdCB8fCBsYXN0KSAmJiAKICAgICAgICAgICAgICgobXNnLT5tZXNzYWdlIDwgZmlyc3QpIHx8IChtc2ctPm1lc3NhZ2UgPiBsYXN0KSkpIGNvbnRpbnVlOwotICAgICAgICBpZiAoR2V0V2luZG93VGFzayhtc2ctPmh3bmQpICE9IEdldEN1cnJlbnRUYXNrKCkpCisgICAgICAgIGlmICgobXNnLT5od25kICE9IEdldERlc2t0b3BXaW5kb3coKSkgJiYgCisgICAgICAgICAgICAoR2V0V2luZG93VGFzayhtc2ctPmh3bmQpICE9IEdldEN1cnJlbnRUYXNrKCkpKQogICAgICAgICAgICAgY29udGludWU7ICAvKiBOb3QgZm9yIHRoaXMgdGFzayAqLwogICAgICAgICBpZiAocmVtb3ZlKSBNU0dfUmVtb3ZlTXNnKCBzeXNNc2dRdWV1ZSwgcG9zICk7CiAgICAgICAgIHJldHVybiBUUlVFOwpAQCAtNzM0LDEyICs3MjcsMTYgQEAKICAgICBYRXZlbnQgZXZlbnQ7CiAgICAgaW50IGZkID0gQ29ubmVjdGlvbk51bWJlcihkaXNwbGF5KTsKIAotICAgIGlmICghWFBlbmRpbmcoZGlzcGxheSkpCisgICAgaWYgKCFYUGVuZGluZyhkaXNwbGF5KSAmJiAobWF4V2FpdCAhPSAtMSkpCiAgICAgewogICAgICAgICBGRF9aRVJPKCAmcmVhZF9zZXQgKTsKICAgICAgICAgRkRfU0VUKCBmZCwgJnJlYWRfc2V0ICk7CisKKwl0aW1lb3V0LnR2X3VzZWMgPSAobWF4V2FpdCAlIDEwMDApICogMTAwMDsKKwl0aW1lb3V0LnR2X3NlYyA9IG1heFdhaXQgLyAxMDAwOworCisjaWZkZWYgQ09ORklHX0lQQwogCXNpZ3NldGptcChlbnZfd2FpdF94LCAxKTsKLQkKIAlzdG9wX3dhaXRfb3A9IENPTlQ7CiAJICAgIAogCWlmIChEREVfR2V0UmVtb3RlTWVzc2FnZSgpKSB7CkBAIC03NDcsMTAgKzc0NCw2IEBACiAJCTsKIAkgICAgcmV0dXJuIFRSVUU7CiAJfQotCi0JdGltZW91dC50dl91c2VjID0gKG1heFdhaXQgJSAxMDAwKSAqIDEwMDA7Ci0JdGltZW91dC50dl9zZWMgPSBtYXhXYWl0IC8gMTAwMDsKLQogCXN0b3Bfd2FpdF9vcD0gU1RPUF9XQUlUX1g7CiAJLyogVGhlIGNvZGUgdXAgdG8gdGhlIG5leHQgInN0b3Bfd2FpdF9vcD0gQ09OVCIgbXVzdCBiZSByZWVudHJhbnQgICovCiAJaWYgKHNlbGVjdCggZmQrMSwgJnJlYWRfc2V0LCBOVUxMLCBOVUxMLCAmdGltZW91dCApICE9IDEgJiYKQEAgLTc2MCwxNyArNzUzLDI1IEBACiAJfSBlbHNlIHsKIAkgICAgc3RvcF93YWl0X29wPSBDT05UOwogCX0KLQkgICAgCisjZWxzZSAgLyogQ09ORklHX0lQQyAqLworCWlmIChzZWxlY3QoIGZkKzEsICZyZWFkX3NldCwgTlVMTCwgTlVMTCwgJnRpbWVvdXQgKSAhPSAxKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOyAgLyogVGltZW91dCBvciBlcnJvciAqLworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCisKICAgICB9CiAKICAgICAvKiBQcm9jZXNzIHRoZSBldmVudCAoYW5kIHBvc3NpYmx5IG90aGVycyB0aGF0IG9jY3VycmVkIGluIHRoZSBtZWFudGltZSkgKi8KICAgICBkbwogICAgIHsKLQlpZiAoRERFX0dldFJlbW90ZU1lc3NhZ2UoKSkgewotCSAgICB3aGlsZShEREVfR2V0UmVtb3RlTWVzc2FnZSgpKQotCQk7CisKKyNpZmRlZiBDT05GSUdfSVBDCisJaWYgKERERV9HZXRSZW1vdGVNZXNzYWdlKCkpCisgICAgICAgIHsKKwkgICAgd2hpbGUoRERFX0dldFJlbW90ZU1lc3NhZ2UoKSkgOwogCSAgICByZXR1cm4gVFJVRTsKIAl9CisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KKwogICAgICAgICBYTmV4dEV2ZW50KCBkaXNwbGF5LCAmZXZlbnQgKTsKICAgICAgICAgRVZFTlRfUHJvY2Vzc0V2ZW50KCAmZXZlbnQgKTsKICAgICB9CkBAIC03ODksOCArNzkwLDEwIEBACiAgICAgTUVTU0FHRVFVRVVFICptc2dRdWV1ZTsKICAgICBMT05HIG5leHRFeHA7ICAvKiBOZXh0IHRpbWVyIGV4cGlyYXRpb24gdGltZSAqLwogCisjaWZkZWYgQ09ORklHX0lQQwogICAgIERERV9UZXN0RERFKGh3bmQpOwkvKiBkbyB3ZSBoYXZlIGRkZSBoYW5kbGluZyBpbiB0aGUgd2luZG93ID8qLwogICAgIERERV9HZXRSZW1vdGVNZXNzYWdlKCk7CisjZW5kaWYgIC8qIENPTkZJR19JUEMgKi8KICAgICAKICAgICBpZiAoZmlyc3QgfHwgbGFzdCkKICAgICB7CkBAIC05NzQsOCArOTc3LDEwIEBACiAgICAgbXNnLnB0LnggICAgPSAwOwogICAgIG1zZy5wdC55ICAgID0gMDsKIAorI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAoRERFX1Bvc3RNZXNzYWdlKCZtc2cpKQogICAgICAgIHJldHVybiBUUlVFOworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCiAgICAgCiAgICAgaWYgKGh3bmQgPT0gSFdORF9CUk9BRENBU1QpIHsKICAgICAgIGRwcmludGZfbXNnKHN0ZGRlYiwiUG9zdE1lc3NhZ2UgLy8gSFdORF9CUk9BRENBU1QgIVxuIik7CkBAIC0xMDI2LDcgKzEwMzEsNiBAQAogewogICAgIFdORCAqIHduZFB0cjsKICAgICBMT05HIHJldDsKLSAgICBNU0cgRERFX21zZzsKICAgICBzdHJ1Y3QKICAgICB7CiAJTE9ORyBsUGFyYW07CkBAIC0xMDM1LDExICsxMDM5LDEwIEBACiAJV09SRCBoV25kOwogICAgIH0gbXNnc3RydWN0ID0geyBsUGFyYW0sIHdQYXJhbSwgbXNnLCBod25kIH07CiAKLSAgICBEREVfbXNnLmh3bmQgICAgPSBod25kOwotICAgIERERV9tc2cubWVzc2FnZSA9IG1zZzsKLSAgICBEREVfbXNnLndQYXJhbSAgPSB3UGFyYW07Ci0gICAgRERFX21zZy5sUGFyYW0gID0gbFBhcmFtOworI2lmZGVmIENPTkZJR19JUEMKKyAgICBNU0cgRERFX21zZyA9IHsgaHduZCwgbXNnLCB3UGFyYW0sIGxQYXJhbSB9OwogICAgIGlmIChEREVfU2VuZE1lc3NhZ2UoJkRERV9tc2cpKSByZXR1cm4gVFJVRTsKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwogCiAgICAgaWYgKGh3bmQgPT0gSFdORF9CUk9BRENBU1QpCiAgICAgewpAQCAtMTA4MCw3ICsxMDgzLDkgQEAKICAgICBNRVNTQUdFUVVFVUUgKnF1ZXVlOwogICAgIExPTkcgbmV4dEV4cCA9IC0xOyAgLyogTmV4dCB0aW1lciBleHBpcmF0aW9uIHRpbWUgKi8KIAorI2lmZGVmIENPTkZJR19JUEMKICAgICBEREVfR2V0UmVtb3RlTWVzc2FnZSgpOworI2VuZGlmICAvKiBDT05GSUdfSVBDICovCiAgICAgCiAgICAgaWYgKCEocXVldWUgPSAoTUVTU0FHRVFVRVVFICopR2xvYmFsTG9jayggR2V0VGFza1F1ZXVlKDApICkpKSByZXR1cm47CiAgICAgaWYgKChxdWV1ZS0+d1Bvc3RRTXNnKSB8fCAKQEAgLTExOTcsNyArMTIwMiw3IEBACiBXT1JEIFJlZ2lzdGVyV2luZG93TWVzc2FnZSggU0VHUFRSIHN0ciApCiB7CiAgICAgZHByaW50Zl9tc2coc3RkZGViLCAiUmVnaXN0ZXJXaW5kb3dNZXNzYWdlOiAnJTA4bHgnXG4iLCBzdHIgKTsKLSAgICByZXR1cm4gTG9jYWxBZGRBdG9tKCBzdHIgKTsKKyAgICByZXR1cm4gR2xvYmFsQWRkQXRvbSggc3RyICk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvd2luZG93cy93aW4uYyBiL3dpbmRvd3Mvd2luLmMKaW5kZXggMDU0ZGY4Yy4uNTg3NGVjYiAxMDA2NDQKLS0tIGEvd2luZG93cy93aW4uYworKysgYi93aW5kb3dzL3dpbi5jCkBAIC0xODksOCArMTg5LDEwIEBACiAgICAgV05EICp3bmRQdHIgPSBXSU5fRmluZFduZFB0ciggaHduZCApOwogICAgIENMQVNTICpjbGFzc1B0ciA9IENMQVNTX0ZpbmRDbGFzc1B0ciggd25kUHRyLT5oQ2xhc3MgKTsKIAorI2lmZGVmIENPTkZJR19JUEMKICAgICBpZiAobWFpbl9ibG9jaykKIAlEREVfRGVzdHJveVdpbmRvdyhod25kKTsKKyNlbmRpZiAgLyogQ09ORklHX0lQQyAqLwogCQogICAgIGlmICghd25kUHRyIHx8ICFjbGFzc1B0cikgcmV0dXJuOwogICAgIFdJTl9VbmxpbmtXaW5kb3coIGh3bmQgKTsgLyogUmVtb3ZlIHRoZSB3aW5kb3cgZnJvbSB0aGUgbGlua2VkIGxpc3QgKi8KZGlmZiAtLWdpdCBhL3dpbmUuaW5pIGIvd2luZS5pbmkKaW5kZXggNmFkODFkMC4uZmFhNTZmYyAxMDA2NDQKLS0tIGEvd2luZS5pbmkKKysrIGIvd2luZS5pbmkKQEAgLTE0LDcgKzE0LDcgQEAKIFN5bWJvbFRhYmxlRmlsZT0uL3dpbmUuc3ltDQogDQogW2ZvbnRzXQ0KLXN5c3RlbT1iaXRzdHJlYW0tY291cmllcg0KK3N5c3RlbT0qLWhlbHZldGljYQ0KIG1zc2Fuc3NlcmlmPSotaGVsdmV0aWNhDQogbXNzZXJpZj0qLXRpbWVzDQogZml4ZWRzeXM9Ki1maXhlZA0K