LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgUG9ydGVkIHRvIFVTQjJVQVJUIHByb2plY3QKKiAgQXV0aG9yOiAgRGluZXNoIEFubmF5eWEKKiAgICAgICAgICAgRW1haWw6LSBkaW5lc2hhQG9wZW5jb3Jlcy5vcmcKKgoqICAgICBEYXRlOiA0dGggRmViIDIwMTMKKiAgICAgQ2hhbmdlczoKKiAgICAgQS4gV2FybmluZyBDbGVhbiBVcAoqCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgSW50ZXJuYWwgU2V0dXAgRW5naW5lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgQXV0aG9yOiBSdWRvbGYgVXNzZWxtYW5uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgcnVkaUBhc2ljcy53cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gIERvd25sb2FkZWQgZnJvbTogaHR0cDovL3d3dy5vcGVuY29yZXMub3JnL2NvcmVzL3VzYjFfZnVuY3QvLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vIENvcHlyaWdodCAoQykgMjAwMC0yMDAyIFJ1ZG9sZiBVc3NlbG1hbm4gICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICB3d3cuYXNpY3Mud3MgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgcnVkaUBhc2ljcy53cyAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyBUaGlzIHNvdXJjZSBmaWxlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB3aXRob3V0ICAgICAgICAvLy8vCi8vLy8gcmVzdHJpY3Rpb24gcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgaXMgbm90ICAgLy8vLwovLy8vIHJlbW92ZWQgZnJvbSB0aGUgZmlsZSBhbmQgdGhhdCBhbnkgZGVyaXZhdGl2ZSB3b3JrIGNvbnRhaW5zIC8vLy8KLy8vLyB0aGUgb3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhlIGFzc29jaWF0ZWQgZGlzY2xhaW1lci4vLy8vCi8vLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vLwovLy8vICAgICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgICAgIC8vLy8KLy8vLyBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgICAvLy8vCi8vLy8gVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTICAgLy8vLwovLy8vIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiAgICAgIC8vLy8KLy8vLyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgICAgICAgICAvLy8vCi8vLy8gSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgICAgLy8vLwovLy8vIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSAgIC8vLy8KLy8vLyBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SICAgICAgICAvLy8vCi8vLy8gQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAgLy8vLwovLy8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiAgQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgIC8vLy8KLy8vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUICAvLy8vCi8vLy8gT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFICAgICAgICAgLy8vLwovLy8vIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLy8KLy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8vCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKLy8gIENWUyBMb2cKLy8KLy8gICRJZDogdXNiMV9jdHJsLnYsdiAxLjIgMjAwMi0wOS0yNSAwNjowNjo0OSBydWRpIEV4cCAkCi8vCi8vICAkRGF0ZTogMjAwMi0wOS0yNSAwNjowNjo0OSAkCi8vICAkUmV2aXNpb246IDEuMiAkCi8vICAkQXV0aG9yOiBydWRpICQKLy8gICRMb2NrZXI6ICAkCi8vICAkU3RhdGU6IEV4cCAkCi8vCi8vIENoYW5nZSBIaXN0b3J5OgovLyAgICAgICAgICAgICAgICRMb2c6IG5vdCBzdXBwb3J0ZWQgYnkgY3ZzMnN2biAkCi8vICAgICAgICAgICAgICAgUmV2aXNpb24gMS4xLjEuMSAgMjAwMi8wOS8xOSAxMjowNzowOSAgcnVkaQovLyAgICAgICAgICAgICAgIEluaXRpYWwgQ2hlY2tpbgovLwovLwovLwovLwovLwovLwoKYGluY2x1ZGUgInVzYjFkX2RlZmluZXMudiIKCm1vZHVsZSB1c2IxZF9jdHJsKAljbGssIHJzdCwKCgkJCXJvbV9hZHIsIHJvbV9kYXRhLAoKCQkJY3RybF9zZXR1cCwgY3RybF9pbiwgY3RybF9vdXQsCgoJCQlyeF9jdHJsX2RhdGEsIHJ4X2N0cmxfZHZhbGlkLHJ4X2N0cmxfZGRvbmUsCgoJCQllcDBfZGluLCBlcDBfZG91dCwgZXAwX3JlLCBlcDBfd2UsIGVwMF9zdGF0LAoJCQllcDBfc2l6ZSwKCgkJCXNlbmRfc3RhbGwsIGZyYW1lX25vLAoJCQlmdW5jdF9hZHIsIGNvbmZpZ3VyZWQsIGhhbHQsCgoJCQl2X3NldF9pbnQsIHZfc2V0X2ZlYXR1cmUsIHdWYWx1ZSwgd0luZGV4LCB2ZW5kb3JfZGF0YSwKCgkgICAgICAgLy8gUmVnaXN0ZXIgSW50ZXJmYWNlCgkJcmVnX2FkZHIsCgkJcmVnX3Jkd3JuLAoJCXJlZ19yZXEsCgkJcmVnX3dkYXRhLAoJCXJlZ19yZGF0YSwKCQlyZWdfYWNrCgoKCQkpOwoKaW5wdXQJCWNsaywgcnN0OwoKb3V0cHV0CVs2OjBdCXJvbV9hZHI7CmlucHV0CVs3OjBdCXJvbV9kYXRhOwoKaW5wdXQJCWN0cmxfc2V0dXA7CmlucHV0CQljdHJsX2luOwppbnB1dAkJY3RybF9vdXQ7CgoKaW5wdXQgWzc6MF0gICAgIHJ4X2N0cmxfZGF0YTsgCmlucHV0ICAgICAgICAgICByeF9jdHJsX2R2YWxpZDsKaW5wdXQgICAgICAgICAgIHJ4X2N0cmxfZGRvbmU7CgppbnB1dAlbNzowXQllcDBfZGluOwpvdXRwdXQJWzc6MF0JZXAwX2RvdXQ7Cm91dHB1dAkJZXAwX3JlLCBlcDBfd2U7CmlucHV0CVszOjBdCWVwMF9zdGF0OwpvdXRwdXQJWzc6MF0JZXAwX3NpemU7CgpvdXRwdXQJCXNlbmRfc3RhbGw7CmlucHV0CVsxMDowXQlmcmFtZV9ubzsKb3V0cHV0CVs2OjBdCWZ1bmN0X2FkcjsKb3V0cHV0CQljb25maWd1cmVkLCBoYWx0OwoKb3V0cHV0CQl2X3NldF9pbnQ7Cm91dHB1dAkJdl9zZXRfZmVhdHVyZTsKb3V0cHV0CVsxNTowXQl3VmFsdWU7Cm91dHB1dAlbMTU6MF0Jd0luZGV4OwppbnB1dAlbMTU6MF0JdmVuZG9yX2RhdGE7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlZ2lzdGVyIEludGVyZmFjZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCm91dHB1dCBbMzE6MF0gICByZWdfYWRkcjsgICAvLyBSZWdpc3RlciBBZGRyZXNzCm91dHB1dAkJcmVnX3Jkd3JuOyAgLy8gMCAtPiB3cml0ZSwgMS0+IHJlYWQKb3V0cHV0CQlyZWdfcmVxOyAgICAvLyAgUmVnaXN0ZXIgUmVxCm91dHB1dCBbMzE6MF0JcmVnX3dkYXRhOyAgLy8gUmVnaXN0ZXIgd3JpdGUgZGF0YQppbnB1dCAgWzMxOjBdCXJlZ19yZGF0YTsgIC8vIFJlZ2lzdGVyIFJlYWQgRGF0YQppbnB1dAkJcmVnX2FjazsgICAgLy8gUmVnaXN0ZXIgQWNrCgoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gTG9jYWwgV2lyZXMgYW5kIFJlZ2lzdGVycwovLwoKcGFyYW1ldGVyCUlETEUJCQk9CTIwJ2IwMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDEsCgkJR0VUX0hEUgkJCT0JMjAnYjAwMDBfMDAwMF8wMDAwXzAwMDBfMDAxMCwKCQlHRVRfU1RBVFVTX1MJCT0JMjAnYjAwMDBfMDAwMF8wMDAwXzAwMDBfMDEwMCwKCQlDTEVBUl9GRUFUVVJFX1MJCT0JMjAnYjAwMDBfMDAwMF8wMDAwXzAwMDBfMTAwMCwKCQlTRVRfRkVBVFVSRV9TCQk9CTIwJ2IwMDAwXzAwMDBfMDAwMF8wMDAxXzAwMDAsCgkJU0VUX0FERFJFU1NfUwkJPQkyMCdiMDAwMF8wMDAwXzAwMDBfMDAxMF8wMDAwLAoJCUdFVF9ERVNDUklQVE9SX1MJPQkyMCdiMDAwMF8wMDAwXzAwMDBfMDEwMF8wMDAwLAoJCVNFVF9ERVNDUklQVE9SX1MJPQkyMCdiMDAwMF8wMDAwXzAwMDBfMTAwMF8wMDAwLAoJCUdFVF9DT05GSUdfUwkJPQkyMCdiMDAwMF8wMDAwXzAwMDFfMDAwMF8wMDAwLAoJCVNFVF9DT05GSUdfUwkJPQkyMCdiMDAwMF8wMDAwXzAwMTBfMDAwMF8wMDAwLAoJCUdFVF9JTlRFUkZBQ0VfUwkJPQkyMCdiMDAwMF8wMDAwXzAxMDBfMDAwMF8wMDAwLAoJCVNFVF9JTlRFUkZBQ0VfUwkJPQkyMCdiMDAwMF8wMDAwXzEwMDBfMDAwMF8wMDAwLAoJCVNZTkNIX0ZSQU1FX1MJCT0JMjAnYjAwMDBfMDAwMV8wMDAwXzAwMDBfMDAwMCwKCQlXQUlUX0lOX0RBVEEJCT0JMjAnYjAwMDBfMDAxMF8wMDAwXzAwMDBfMDAwMCwKCQlTVEFUVVNfSU4JCT0JMjAnYjAwMDBfMDEwMF8wMDAwXzAwMDBfMDAwMCwKCQlTVEFUVVNfT1VUCQk9CTIwJ2IwMDAwXzEwMDBfMDAwMF8wMDAwXzAwMDAsCgkJVl9TRVRfSU5UX1MJCT0JMjAnYjAwMDFfMDAwMF8wMDAwXzAwMDBfMDAwMCwKCQlWX0dFVF9TVEFUVVNfUwkJPQkyMCdiMDAxMF8wMDAwXzAwMDBfMDAwMF8wMDAwLAoJCVZfR0VUX1JFR19SREFUQV9TCT0JMjAnYjAxMDBfMDAwMF8wMDAwXzAwMDBfMDAwMCwKCQlWX1dBSVRfUkRBVEFfRE9ORV9TICAgICA9CTIwJ2IxMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDA7CgoKd2lyZQlbNzowXQlibVJlcVR5cGUsIGJSZXF1ZXN0Owp3aXJlCVsxNTowXQl3VmFsdWUsIHdJbmRleCwgd0xlbmd0aDsKd2lyZQkJYm1fcmVxX2RpcjsKd2lyZQlbMTowXQlibV9yZXFfdHlwZTsKd2lyZQlbNDowXQlibV9yZXFfcmVjcDsKCnJlZwkJZ2V0X3N0YXR1cywgY2xlYXJfZmVhdHVyZSwgc2V0X2ZlYXR1cmUsIHNldF9hZGRyZXNzOwpyZWcJCWdldF9kZXNjcmlwdG9yLCBzZXRfZGVzY3JpcHRvciwgZ2V0X2NvbmZpZywgc2V0X2NvbmZpZzsKcmVnCQlnZXRfaW50ZXJmYWNlLCBzZXRfaW50ZXJmYWNlLCBzeW5jaF9mcmFtZTsKcmVnCQloZHJfZG9uZV9yLCBjb25maWdfZXJyOwpyZWcJCXZfc2V0X2ludCwgdl9zZXRfZmVhdHVyZSwgdl9nZXRfc3RhdHVzOwoKcmVnICAgICAgICAgICAgIHZfc2V0X3JlZ193YWRkcjsgLy8gU2V0IHRoZSBSZWcgQnVzIEFkZHJlc3MKcmVnICAgICAgICAgICAgIHZfc2V0X3JlZ19yYWRkcjsgLy8gU2V0IHRoZSBSZWcgQnVzIEFkZHJlc3MKCndpcmUJCWZpZm9fcmUxLCBmaWZvX2Z1bGwsIGZpZm9fZW1wdHk7CnJlZwkJZmlmb193ZV9kOwpyZWcJWzU6MF0JZGF0YV9zZWw7CnJlZwkJZXAwX3dlOwpyZWcJWzc6MF0JZXAwX2RvdXQ7CnJlZwlbNzowXQllcDBfc2l6ZTsKcmVnCQlzZW5kX3N0YWxsOwpyZWcJWzE5OjBdCXN0YXRlLCBuZXh0X3N0YXRlOwpyZWcJCWdldF9oZHI7CnJlZwlbNzowXQlsZTsKd2lyZQkJaGRyX2RvbmU7CnJlZwkJYWR2OwpyZWcJWzc6MF0JaGRyMCwgaGRyMSwgaGRyMiwgaGRyMywgaGRyNCwgaGRyNSwgaGRyNiwgaGRyNzsKcmVnCVs2OjBdCWZ1bmN0X2FkcjsKcmVnCQlzZXRfYWRyX3BlbmRpbmc7CnJlZwlbNjowXQlmdW5jdF9hZHJfdG1wOwoKcmVnCQlpbl9zaXplXzA7CnJlZwkJaW5fc2l6ZV8xOwpyZWcJCWluX3NpemVfMjsKcmVnCQlpbl9zaXplXzQ7CndpcmUJCWhpZ2hfc2VsOwpyZWcJCXdyaXRlX2RvbmU7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVnaXN0ZXIgSW50ZXJmYWNlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KcmVnICAgWzMxOjBdICAgIHJlZ19hZGRyOwpyZWcgICBbMzE6MF0gICAgcmVnX3dkYXRhOwpyZWcgICBbMzE6MF0gICAgcmVnX3JkYXRhX3I7CnJlZyAgICAgICAgICAgICByZWdfcmVxOwpyZWcgICAgICAgICAgICAgcmVnX3Jkd3JuOyAvLyAwIC0gd3JpdGUsIDEgLT4gcmVhZApyZWcgICAgICAgICAgICAgcmVnX3dwaGFzZTsgLy8gcmVnaXN0ZXIgd3JpdGUgcGhhc2UKcmVnICAgICAgICAgICAgIHJlZ19ycGhhc2U7IC8vIHJlZ2lzdGVyIHJlYWQgcGhhc2UKcmVnIFszOjBdICAgICAgIHR4X2JjbnQ7IC8vIHRyYW5zbWl0IGJ5dGUgY291bnQKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBGSUZPIGludGVyZmFjZQovLwoKYXNzaWduIGVwMF9yZSA9IGZpZm9fcmUxOwphc3NpZ24gZmlmb19lbXB0eSA9IGVwMF9zdGF0WzFdOwphc3NpZ24gZmlmb19mdWxsID0gZXAwX3N0YXRbMl07CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIEN1cnJlbnQgU3RhdGVzCi8vCnJlZwlhZGRyZXNzZWQ7CnJlZwljb25maWd1cmVkOwpyZWcJaGFsdDsKd2lyZQljbHJfaGFsdDsKd2lyZQlzZXRfaGFsdD0wOwkvLyBGSVhfTUUKCi8vIEZvciB0aGlzIGltcGxlbWVudGF0aW9uIHdlIGRvIG5vdCBpbXBsZW1lbnQgSEFMVCBmb3IgdGhlCi8vIGRldmljZSBub3IgZm9yIGFueSBvZiB0aGUgZW5kcG9pbnRzLiBUaGlzIGlzIHVzZWxlc3MgZm9yCi8vIHRoaXMgZGV2aWNlLCBidXQgY2FuIGJlIGFkZGVkIGhlcmUgbGF0ZXIgLi4uCi8vIEZZSSwgd2UgcmVwb3J0IGRldmljZS9lbmRwb2ludCBlcnJvcnMgdmlhIGludGVycnVwdHMsCi8vIGluc3RlYWQgb2YgaGFsdGluZyB0aGUgZW50aXJlIG9yIHBhcnQgb2YgdGhlIGRldmljZSwgbXVjaAovLyBuaWNlciBmb3Igbm9uLWNyaXRpY2FsIGVycm9ycy4KCmFzc2lnbiBjbHJfaGFsdCA9IGN0cmxfc2V0dXA7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKCFyc3QpCWFkZHJlc3NlZCA8PSAjMSAxJ2IwOwoJZWxzZQoJaWYoc2V0X2FkZHJlc3MpCWFkZHJlc3NlZCA8PSAjMSAxJ2IxOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglpZighcnN0KQljb25maWd1cmVkIDw9ICMxIDEnYjA7CgllbHNlCglpZihzZXRfY29uZmlnKQljb25maWd1cmVkIDw9ICMxIDEnYjE7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKCFyc3QpCWhhbHQgPD0gIzEgMSdiMDsKCWVsc2UKCWlmKGNscl9oYWx0KQloYWx0IDw9ICMxIDEnYjA7CgllbHNlCglpZihzZXRfaGFsdCkJaGFsdCA8PSAjMSAxJ2IxOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEZXNjcmlwdG9yIFJPTQovLwpyZWcJWzY6MF0Jcm9tX2FkcjsKcmVnCQlyb21fc2VsLCByb21fc2VsX3I7CndpcmUJCXJvbV9kb25lOwpyZWcJWzY6MF0Jcm9tX3NpemU7CnJlZwkJZmlmb193ZV9yb21fcjsKcmVnCQlmaWZvX3dlX3JvbV9yMjsKd2lyZQkJZmlmb193ZV9yb207CnJlZwlbNzowXQlyb21fc3RhcnRfZDsKcmVnCVs2OjBdCXJvbV9zaXplX2RkOwp3aXJlCVs2OjBdCXJvbV9zaXplX2Q7CgphbHdheXMgQCh3VmFsdWUpCgljYXNlKHdWYWx1ZVsxMTo4XSkJCS8vIHN5bm9wc3lzIGZ1bGxfY2FzZSBwYXJhbGxlbF9jYXNlCgkgICA0J2gxOglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQwOwoJICAgNCdoMjoJcm9tX3N0YXJ0X2QgPSBgUk9NX1NUQVJUMTsKCSAgIDQnaDM6CgkJY2FzZSh3VmFsdWVbMzowXSkJLy8gc3lub3BzeXMgZnVsbF9jYXNlIHBhcmFsbGVsX2Nhc2UKCQkgICA0J2gwOglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQyQTsKCQkgICA0J2gxOglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQyQjsKCQkgICA0J2gyOglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQyQzsKCQkgICA0J2gzOglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQyRDsKCQkgICBkZWZhdWx0Oglyb21fc3RhcnRfZCA9IGBST01fU1RBUlQyQTsKCQllbmRjYXNlCgkgICBkZWZhdWx0Oglyb21fc3RhcnRfZCA9IDcnaDAwOwoJZW5kY2FzZQoKYWx3YXlzIEAod1ZhbHVlKQoJY2FzZSh3VmFsdWVbMTE6OF0pCQkvLyBzeW5vcHN5cyBmdWxsX2Nhc2UgcGFyYWxsZWxfY2FzZQoJICAgNCdoMToJcm9tX3NpemVfZGQgPSBgUk9NX1NJWkUwOwoJICAgNCdoMjoJcm9tX3NpemVfZGQgPSBgUk9NX1NJWkUxOwoJICAgNCdoMzoKCQljYXNlKHdWYWx1ZVszOjBdKQkvLyBzeW5vcHN5cyBmdWxsX2Nhc2UgcGFyYWxsZWxfY2FzZQoJCSAgIDQnaDA6CXJvbV9zaXplX2RkID0gYFJPTV9TSVpFMkE7CgkJICAgNCdoMToJcm9tX3NpemVfZGQgPSBgUk9NX1NJWkUyQjsKCQkgICA0J2gyOglyb21fc2l6ZV9kZCA9IGBST01fU0laRTJDOwoJCSAgIDQnaDM6CXJvbV9zaXplX2RkID0gYFJPTV9TSVpFMkQ7CgkJICAgZGVmYXVsdDoJcm9tX3NpemVfZGQgPSBgUk9NX1NJWkUyQTsKCQllbmRjYXNlCgkgICBkZWZhdWx0Oglyb21fc2l6ZV9kZCA9IDcnaDAxOwoJZW5kY2FzZQoKYXNzaWduIHJvbV9zaXplX2QgPSAocm9tX3NpemVfZGQgPiB3TGVuZ3RoWzY6MF0pID8gd0xlbmd0aFs2OjBdIDogcm9tX3NpemVfZGQ7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXJvbV9zZWxfciA8PSAjMSByb21fc2VsOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglpZighcnN0KQkJCXJvbV9hZHIgPD0gIzEgNydoMDsKCWVsc2UKCWlmKHJvbV9zZWwgJiAhcm9tX3NlbF9yKQlyb21fYWRyIDw9ICMxIHJvbV9zdGFydF9kOwoJZWxzZQoJaWYocm9tX3NlbCAmICFmaWZvX2Z1bGwpCXJvbV9hZHIgPD0gIzEgcm9tX2FkciArIDcnaDE7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKCFyc3QpCQkJcm9tX3NpemUgPD0gIzEgNydoMDsKCWVsc2UKCWlmKHJvbV9zZWwgJiAhcm9tX3NlbF9yKQlyb21fc2l6ZSA8PSAjMSByb21fc2l6ZV9kOwoJZWxzZQoJaWYocm9tX3NlbCAmICFmaWZvX2Z1bGwpCXJvbV9zaXplIDw9ICMxIHJvbV9zaXplIC0gNydoMDE7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWZpZm9fd2Vfcm9tX3IgPD0gIzEgcm9tX3NlbDsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJZmlmb193ZV9yb21fcjIgPD0gIzEgZmlmb193ZV9yb21fcjsKCmFzc2lnbiBmaWZvX3dlX3JvbSA9IHJvbV9zZWwgJiBmaWZvX3dlX3JvbV9yMjsKCmFzc2lnbiByb21fZG9uZSA9IChyb21fc2l6ZSA9PSA3J2gwKSAmICEocm9tX3NlbCAmICFyb21fc2VsX3IpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBHZXQgSGVhZGVyCi8vCgphc3NpZ24gZmlmb19yZTEgPSAoZ2V0X2hkciB8IHJlZ193cGhhc2UpICYgIWZpZm9fZW1wdHk7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWFkdiA8PSAjMSBnZXRfaGRyICYgIWZpZm9fZW1wdHkgJiAhYWR2OwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglpZighcnN0KQlsZSA8PSAjMSA4J2gwOwoJZWxzZQoJaWYoIWdldF9oZHIpCWxlIDw9ICMxIDgnaDA7CgllbHNlCglpZighKHxsZSkpCWxlIDw9ICMxIDgnaDE7CgllbHNlCglpZihmaWZvX3JlMSAmJiBnZXRfaGRyKQlsZSA8PSAjMSB7bGVbNjowXSwgMSdiMH07CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzBdKQloZHIwIDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzFdKQloZHIxIDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzJdKQloZHIyIDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzNdKQloZHIzIDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzRdKQloZHI0IDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzVdKQloZHI1IDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzZdKQloZHI2IDw9ICMxIGVwMF9kaW47CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKGxlWzddKQloZHI3IDw9ICMxIGVwMF9kaW47Cgphc3NpZ24gaGRyX2RvbmUgPSBsZVs3XSAmIGZpZm9fcmUxICYgZ2V0X2hkcjsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU2VuZCBEYXRhIHRvIEhvc3QKLy8KcGFyYW1ldGVyCVpFUk9fREFUQQk9CTYnYjAwMDAwMSwKCQlaRVJPX09ORV9EQVRBCT0JNidiMDAwMDEwLAoJCUNPTkZJR19EQVRBCT0JNidiMDAwMTAwLAoJCVNZTkNfRlJBTUVfREFUQQk9CTYnYjAwMTAwMCwKCQlWRU5EX0RBVEEJPQk2J2IwMTAwMDAsCgkJUkVHX1JEQVRBCT0JNidiMTAwMDAwOwoKYXNzaWduIGhpZ2hfc2VsID0gd3JpdGVfZG9uZTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJY2FzZShkYXRhX3NlbCkJCS8vIHN5bm9wc3lzIGZ1bGxfY2FzZSBwYXJhbGxlbF9jYXNlCgkgICBaRVJPX0RBVEE6CQllcDBfZG91dCA8PSAjMSByb21fc2VsID8gcm9tX2RhdGEgOiA4J2gwOwoJICAgWkVST19PTkVfREFUQToJZXAwX2RvdXQgPD0gIzEgaGlnaF9zZWwgPyA4J2gxIDogOCdoMDsKCSAgIENPTkZJR19EQVRBOgkJZXAwX2RvdXQgPD0gIzEgezcnaDAsIGNvbmZpZ3VyZWR9OwkvLyByZXR1cm4gY29uZmlndXJhdGlvbgoJICAgU1lOQ19GUkFNRV9EQVRBOgllcDBfZG91dCA8PSAjMSBoaWdoX3NlbCA/IHs1J2gwLCBmcmFtZV9ub1sxMDo4XX0gOiBmcmFtZV9ub1s3OjBdOwoJICAgVkVORF9EQVRBOgkJZXAwX2RvdXQgPD0gIzEgaGlnaF9zZWwgPyB2ZW5kb3JfZGF0YVsxNTo4XSA6IHZlbmRvcl9kYXRhWzc6MF07CgkgICBSRUdfUkRBVEE6CQllcDBfZG91dCA8PSAjMSAodHhfYmNudD09MCkgPyByZWdfcmRhdGFfclszMToyNF0gOiAKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR4X2JjbnQ9PTEpID8gcmVnX3JkYXRhX3JbMjM6MTZdIDoKCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR4X2JjbnQ9PTIpID8gcmVnX3JkYXRhX3JbMTU6OF0gOiByZWdfcmRhdGFfcls3OjBdOwoJZW5kY2FzZQoKYWx3YXlzIEAocG9zZWRnZSBjbGspCgllcDBfd2UgPD0gIzEgKGZpZm9fd2VfZCAmICF3cml0ZV9kb25lKSB8IGZpZm9fd2Vfcm9tOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglpZihpbl9zaXplXzApCSAgICAgICAgZXAwX3NpemUgPD0gIzEgOCdoMDsKCWVsc2UgaWYoaW5fc2l6ZV8xKQllcDBfc2l6ZSA8PSAjMSA4J2gxOwoJZWxzZSBpZihpbl9zaXplXzIpCWVwMF9zaXplIDw9ICMxIDgnaDI7CgllbHNlIGlmKGluX3NpemVfNCkJZXAwX3NpemUgPD0gIzEgOCdoNDsKCWVsc2UKCWlmKHJvbV9zZWwpCWVwMF9zaXplIDw9ICMxIHsxJ2IwLCByb21fc2l6ZV9kfTsKCgphbHdheXMgQChwb3NlZGdlIGNsaykgYmVnaW4KICAgaWYoIXJzdCkgYmVnaW4KICAgICAgIHR4X2JjbnQgICAgPD0gMDsKICAgICAgIHdyaXRlX2RvbmUgPD0gMDsKICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgICBpZihzdGF0ZSA9PSBJRExFKSAgYmVnaW4KCSAgdHhfYmNudCA8PSAwOwoJICB3cml0ZV9kb25lIDw9IDA7IAogICAgICBlbmQgZWxzZSBpZigoZXAwX3NpemUgPT0gKHR4X2JjbnQrMSkpICAmJiAoIWZpZm9fZnVsbCAmJiBmaWZvX3dlX2QpKQoJICB3cml0ZV9kb25lIDw9IDE7CiAgICAgIGVsc2UgaWYoIWZpZm9fZnVsbCAmJiBmaWZvX3dlX2QgKSAKCSAgdHhfYmNudCA8PSB0eF9iY250KzE7CiAgICAgIGVsc2UgCgkgIHdyaXRlX2RvbmUgPD0gMDsKICAgZW5kCmVuZAoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLwovLyBEZWNvZGUgSGVhZGVyCi8vCgovLyBWYWxpZCBiUmVxdWVzdCBDb2RlcwpwYXJhbWV0ZXIJR0VUX1NUQVRVUwk9CTgnaDAwLAoJCUNMRUFSX0ZFQVRVUkUJPQk4J2gwMSwKCQlTRVRfRkVBVFVSRQk9CTgnaDAzLAoJCVNFVF9BRERSRVNTCT0JOCdoMDUsCgkJR0VUX0RFU0NSSVBUT1IJPQk4J2gwNiwKCQlTRVRfREVTQ1JJUFRPUgk9CTgnaDA3LAoJCUdFVF9DT05GSUcJPQk4J2gwOCwKCQlTRVRfQ09ORklHCT0JOCdoMDksCgkJR0VUX0lOVEVSRkFDRQk9CTgnaDBhLAoJCVNFVF9JTlRFUkZBQ0UJPQk4J2gwYiwKCQlTWU5DSF9GUkFNRQk9CTgnaDBjLAoJCUNVU1RPTV9SRUdfV0FERFI9CTgnaDEwLCAvLyBBZGRlZCBieSBEaW5lc2gtQSwgMTl0aCBGZWIgMjAxMwoJCUNVU1RPTV9SRUdfUkFERFI9CTgnaDExOyAvLyBBZGRlZCBieSBEaW5lc2gtQSwgMTl0aCBGZWIgMjAxMwoKcGFyYW1ldGVyCVZfU0VUX0lOVAk9CTgnaDBmOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgQXV0aG9yOiBEaW5lc2gtQTogMTh0aCBGZWIgMjAxMyAgCiogIFNldHVwIEJ5dGUgRGV0YWlscwpCeXRlCUZpZWxkCURlc2NyaXB0aW9uCjAJYm1SZXF1ZXN0IFR5cGUJIAogICAgICAgICAgIEJpdCA3OiBSZXF1ZXN0IGRpcmVjdGlvbiAoMD1Ib3N0IHRvIGRldmljZSCWIE91dCwgMT1EZXZpY2UgdG8gaG9zdCCWIEluKS4KICAgICAgICAgICBCaXRzIDUtNjogUmVxdWVzdCB0eXBlICgwPXN0YW5kYXJkLCAxPWNsYXNzLCAyPXZlbmRvciwgMz1yZXNlcnZlZCkuCiAgICAgICAgICAgQml0cyAwLTQ6IFJlY2lwaWVudCAoMD1kZXZpY2UsIDE9aW50ZXJmYWNlLCAyPWVuZHBvaW50LDM9b3RoZXIpLgoxCWJSZXF1ZXN0CSBUaGUgYWN0dWFsIHJlcXVlc3QgKHNlZSB0aGUgU3RhbmRhcmQgRGV2aWNlIFJlcXVlc3QgQ29kZXMgdGFibGUgWzkuMi4xLjVdLgoyCXdWYWx1ZUwJIEEgd29yZC1zaXplIHZhbHVlIHRoYXQgdmFyaWVzIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdC4gRm9yIGV4YW1wbGUsIAogICAgICAgIGluIHRoZSBDTEVBUl9GRUFUVVJFIHJlcXVlc3QgdGhlIHZhbHVlIGlzIHVzZWQgdG8gc2VsZWN0IHRoZSBmZWF0dXJlLCAKCWluIHRoZSBHRVRfREVTQ1JJUFRPUiByZXF1ZXN0IHRoZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIGRlc2NyaXB0b3IgdHlwZSBhbmQgaW4gdGhlIAoJU0VUX0FERFJFU1MgcmVxdWVzdCB0aGUgdmFsdWUgY29udGFpbnMgdGhlIGRldmljZSBhZGRyZXNzLgozCXdWYWx1ZUgJVGhlIHVwcGVyIGJ5dGUgb2YgdGhlIFZhbHVlIHdvcmQuCjQJd0luZGV4TAkgQSB3b3JkLXNpemUgdmFsdWUgdGhhdCB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0LiAKICAgICAgICBUaGUgaW5kZXggaXMgZ2VuZXJhbGx5IHVzZWQgdG8gc3BlY2lmeSBhbiBlbmRwb2ludCBvciBhbiBpbnRlcmZhY2UuCjUJd0luZGV4SAlUaGUgdXBwZXIgYnl0ZSBvZiB0aGUgSW5kZXggd29yZC4KNgl3TGVuZ3RoTCAgQSB3b3JkLXNpemUgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc2ZlcnJlZCBpZiB0aGVyZSBpcyBhIGRhdGEgc3RhZ2UuCjcJd0xlbmd0aEggIFRoZSB1cHBlciBieXRlIG9mIHRoZSBMZW5ndGggd29yZC4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qKioqKioqCmJSZXF1ZXN0CSAgICAgICAgICAgICAgIFZhbHVlCkdFVF9TVEFUVVMJICAgICAgICAgICAgICAgMApDTEVBUl9GRUFUVVJFCSAgICAgICAgICAgICAgIDEKUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UJICAgICAgIDIKU0VUX0ZFQVRVUkUJICAgICAgICAgICAgICAgMwpSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQkgICAgICAgNApTRVRfQUREUkVTUwkgICAgICAgICAgICAgICA1CkdFVF9ERVNDUklQVE9SCSAgICAgICAgICAgICAgIDYKU0VUX0RFU0NSSVBUT1IJICAgICAgICAgICAgICAgNwpHRVRfQ09ORklHVVJBVElPTgkgICAgICAgOApTRVRfQ09ORklHVVJBVElPTgkgICAgICAgOQpHRVRfSU5URVJGQUNFCSAgICAgICAgICAgICAgIDEwClNFVF9JTlRFUkZBQ0UJICAgICAgICAgICAgICAgMTEKU1lOQ0hfRlJBTUUJICAgICAgICAgICAgICAgMTIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgphc3NpZ24gYm1SZXFUeXBlID0gaGRyMDsKYXNzaWduIGJtX3JlcV9kaXIgPSBibVJlcVR5cGVbN107CS8vIDAtSG9zdCB0byBkZXZpY2U7IDEtZGV2aWNlIHRvIGhvc3QgCmFzc2lnbiBibV9yZXFfdHlwZSA9IGJtUmVxVHlwZVs2OjVdOwkvLyAwLXN0YW5kYXJkOyAxLWNsYXNzOyAyLXZlbmRvcjsgMy1SRVNFUlZFRAphc3NpZ24gYm1fcmVxX3JlY3AgPSBibVJlcVR5cGVbNDowXTsJLy8gMC1kZXZpY2U7IDEtaW50ZXJmYWNlOyAyLWVuZHBvaW50OyAzLW90aGVyCgkJCQkJLy8gNC4uMzEtcmVzZXJ2ZWQKYXNzaWduIGJSZXF1ZXN0ID0gIGhkcjE7CmFzc2lnbiB3VmFsdWUgICA9IHtoZHIzLCBoZHIyfTsKYXNzaWduIHdJbmRleCAgID0ge2hkcjUsIGhkcjR9Owphc3NpZ24gd0xlbmd0aCAgPSB7aGRyNywgaGRyNn07CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWhkcl9kb25lX3IgPD0gIzEgaGRyX2RvbmU7CgovLyBTdGFuZGFyZCBjb21tYW5kcyB0aGF0IE1VU1Qgc3VwcG9ydAphbHdheXMgQChwb3NlZGdlIGNsaykKCWdldF9zdGF0dXMgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gR0VUX1NUQVRVUykgJiAoYm1fcmVxX3R5cGU9PTInaDApOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCgljbGVhcl9mZWF0dXJlIDw9ICMxCWhkcl9kb25lICYgKGJSZXF1ZXN0ID09IENMRUFSX0ZFQVRVUkUpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJc2V0X2ZlYXR1cmUgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gU0VUX0ZFQVRVUkUpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJc2V0X2FkZHJlc3MgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gU0VUX0FERFJFU1MpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJZ2V0X2Rlc2NyaXB0b3IgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gR0VUX0RFU0NSSVBUT1IpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJc2V0X2Rlc2NyaXB0b3IgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gU0VUX0RFU0NSSVBUT1IpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJZ2V0X2NvbmZpZyA8PSAjMQloZHJfZG9uZSAmIChiUmVxdWVzdCA9PSBHRVRfQ09ORklHKSAmIChibV9yZXFfdHlwZT09MidoMCk7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXNldF9jb25maWcgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gU0VUX0NPTkZJRykgJiAoYm1fcmVxX3R5cGU9PTInaDApOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglnZXRfaW50ZXJmYWNlIDw9ICMxCWhkcl9kb25lICYgKGJSZXF1ZXN0ID09IEdFVF9JTlRFUkZBQ0UpICYgKGJtX3JlcV90eXBlPT0yJ2gwKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJc2V0X2ludGVyZmFjZSA8PSAjMQloZHJfZG9uZSAmIChiUmVxdWVzdCA9PSBTRVRfSU5URVJGQUNFKSAmIChibV9yZXFfdHlwZT09MidoMCk7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXN5bmNoX2ZyYW1lIDw9ICMxCWhkcl9kb25lICYgKGJSZXF1ZXN0ID09IFNZTkNIX0ZSQU1FKSAmIChibV9yZXFfdHlwZT09MidoMCk7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXZfc2V0X2ludCA8PSAjMQkJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gVl9TRVRfSU5UKSAmIChibV9yZXFfdHlwZT09MidoMik7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXZfc2V0X2ZlYXR1cmUgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gU0VUX0ZFQVRVUkUpICYgKGJtX3JlcV90eXBlPT0yJ2gyKTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJdl9nZXRfc3RhdHVzIDw9ICMxCWhkcl9kb25lICYgKGJSZXF1ZXN0ID09IEdFVF9TVEFUVVMpICYgKGJtX3JlcV90eXBlPT0yJ2gyKTsKYWx3YXlzIEAocG9zZWRnZSBjbGspCgl2X3NldF9yZWdfd2FkZHIgPD0gIzEJaGRyX2RvbmUgJiAoYlJlcXVlc3QgPT0gQ1VTVE9NX1JFR19XQUREUikgJiAoYm1fcmVxX3R5cGU9PTInaDIpOwphbHdheXMgQChwb3NlZGdlIGNsaykKCXZfc2V0X3JlZ19yYWRkciA8PSAjMQloZHJfZG9uZSAmIChiUmVxdWVzdCA9PSBDVVNUT01fUkVHX1JBRERSKSAmIChibV9yZXFfdHlwZT09MidoMik7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKHZfc2V0X3JlZ193YWRkciB8fCB2X3NldF9yZWdfcmFkZHIpIHJlZ19hZGRyICA8PSB7aGRyMixoZHIzLGhkcjQsaGRyNX07IAoKcmVnIFsxOjBdIHJlZ19ieXRlX2NudDsKYWx3YXlzIEAocG9zZWRnZSBjbGspIGJlZ2luCiAgIGlmKCFyc3QpIGJlZ2luCiAgICAgICByZWdfYnl0ZV9jbnQgPD0gMidiMDsKICAgZW5kIGVsc2UgYmVnaW4KICAgICAgaWYodl9zZXRfcmVnX3dhZGRyKSBiZWdpbiAKCSAgcmVnX3dwaGFzZSAgICAgIDw9IDE7IAoJICByZWdfYnl0ZV9jbnQgICAgPD0gMDsKICAgICAgZW5kIGVsc2UgaWYocmVnX2J5dGVfY250ID09IDInYjExICYmIGZpZm9fcmUxKSBiZWdpbgoJICByZWdfd3BoYXNlICA8PSAwOyAKCSAgcmVnX2J5dGVfY250ICAgIDw9IDA7CiAgICAgIGVuZCBlbHNlIGlmKHJlZ193cGhhc2UgJiYgZmlmb19yZTEpIGJlZ2luCgkgcmVnX2J5dGVfY250IDw9IHJlZ19ieXRlX2NudCsxOwogICAgICBlbmQKICAgZW5kCmVuZAoKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQogICAgICBpZihyZWdfd3BoYXNlICYmIGZpZm9fcmUxKSByZWdfd2RhdGEgIDw9IHtyZWdfd2RhdGFbMjM6MF0sZXAwX2Rpbls3OjBdfTsgCgphbHdheXMgQChwb3NlZGdlIGNsaykKICAgICAgaWYocmVnX3Jkd3JuICYmIHJlZ19hY2spIHJlZ19yZGF0YV9yICA8PSB7cmVnX3JkYXRhfTsgCgphbHdheXMgQChwb3NlZGdlIGNsaykgYmVnaW4KICAgaWYoIXJzdCkgYmVnaW4KICAgICAgcmVnX3JlcSAgPD0gMDsgCiAgIGVuZCBlbHNlIGJlZ2luCiAgICAgIGlmKGZpZm9fcmUxICYmIHJlZ193cGhhc2UgJiYgcmVnX2J5dGVfY250PT0gMidiMTEpIHJlZ19yZXEgIDw9IDE7IAogICAgICBlbHNlIGlmKHZfc2V0X3JlZ19yYWRkcikgICAgICAgICByZWdfcmVxICA8PSAxOyAKICAgICAgZWxzZSByZWdfcmVxIDw9IDA7CiAgIGVuZAplbmQKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJaWYodl9zZXRfcmVnX3JhZGRyKSAgICAgIHJlZ19yZHdybiA8PSAxJ2IxIDsKCWVsc2UgaWYodl9zZXRfcmVnX3dhZGRyKSByZWdfcmR3cm4gPD0gMSdiMCA7CgovLyBBIGNvbmZpZyBlcnIgbXVzdCBjYXVzZSB0aGUgZGV2aWNlIHRvIHNlbmQgYSBTVEFMTCBmb3IgYW4gQUNLCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJY29uZmlnX2VyciA8PSAjMSBoZHJfZG9uZV9yICYgIShnZXRfc3RhdHVzIHwgY2xlYXJfZmVhdHVyZSB8CgkJCXNldF9mZWF0dXJlIHwgc2V0X2FkZHJlc3MgfCBnZXRfZGVzY3JpcHRvciB8CgkJCXNldF9kZXNjcmlwdG9yIHwgZ2V0X2NvbmZpZyB8IHNldF9jb25maWcgfAoJCQlnZXRfaW50ZXJmYWNlIHwgc2V0X2ludGVyZmFjZSB8IHN5bmNoX2ZyYW1lIHwKCQkJdl9zZXRfaW50IHwgdl9zZXRfZmVhdHVyZSB8IHZfZ2V0X3N0YXR1cyB8IHZfc2V0X3JlZ193YWRkciB8IHZfc2V0X3JlZ19yYWRkcik7CgphbHdheXMgQChwb3NlZGdlIGNsaykKCXNlbmRfc3RhbGwgPD0gIzEgY29uZmlnX2VycjsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8KLy8gU2V0IGFkZHJlc3MKLy8KCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJaWYoIXJzdCkJCQkJc2V0X2Fkcl9wZW5kaW5nIDw9ICMxIDEnYjA7CgllbHNlCglpZihjdHJsX2luIHwgY3RybF9vdXQgfCBjdHJsX3NldHVwKQlzZXRfYWRyX3BlbmRpbmcgPD0gIzEgMSdiMDsKCWVsc2UKCWlmKHNldF9hZGRyZXNzKQkJCQlzZXRfYWRyX3BlbmRpbmcgPD0gIzEgMSdiMTsKCmFsd2F5cyBAKHBvc2VkZ2UgY2xrKQoJaWYoIXJzdCkJCQlmdW5jdF9hZHJfdG1wIDw9ICMxIDcnaDA7CgllbHNlCglpZihzZXRfYWRkcmVzcykJCQlmdW5jdF9hZHJfdG1wIDw9ICMxIHdWYWx1ZVs2OjBdOwoKYWx3YXlzIEAocG9zZWRnZSBjbGspCglpZighcnN0KQkJCWZ1bmN0X2FkciA8PSAjMSA3J2gwOwoJZWxzZQoJaWYoc2V0X2Fkcl9wZW5kaW5nICYgY3RybF9pbikJZnVuY3RfYWRyIDw9ICMxIGZ1bmN0X2Fkcl90bXA7CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vCi8vIE1haW4gRlNNCi8vCgphbHdheXMgQChwb3NlZGdlIGNsaykKCWlmKCFyc3QpCXN0YXRlIDw9ICMxIElETEU7CgllbHNlCQlzdGF0ZSA8PSBuZXh0X3N0YXRlOwoKYWx3YXlzIEAoc3RhdGUgb3IgY3RybF9zZXR1cCBvciBjdHJsX2luIG9yIGN0cmxfb3V0IG9yIGhkcl9kb25lIG9yCglmaWZvX2Z1bGwgb3Igcm9tX2RvbmUgb3Igd3JpdGVfZG9uZSBvciB3VmFsdWUgb3IgYm1fcmVxX3JlY3Agb3IKCWdldF9zdGF0dXMgb3IgY2xlYXJfZmVhdHVyZSBvciBzZXRfZmVhdHVyZSBvciBzZXRfYWRkcmVzcyBvcgoJZ2V0X2Rlc2NyaXB0b3Igb3Igc2V0X2Rlc2NyaXB0b3Igb3IgZ2V0X2NvbmZpZyBvciBzZXRfY29uZmlnIG9yCglnZXRfaW50ZXJmYWNlIG9yIHNldF9pbnRlcmZhY2Ugb3Igc3luY2hfZnJhbWUgb3Igdl9zZXRfaW50IG9yCgl2X3NldF9mZWF0dXJlIG9yIHZfZ2V0X3N0YXR1cyBvciB2X3NldF9yZWdfd2FkZHIgb3Igdl9zZXRfcmVnX3JhZGRyLCByZWdfYWNrCgkpCiAgIGJlZ2luCgluZXh0X3N0YXRlID0gc3RhdGU7CglnZXRfaGRyICA9IDEnYjA7CglkYXRhX3NlbCA9IFpFUk9fREFUQTsKCWZpZm9fd2VfZCA9IDEnYjA7Cglpbl9zaXplXzAgPSAxJ2IwOwoJaW5fc2l6ZV8xID0gMSdiMDsKCWluX3NpemVfMiA9IDEnYjA7Cglpbl9zaXplXzQgPSAxJ2IwOwoJcm9tX3NlbCA9IDEnYjA7CgoJY2FzZShzdGF0ZSkJLy8gc3lub3BzeXMgZnVsbF9jYXNlIHBhcmFsbGVsX2Nhc2UKCgkJLy8gV2FpdCBmb3IgU2V0dXAgdG9rZW4KCSAgIElETEU6CgkJICAgYmVnaW4KCQkJaWYoY3RybF9zZXR1cCkJCW5leHRfc3RhdGUgPSBHRVRfSERSOwoJCQlpZihnZXRfc3RhdHVzKQkJbmV4dF9zdGF0ZSA9IEdFVF9TVEFUVVNfUzsKCQkJaWYoY2xlYXJfZmVhdHVyZSkJbmV4dF9zdGF0ZSA9IENMRUFSX0ZFQVRVUkVfUzsKCQkJaWYoc2V0X2ZlYXR1cmUpCQluZXh0X3N0YXRlID0gU0VUX0ZFQVRVUkVfUzsKCQkJaWYoc2V0X2FkZHJlc3MpCQluZXh0X3N0YXRlID0gU0VUX0FERFJFU1NfUzsKCQkJaWYoZ2V0X2Rlc2NyaXB0b3IpCW5leHRfc3RhdGUgPSBHRVRfREVTQ1JJUFRPUl9TOwoJCQlpZihzZXRfZGVzY3JpcHRvcikJbmV4dF9zdGF0ZSA9IFNFVF9ERVNDUklQVE9SX1M7CgkJCWlmKGdldF9jb25maWcpCQluZXh0X3N0YXRlID0gR0VUX0NPTkZJR19TOwoJCQlpZihzZXRfY29uZmlnKQkJbmV4dF9zdGF0ZSA9IFNFVF9DT05GSUdfUzsKCQkJaWYoZ2V0X2ludGVyZmFjZSkJbmV4dF9zdGF0ZSA9IEdFVF9JTlRFUkZBQ0VfUzsKCQkJaWYoc2V0X2ludGVyZmFjZSkJbmV4dF9zdGF0ZSA9IFNFVF9JTlRFUkZBQ0VfUzsKCQkJaWYoc3luY2hfZnJhbWUpCQluZXh0X3N0YXRlID0gU1lOQ0hfRlJBTUVfUzsKCQkJaWYodl9zZXRfaW50KQkJbmV4dF9zdGF0ZSA9IFZfU0VUX0lOVF9TOwoJCQlpZih2X3NldF9mZWF0dXJlKQluZXh0X3N0YXRlID0gVl9TRVRfSU5UX1M7CgkJCWlmKHZfZ2V0X3N0YXR1cykJbmV4dF9zdGF0ZSA9IFZfR0VUX1NUQVRVU19TOwoJCQlpZih2X3NldF9yZWdfd2FkZHIpCW5leHRfc3RhdGUgPSBTVEFUVVNfSU47CgkJCWlmKHZfc2V0X3JlZ19yYWRkcikJbmV4dF9zdGF0ZSA9IFZfV0FJVF9SREFUQV9ET05FX1M7CgkJICAgZW5kCgoJCS8vIFJldHJpZXZlIFNldHVwIEhlYWRlcgoJICAgR0VUX0hEUjoKCQkgICBiZWdpbgoJCQlnZXRfaGRyID0gMSdiMTsKCQkJaWYoaGRyX2RvbmUpCW5leHRfc3RhdGUgPSBJRExFOwoJCSAgIGVuZAoKCgkJLy8gQWN0aW9ucyBmb3Igc3VwcG9ydGVkIGNvbW1hbmRzCgkgICBHRVRfU1RBVFVTX1M6CgkJICAgYmVnaW4KCQkJLy8gUmV0dXJucyB0byBob3N0CgkJCS8vIDE2J2gwMDAxIGZvciBkZXZpY2UKCQkJLy8gMTYnaDAwMDAgZm9yIGludGVyZmFjZQoJCQkvLyAxNidoMDAwMCBmb3IgZW5kcG9pbnQKCQkJaWYoYm1fcmVxX3JlY3AgPT0gNSdoMDApCWRhdGFfc2VsID0gWkVST19PTkVfREFUQTsKCQkJZWxzZQkJCQlkYXRhX3NlbCA9IFpFUk9fREFUQTsKCgkJCWluX3NpemVfMiA9IDEnYjE7CgkJCWlmKCFmaWZvX2Z1bGwpCgkJCSAgIGJlZ2luCgkJCQlmaWZvX3dlX2QgPSAxJ2IxOwoJCQkJaWYod3JpdGVfZG9uZSkJbmV4dF9zdGF0ZSA9IFdBSVRfSU5fREFUQTsKCQkJICAgZW5kCgoJCSAgIGVuZAoJICAgVl9HRVRfU1RBVFVTX1M6CgkJICAgYmVnaW4KCQkJZGF0YV9zZWwgPSBWRU5EX0RBVEE7CgkJCWluX3NpemVfMiA9IDEnYjE7CgkJCWlmKCFmaWZvX2Z1bGwpCgkJCSAgIGJlZ2luCgkJCQlmaWZvX3dlX2QgPSAxJ2IxOwoJCQkJaWYod3JpdGVfZG9uZSkJbmV4dF9zdGF0ZSA9IFdBSVRfSU5fREFUQTsKCQkJICAgZW5kCgkJICAgZW5kCgoJVl9XQUlUX1JEQVRBX0RPTkVfUzogYmVnaW4gLy8gV2FpdCBmb3IgUmVnaXN0ZXIgUmVhZCBBY2Nlc3MgQ29tcGxldGlvbgoJCSAgICAgaWYocmVnX2FjaykKCQkJbmV4dF9zdGF0ZSA9IFZfR0VUX1JFR19SREFUQV9TOwoJCSAgIGVuZAoKCSAgIFZfR0VUX1JFR19SREFUQV9TOiAvLyBSZWdpc3RlciBBY2Nlc3MgUmVhZCBEYXRhCgkJICAgYmVnaW4KCQkJZGF0YV9zZWwgPSBSRUdfUkRBVEE7CgkJCWluX3NpemVfNCA9IDEnYjE7CgkJCWlmKCFmaWZvX2Z1bGwpCgkJCSAgIGJlZ2luCgkJCQlmaWZvX3dlX2QgPSAxJ2IxOwoJCQkJaWYod3JpdGVfZG9uZSkJbmV4dF9zdGF0ZSA9IFdBSVRfSU5fREFUQTsKCQkJICAgZW5kCgkJICAgZW5kCQkgICAKCSAgIENMRUFSX0ZFQVRVUkVfUzoKCQkgICBiZWdpbgoJCQkvLyBqdXN0IGlnbm9yZSB0aGlzIGZvciBub3cKCQkJbmV4dF9zdGF0ZSA9IFNUQVRVU19JTjsKCQkgICBlbmQKCgkgICBTRVRfRkVBVFVSRV9TOgoJCSAgIGJlZ2luCgkJCS8vIGp1c3QgaWdub3JlIHRoaXMgZm9yIG5vdwoJCQluZXh0X3N0YXRlID0gU1RBVFVTX0lOOwoJCSAgIGVuZAoKCSAgIFNFVF9BRERSRVNTX1M6CgkJICAgYmVnaW4KCQkJLy8gZG9uZSBlbHNld2hlcmUgLi4uLgoJCQluZXh0X3N0YXRlID0gU1RBVFVTX0lOOwoJCSAgIGVuZAoKCSAgIEdFVF9ERVNDUklQVE9SX1M6CgkJICAgYmVnaW4KCQkJaWYoCXdWYWx1ZVsxNTo4XSA9PSA4J2gwMSB8CgkJCQl3VmFsdWVbMTU6OF0gPT0gOCdoMDIgfCAKCQkJCXdWYWx1ZVsxNTo4XSA9PSA4J2gwMwkpCgkJCQlyb21fc2VsID0gMSdiMTsKCQkJZWxzZQoJCQkJbmV4dF9zdGF0ZSA9IElETEU7CgoJCQlpZihyb21fZG9uZSkKCQkJCW5leHRfc3RhdGUgPSBJRExFOwoJCSAgIGVuZAoKCSAgIFNFVF9ERVNDUklQVE9SX1M6CgkJICAgYmVnaW4KCQkJLy8gVGhpcyBkb2Vzbid0IGRvIGFueXRoaW5nIHNpbmNlIHdlIGRvIG5vdCBzdXBwb3J0CgkJCS8vIHNldHRpbmcgdGhlIGRlc2NyaXB0b3IKCQkJbmV4dF9zdGF0ZSA9IElETEU7CgkJICAgZW5kCgoJICAgR0VUX0NPTkZJR19TOgoJCSAgIGJlZ2luCgkJCS8vIFNlbmQgb25lIGJ5dGUgYmFjayB0aGF0IGluZGljYXRlcyBjdXJyZW50IHN0YXR1cwoJCQlpbl9zaXplXzEgPSAxJ2IxOwoJCQlkYXRhX3NlbCA9IENPTkZJR19EQVRBOwoJCQlpZighZmlmb19mdWxsKQoJCQkgICBiZWdpbgoJCQkJZmlmb193ZV9kID0gMSdiMTsKCQkJCW5leHRfc3RhdGUgPSBXQUlUX0lOX0RBVEE7CgkJCSAgIGVuZAoJCSAgIGVuZAoKCSAgIFNFVF9DT05GSUdfUzoKCQkgICBiZWdpbgoJCQkvLyBkb25lIGVsc2V3aGVyZSAuLi4uCgkJCW5leHRfc3RhdGUgPSBTVEFUVVNfSU47CgkJICAgZW5kCgoJICAgR0VUX0lOVEVSRkFDRV9TOgoJCSAgIGJlZ2luCgkJCS8vIFJldHVybiBpbnRlcmZhY2UgJzAnCgkJCWluX3NpemVfMSA9IDEnYjE7CgkJCWlmKCFmaWZvX2Z1bGwpCgkJCSAgIGJlZ2luCgkJCQlmaWZvX3dlX2QgPSAxJ2IxOwoJCQkJbmV4dF9zdGF0ZSA9IFdBSVRfSU5fREFUQTsKCQkJICAgZW5kCgkJICAgZW5kCgoJICAgU0VUX0lOVEVSRkFDRV9TOgoJCSAgIGJlZ2luCgkJCS8vIGp1c3QgaWdub3JlIHRoaXMgZm9yIG5vdwoJCQluZXh0X3N0YXRlID0gU1RBVFVTX0lOOwoJCSAgIGVuZAoKCSAgIFNZTkNIX0ZSQU1FX1M6CgkJICAgYmVnaW4KCQkJLy8gUmV0dXJuIEZyYW1lIGN1cnJlbnQgZnJhbWUgbnVtYmVyCgkJCWRhdGFfc2VsID0gU1lOQ19GUkFNRV9EQVRBOwoJCQlpbl9zaXplXzIgPSAxJ2IxOwoJCQlpZighZmlmb19mdWxsKQoJCQkgICBiZWdpbgoJCQkJZmlmb193ZV9kID0gMSdiMTsKCQkJCWlmKHdyaXRlX2RvbmUpCW5leHRfc3RhdGUgPSBXQUlUX0lOX0RBVEE7CgkJCSAgIGVuZAoJCSAgIGVuZAoKCSAgIFZfU0VUX0lOVF9TOgoJCSAgIGJlZ2luCgkJCS8vIGRvbmUgZWxzZXdoZXJlIC4uLi4KCQkJbmV4dF9zdGF0ZSA9IFNUQVRVU19JTjsKCQkgICBlbmQKCgkgICBXQUlUX0lOX0RBVEE6CgkJICAgYmVnaW4KCQkJaWYoY3RybF9pbikJbmV4dF9zdGF0ZSA9IFNUQVRVU19PVVQ7CgkJICAgZW5kCgoJICAgU1RBVFVTX0lOOgoJCSAgIGJlZ2luCgkJCWluX3NpemVfMCA9IDEnYjE7CgkJCWlmKGN0cmxfaW4pCW5leHRfc3RhdGUgPSBJRExFOwoJCSAgIGVuZAoKCSAgIFNUQVRVU19PVVQ6CgkJICAgYmVnaW4KCQkJaWYoY3RybF9vdXQpCW5leHRfc3RhdGUgPSBJRExFOwoJCSAgIGVuZAoJZW5kY2FzZQogICBlbmQKCmVuZG1vZHVsZQoK